android 进程间通信---bind的前世
在分析bind机制之前,我发现已经有一篇文章讲解的非常清晰,并且提出了很多问题。
地址:http://my.oschina.net/keeponmoving/blog/64218
如下是详细说明Binder。
1. binder的结构
binder是解决ipc和rpc的工具。android使用的是linux os,支持多进程和多线程。同时,对于java app,一个vm占用一个进程。做为完善的开发框架,android必须支持ipc。binder就是解决ipc问题的途径,更进一步,binde还支持rpc。
进程有自己的地址空间,不同进程间的通信并不能直接引用地址。一般的解决途径是,发送进程把需要传送的数据按照一定格式(marshall)转换成二进制形式/特定格式的数据,发往接收进程;接收进程收到二进制形式、特定格式的数据后,反转换(unmarshall)成原文数据,然后使用。binder使用的就是这种步骤。
binder使用的是同步c/s模型,s循环阻塞在接收数据操作上,随时处理c的数据,处理后发送回c;c则将请求服务的数据发送到s,阻塞在收取s返回数据,收到数据后,继续自己的工作。
binder的框架可以分成3层,
最下层是linux os和binder driver。binder driver本质上是进程间的共享内存,各进程将要发送到其它进程的数据写入到driver,从driver读取其它进程发送来的数据。
中间层是cpp实现的framework,完成数据的接收发送转换,和c/s流程的支持。
其实到中间层,binder的架构就已经完全具备了。但android使用的是java做为一般app的开发语言。所以还需要jni和相应java binder类的支持,这就是中间层上面的第三层:jni/java
假设c,s都是java实现,app ipc一般的情景是这样的, app client 收集ipc的数据,穿过jni,加工下传,经framework,写入driver。数据经driver上传,反加工经framework,穿过jni,上传到app server。
对于rpc的支持,需要一点点技巧,直接传递函数指针是无法使用的。为了是叙述的方便,先澄清一对概念:本地local和远端remote。定义rpc函数的进程称作本地,调用rpc函数的进程称作远端。rpc的实现实际上是远端定义一个rpc的proxy,远端将proxy想做rpc在本地的实现,貌似本地函数操作一般使用。而这个proxy实际上仅仅是将自己登记在本地的handle和入口参数发送本地,本地根据handle,知晓是哪个远端进程的proxy,调用函数,给定入口参数,执行完毕后,将出口参数再返回远端的proxy(因为我们有handle了)。binder的实现中handle和本地函数的对应关系是保存在driver中管理的。
2. binder driver
binder driver是binder机制的基础,是实现ipc的通道。
binder driver与framework和app的功能操作是用ioctl方式实现的。最基本的操作是数据读写操作。一次读写操作有两个子操作组成:写子操作和读子操作。driver为每个进程和线程维护了一个数据结构,其中有一个list,挂接了其它进程写入的数据,还有一个信号量。写子操作负责将数据挂接到接收进程对应数据结构的list上。读子操作负责处理自己进程中list上的数据,传回framework和app。
binder driver的第二个功能是为了支持rpc,就是维护本地函数和远端proxy的handle之间的对应关系。更复杂的是维护两个远端Proxy的handle之间的对应关系,这两个proxy是同一rpc的proxy。
3. binder framework
binder的framework是cpp实现的,这里分成本地local/s和远端remote/c两半来描述。 公共类IBinder派生出两个子类,BBinder用于local,BpBinder用于remote。 本地实现的类以BBinder为基类派生,接收数据后,处理,并将结构发会远端。 远端proxy的类使用BpBinder,接收和发送数据到本地。 进一步方便开发,引入了IInterface类,开发者从Interface派生子类,定义自己需要的rpc操作。
在IInterface的装饰下,从BBinder派生出了本地的关键类 BnInterface<INTERFACE>;从BpRefBase派生出了包含成员BpBinder对象的远端关键类BpInterface<INTERFACE>。
于是,创世纪中,神说:‘要有光’,就有了光。神看光是好的,就把光暗分开了。 神称光为昼,称暗为夜。有晚上,有早晨,这是头一日。
4. binder jni,java类和aidl工具
binder framework的机制要被java使用,需要经过包装。除了jni相关部分,android在java中还定义了几个相关的接口和类,IBinder,Binder,BinderProxy,IInterface,BinderInternal。
aidl工具则是方便java实现c/s结构的一个工具,开发者编写简单的接口描述idl文件,则aidl自动生成local和remote的Binder类。让开发者关注在实际的功能开发上,不必为binder机制耗费无谓的精力。
5. parcel是什么
为了便于ipc之间传递的数据的操作,binder引入了parcel的概念。parcel可以想成快递公司的包装箱,需要传递的各种类型的数据都被打包进parcel类,binder负责传递parcel对象,接收端则从parcel解出数据。这样的机制即减少了各种数据类型对传递的复杂性,又可以通过增加打包/解包parcel的数据类型,轻易实现扩展。
parcel已经支持容纳基本数据类型和一些复合数据类型。 在framework层面,parcel提供了Flattenable基类,可以扩展parcel容纳的数据类型。 在java parcel层面,parcel提供了Parcelable接口,可以扩展parcel容纳的数据类型。
6. 依赖于binder的service
ipc/rpc已经被binder机制解决掉了,那么service面临的唯一问题就是service如何让想使用service的client招到service。解决的方案就是 service manager。service manager是一个特殊进程,每个service都会注册登记到service manager中,而client可以从service manager查询得到自己需要使用的service。
android 进程间通信---bind的前世的更多相关文章
- Android 进程间通信——AIDL
代码地址如下:http://www.demodashi.com/demo/12321.html 原文地址:http://blog.csdn.net/vnanyesheshou/article/deta ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信 ...
- Android 进程间通信
什么鬼!单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能?没道理啊!排查半天,发现这两就不在一个进程里,才恍然大悟-- 什么是进程 按照操作系统中的描述:进程一般指一个执行单元,在 PC ...
- [转]Android进程间通信
Android进程间通信 一.Linux系统进程间通信有哪些方式? 1.socket: 2.name pipe命名管道: 3.message queue消息队列: 4.singal信号量: 5.sha ...
- Android进程间通信-AIDL实现原理
Android进程间通信基于Proxy(代理)与Stub(桩或存根)的设计模式(如图1-1所示).其中,Proxy将特殊性接口转换成通用性接口,Stub将通用性接口转换成特殊性接口,二者之间的数据转换 ...
- android进程间通信:使用AIDL
android 的binder其实是基于 openbinder实现的,openbinder的地址:http://www.angryredplanet.com/~hackbod/openbinder/d ...
- Android进程间通信(一):AIDL使用详解
一.概述 AIDL是Android Interface Definition Language的缩写,即Android接口定义语言.它是Android的进程间通信比较常用的一种方式. Android中 ...
- Android进程间通信IPC
一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...
- Android 进程间通信——Service、Messenger
概述 介绍绑定服务端的三种方式:同一进程绑定服务.跨进程绑定服务(Messenger).跨进程绑定服务(aidl). 重点说一下通过Messenger.Service实现的进程间通信. 详细 代码下载 ...
随机推荐
- 浅谈DOM性能考虑
浅谈DOM性能考虑 很多人都会忽视脚本对Web应用整体性能的影响.为保证应用的流畅运行,在为文档编写和应用脚本时,需要注意一些问题.一.尽量减少访问DOM和尽量减少标记 访问DOM的方式对脚本性 ...
- .Net魔法堂:史上最全的ActiveX开发教程——部署篇
一.前言 接<.Net魔法堂:史上最全的ActiveX开发教程——发布篇>,后我们继续来部署吧! 二. 挽起衣袖来部署 ActiveX的部署其实就是客户端安装ActiveX组件,对未签 ...
- BZOJ1087状压DP 解题报告
1087: [SCOI2005]互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的 ...
- [Architect] Abp 框架原理解析(4) Validation
本节目录 介绍 DataAnnotations ICustomValidate IShouldNormalize 实现Abp Validation 介绍 Abp中在Application层集成了val ...
- MVC。Action方法,常用的返回类型有几种?
常用的: 1,string,直接返回响应报文字符串 public ActionResult test(){return "哈哈";}2.ViewResult,ActionResul ...
- .Net一般处理程序来实现用户名的验证
一般处理程序 在说一般处理程序之前,先来看看什么是aspx.在vs中,使用的大多是aspx页面.aspx页面就是在接收到一个请求之后,将返回的结果生成一个html页面返回给服务器.当我们有时候需要自己 ...
- 人民币大写金额转换C#方法
方法的代码如下: /// <summary> /// 人民币大写 /// </summary> /// <param name="input"> ...
- AC自动机(1)
Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). ...
- ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
1.ExecutorService: 是一个接口,继承了Executor: public interface ExecutorService extends Executor { } 2.Execut ...
- 【poj 3461】Oulipo(字符串--KMP)
题意:求子串在文本串中出现了多少次. 解法:使用KMP的next[ ]和tend[ ]数组计数. #include<cstdio> #include<cstdlib> #inc ...