7.1 Binder机制概述
Binder是Android系统提供的一种IPC(进程间通信)机制。由于Android是基于Linux内核的,所以除了Binder以外,还存在其他的IPC机制,例如管道和socket等。Binder相对于其他IPC机制来说更加灵活和方便,其驱动代码保存在文件“kernel/drivers/staing/android/binder.c”中,另外该目录下还有一个binder.h头文件。Binder是一个虚拟设备,所以它的代码相比而言还算简单,读者只要有基本的Linux驱动开发方面的知识就能读懂。在“/proc/binder”目录下的内容,可以用来查看Binder设备的运行状况。
可以将Android系统看作是一个基于Binder通信的C/S架构,Binder就像网络一样把系统的各个部分连接在了一起。在基于Binder通信的C/S架构体系中,除了C/S架构所包括的Client端和Server端外,Android还有一个全局的Service Manager端,它的作用是管理系统中的各种服务(Service)。
在Android系统的Binder机制中,由Client、Server、Service Manager、Binder Driver 4个组件组成,具体关系如图7-1所示。
图7-1 Binder机制中的组件关系图
在Android系统中,Client、Server和ServiceManager三者之间的交互关系如下所示。
Client、Server和Service Manager在用户空间中实现,Binder驱动程序在内核空间中实现。
Server进程要先注册一些Service到Service Manager中,所以Server是Service Manager的客户端,而Service Manager就是服务端了。Service Manager是一个守护进程,能够管理Server并向Client提供查询Server接口。
如果某个Client进程要使用某个Service,必须先到Service Manager中获取该Service的相关信息,所以Client是Service Manager的客户端。另外,Client根据得到的Service信息与Service所在的Server进程建立通信的通路,然后就可以直接与Service交互了,所以Client也是Server的客户端。
Binder驱动程序提供设备文件“/dev/binder”与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信。
在Android平台中已经实现了Binder驱动程序和Service Manager,开发者只需要在用户空间实现自己的Client和Server即可。三者的交互都是基于Binder通信的,所以通过任意两者之间的关系,都可以获取Binder的奥秘。