什么是Binder
Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中重要的特征之一。Android中的四大组件Activity、Service、Broadcast、ContentProvider,不同的App都运行在不同的进程中,它是这些进程间通讯的桥梁。正如其名“粘合剂”一样,它把系统中各个组件粘合到一起,是各个组件的桥梁。
IPC原理
IPC通信指的是两个进程之间交换数据,如图中的Client进程和Server进程。
Android为每个进程提供了虚拟内存空间,而每个Android进程只能运行在自己进程所拥有的虚拟内存空间。
内存空间又分为用户空间和内核空间,前者的数据不能进程间共享,但是后者可以。图中的Client进程和Server进程就是利用了进程间可以共享各自内核空间的数据,来完成底层通讯的工作。
Android的C/S通信机制
C/S通信指的就是Client和Server两个进程的通信,但实际通信时除了包含这两个进程,还有一个Service Manager,它用于管理各种服务。
这些服务通常是Android系统的核心功能模块,例如传感器管理、电源管理、WIFI管理、闹钟服务等,与Android四大组件中的服务不同。
当一个Server(服务端)想要提供一种服务,首先需要在Service Manager注册该服务。
而当Client(客户端)想要使用Server中的服务时,不能直接访问,而是要从Service Manager获取该服务,才能使用Server所提供的服务,来与Server进行通信。
Binder通信模块
引入Binder通信后,客户端、服务端和Service Manager之间不能通过API直接互相访问,而是与内核空间的Binder驱动通过ioctl方式来完成进程间的数据交换。
关键概念
- Binder实体对象:Binder服务的提供者,类型是BBinder,位于服务端。
- Binder引用对象:Binder实体对象在客户端进程的代表,类型是BpBinder,位于客户端。
- IBinder对象:Binder实体对象和引用对象的统称,也是他们的父类。
- Binder代理对象:又称接口对象,为客户端的上层应用提供接口服务,类型是IInterface。
Binder引用对象和代理对象都是服务端进程中的,把它们分离的好处是一个引用对象可以有多个代理对象,方便上层应用使用。
通讯过程
注册服务
- Server进程向Binder驱动申请创建服务的Binder实体。
- Binder驱动为这个服务创建位于内核的Binder实体和Binder引用。
- 创建完成后,服务端通过Binder驱动将Binder引用发送给Service Manager。
- Service Manager收到数据后,取出被创建服务的名字和引用,填入一张查找表。
通过以上步骤,Server进程通过Binder驱动完成了在Service Manager的服务注册。
在注册服务的过程中,Server进程是客户端,而Service Manager是服务端。
获取服务
- Client进程利用Handle值为0的引用找到Service Manager。
- Client进程向Service Manager发送xxxService的访问申请。
- Service Manager从请求表中获取xxxService的名字,在查找表中找到对应的条目,取出对应的Binder引用。
- Service Manager把xxxService的Binder引用传给Client进程。