Android进程间通信(IPC)机制Binder简介和学习计划
在Android系统,每个应用程序是由多个Activity和Service部件,这些Activity和Service有可能在相同的处理被执行,此外,还可以在不同的过程中进行。
然后。不是在同一个过程Activity或者Service是怎样通信的呢?这就是本文中要介绍的Binder进程间通信机制了。
我们知道,Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。
有传统的管道(Pipe)、信号(Signal)和跟踪(Trace)。这三项通信手段仅仅能用于父进程与子进程之间,或者兄弟进程之间。后来又添加了命令管道(Named Pipe)。使得进程间通信不再局限于父子进程或者兄弟进程之间;为了更好地支持商业应用中的事务处理,在AT&T的Unix系统V中。又添加了三种称为“System V IPC”的进程间通信机制。各自是报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)。后来BSD Unix对“System V IPC”机制进行了重要的扩充。提供了一种称为插口(Socket)的进程间通信机制。若想进一步具体了解这些进程间通信机制,建议參考Android学习启动篇一文中提到《Linux内核源码情景分析》一书。
可是。Android系统没有採用上述提到的各种进程间通信机制。而是採用Binder机制,难道是由于考虑到了移动设备硬件性能较差、内存较低的特点?不得而知。
Binder事实上也不是Android提出来的一套新的进程间通信机制。它是基于OpenBinder来实现的。OpenBinder最先是由Be Inc.开发的,接着Palm Inc.也跟着使用。如今OpenBinder的作者Dianne Hackborn就是在Google工作。负责Android平台的开发工作。
前面一再提到,Binder是一种进程间通信机制,它是一种相似于COM和CORBA分布式组件架构,通俗一点,事实上是提供远程过程调用(RPC)功能。从英文字面上意思看,Binder具有粘结剂的意思,那么它把什么东西粘结在一起呢?在Android系统的Binder机制中。由一系统组件组成,各自是Client、Server、Service Manager和Binder驱动程序,当中Client、Server和Service Manager执行在用户空间,Binder驱动程序执行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,当中。核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能。Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。
Service Manager和Binder驱动已经在Android平台中实现好,开发人员仅仅要依照规范实现自己的Client和Server组件就行了。说起来简单,做起难,对刚開始学习的人来说,Android系统的Binder机制是最难理解的了,而Binder机制不管从系统开发还是应用开发的角度来看。都是Android系统中最重要的组成。因此。非常有必要深入了解Binder的工作方式。要深入了解Binder的工作方式,最好的方式莫过于是阅读Binder相关的源码了,Linux的鼻祖Linus Torvalds以前曰过一句名言RTFSC:Read The Fucking Source Code。
虽说阅读Binder的源码是学习Binder机制的最好的方式。可是也绝不能打无准备之仗,由于Binder的相关源码是比較枯燥无味并且比較难以理解的,假设可以辅予一些理论知识,那就更好了。闲话少说,网上关于Binder机制的资料还是不少的,这里就不想再具体写一遍了。强烈推荐以下两篇文章:
Android深入浅出之Binder机制一文从情景出发。深入地介绍了Binder在用户空间的三个组件Client、Server和Service Manager的相互关系。Android Binder设计与实现一文则是具体地介绍了内核空间的Binder驱动程序的数据结构和设计原理。非常感谢这两位作者给我们带来这么好的Binder学习资料。总结一下。Android系统Binder机制中的四个组件Client、Server、Service Manager和Binder驱动程序的关系例如以下图所看到的:
1. Client、Server和Service Manager实如今用户空间中,Binder驱动程序实如今内核空间中
2. Binder驱动程序和Service Manager在Android平台中已经实现。开发人员仅仅须要在用户空间实现自己的Client和Server
3. Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信
4. Client和Server之间的进程间通信通过Binder驱动程序间接实现
5. Service Manager是一个守护进程。用来管理Server,并向Client提供查询Server接口的能力
至此。对Binder机制总算是有了一个感性的认识,但仍然感到不能非常好地从上到下贯穿整个IPC通信过程,于是。打算通过以下四个情景来分析Binder源码,以进一步理解Binder机制:
1. Service Manager是怎样成为一个守护进程的?即Service Manager是怎样告知Binder驱动程序它是Binder机制的上下文管理者。
2. Server和Client是怎样获得Service Manager接口的?即defaultServiceManager接口是怎样实现的。
4 Service Manager是怎样为Client提供服务的?即IServiceManager::getService接口是怎样实现的。
在接下来的四篇文章中,将依照这四个情景来分析Binder源码。都将会涉及到用户空间到内核空间的Binder相关源码。
这里为什么没有Client和Server是怎样进行进程间通信的情景呢? 这是由于Service Manager在作为守护进程的同一时候,它也充当Server角色。
因此。仅仅要我们可以理解第三和第四个情景,也就理解了Binder机制中Client和Server是怎样通过Binder驱动程序进行进程间通信的了。
为了方便描写叙述Android系统进程间通信Binder机制的原理和实现。在接下来的四篇文章中,我们都是基于C/C++语言来介绍Binder机制的实现的,可是,我们在Android系统开发应用程序时。都是基于Java语言的,因此。我们会在最后一篇文章中。具体介绍Android系统进程间通信Binder机制在应用程序框架层的Java接口实现:
5. Android系统进程间通信Binder机制在应用程序框架层的Java接口源码分析。
新浪微博罗:http://weibo.com/shengyangluo,欢迎关注!
Android进程间通信(IPC)机制Binder简介和学习计划的更多相关文章
- [置顶] 深入理解android之IPC机制与Binder框架
[android之IPC机制与Binder框架] [Binder框架.Parcel.Proxy-Stub以及AIDL] Abstract [每个平台都会有自己一套跨进程的IPC机制,让不同进程里的两个 ...
- Android资源管理框架(Asset Manager)简介和学习计划
Android该应用程序包括两个部分组成的:代码和资源. 资源主要是与UI相关的东西,例如UI布局.和其他字符串和照片.代码和资源可以使独立的应用程序来组织的实际需求的基础上,在执行的时候UI.,就能 ...
- Android IPC机制—Binder的工作机制
进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...
- [转]Android进程间通信--消息机制及IPC机制实现
Android为了屏蔽进程的概念,利用不同的组件[Activity.Service]来表示进程之间的通信! 组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Servi ...
- Android之IPC机制
Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...
- IPC机制--Binder
文章来自 Android技术内幕 系统卷 转:http://www.linuxidc.com/Linux/2011-08/40508.htm 什么是IPC机制以及IPC机制的种类 在Linux中,是以 ...
- Android的IPC机制(一)——AIDL的使用
综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...
- Anciroid的IPC机制-Binder概述
在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...
- Android进程间通信IPC
一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...
随机推荐
- 14.3.2.1 Transaction Isolation Levels 事务隔离级别
14.3.2 InnoDB Transaction Model InnoDB 事务模型 14.3.2.1 Transaction Isolation Levels 事务隔离级别 14.3.2.2 au ...
- html name id, 与服务器交互必须有name
html name id, 与服务器交互必须有name 在HTML中元素的ID和Name的区别和联系. 今天写了个测试,在php脚本里怎么也获取不到$_POST['userName']的值,经检查在h ...
- extjs desktop startmenu (開始菜单)
extjs desktop 的開始菜单 二级菜单,仅仅是简单演示实现原理,如 须要动态生成,自己改造就可以,下面基本方法原理: 首先 建立一个js文件 生成開始菜单数据: function Get ...
- 使用HashMap须要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()
Map/HashMap是java中一种非经常常使用的数据结构,一般我们在应用中做的事情就是调用put向容器写入数据或者是get从容器读取数据. Map.entrySet()这种方法返回了键值对的集合, ...
- Android APP代码拨打电话、打开手机分享功能等隐式意图
Android APP拨打电话: Intent intent=new Intent(Intent.ACTION_DIAL,Uri.parse("tel:"+110)); start ...
- Java程序猿面试题集(181- 199)
Java面试题集(181-199) 摘要:这部分是包括了Java高级玩法的一些专题,对面试者和新入职的Java程序猿相信都会有帮助的. 181. 182. 183. 184. 185. 186. 1 ...
- 不知道的JavaScript
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目吸 ...
- Centos 6安装完美搭建mysql、php、apache之旅
安装apache [root@centos share]# yum -y install httpd Loaded plugins: fastestmirror, refresh-packagekit ...
- scala akka 修炼之路5(scala特质应用场景分析)
scala中特质定义:包括一些字段,行为(方法/函数/动作)和一些未实现的功能接口的集合,能够方便的实现扩展或混入到已有类或抽象类中. scala中特质(trait)是一个非常实用的特性,在程序设计中 ...
- Selenium执行测试脚本稳定性的一些经验分享交流
Selenium执行测试脚本稳定性的一些经验分享交流 公司的自动化WEB测试框架IATA已上线运行了一段时间,期间发现一些脚本稳定性的问题,与大家分享一下. CASE执行游览器:ie firefox ...