1.1 Android系统使用的一些IPC机制
信号机制(进程管理)
Socket通信(调试)
DBUS(蓝牙)
共享内存(匿名共享内存Ashmem)
Binder
1.2 Binder由来
Binder是一个分布式的组件架构,它类似于COM和CORBA。最初用于构建传统的操作系统BeOS的系统级消息传递机制的,在BeOS退出历史舞台之后,又被Palm收购用于Palm OS。
有一个openBinder的开源项目 :
http://www.angryredplanet.com/~hackbod/openbinder/docs/html/index.html (C++实现)
1.3 Binder的特点
(1)Binder是一种同步的通信方式。
(2)传输的数据都是采用函数参数的形式进行的
(3)高性能,使用ioctl来进行通信,会绕开文件系统缓冲,达到实时交互的目的
(4)安全,以进程为单位进行通信,进程运行时的uid/gid也会在Binder通信时被用于权限判断
1.4 Android Binder
Android Binder 使用了Binder的原理,但因为协议以及OpenBinder的设计过于复杂的缘故,没有使用openBinder的代码,而是自己去重新实现了更轻量的版本。openBinder使用(MPL),Android使用Apache2.0协议。
Android选择Binder的原因:
(1)binder的特点
(2)Binder对硬件要求很低,这正好符合android的实际情况
(3)Binder经历过产品化的考验(Palm OS Cobalt),并且对多个操作系统平台都可以提供支持
(4)Binder的作者(Dianne Hackborn)跳槽去了google,并且参与到了android的开发
1.5 原理简单介绍
Binder构建于Linux内核里的一个叫binder的驱动之上,系统里所有涉及Binder通信的部分,都通过与/dev/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)Sevice Manager是Binder机制的守护进程,用来管理各种Server,并向Client提供查询远程接口的功能。它本身也是一个Server,但是一个特殊的Server,其ID号固定为0。
Service Manager开启的时候会完成:打开Binder设备、告诉Binder自己是守护进程、进入一个无穷循环,充当一个Server,等待Client的请求。(代码位于:frameworks\base\cmds\servicemanager)