关于Binder的叙述网上铺天盖地,我写它干嘛呢?唉,谁知道啊。。。

概念:
Binder:即指整个Binder架构,也特指一个Binder接口的实现;
Binder Object:一个实现了Binder接口的类的实例;
Binder protocol:Binder中间件与Binder驱动通讯的协议;
IBinder Interface:由AIDL语言定义的一些列方法、属性、事件集;
Binder Token:一个Binder的唯一数字标识;
link to death:一个Binder属性,通过它可以把一个binder或是进程已经终止的消息发送给其它进程(例如:window manager);

binder架构是一个C/S模型,client(a process)通过一个代理向server(another process)发消息,而server使用线程池响应到来的请求;
携带数据的进程间通讯被称为transaction,一个transaction包括request和reply两个消息;
从oo的角度看transaction携带的数据被称为parcel,任何可以传递到远程服务的对象都必须实现parcelable接口,而且必须实现在发送端序列化数据,并且在接收端恢复数据的方法,所有数据必须都是基础类型;
数字标识为0的Binder被称为service manager,client(process)可以通过服务的名字向service manager查询服务地址;

实现:
从AIDL(android接口描述语言)说起,它是sdk的一部分。AIDL文件定义带有远程服务的方法签名的接口,AIDL解析器通过解析这个接口生成java类,俩目的,
一是产生代理类用于client与远程服务通信,二是生成stub类封装远程服务方法。aidl会产生相应的代码负责把数据写入parcel发送,以及读取返回数据。
Binder的实现主要包括三层,java层、中间层和内核驱动。
java层主要的作用是向下封装中间层,它还有个作用就是给binder框架引入了intent这个机制。
中间层,c++实现,所有的用户空间的binder框架机制都是在这里实现的,如进程和线程控制,为新的请求孵化新的线程,数据封包传送等,中间件与binder内核通信并且实现共享内存。
内核驱动层是Binder框架的核心,支持open, mmap, release, poll,ioctl系统调用,open打开一个到binder驱动的链接,release关闭链接,mmap映射binder内存,ioctl调用最为关键
通过它完成上层的提交、接收的所有信息,ioctl将携带相应的binder驱动命令进行操作。在数据传递中binder驱动使用copy_from_user内核命令从用户空间拷贝数据到内核,
再用copy_to_user命令从内核拷贝到目标进程的内存空间。

posted on 2013-03-06 15:23  sanhai  阅读(155)  评论(0编辑  收藏  举报