一、Android binder是什么?
-
Android平台上的一种跨进程通信(IPC)机制
-
从OpenBinder演化而来
-
从Android应用层角度来说,Binder是客户端和服务端进行通信的媒介
二、IPC原理
每个Android进程,只能运行在自己的进程所拥有的虚拟地址空间
Client进程与Server进程通信,利用进程间可共享的内核空间来完成底层通信工作
三、Android C/S通信机制
- Server是Service的提供者,提供的Service需要在Server Manager进行注册;Server可以注册一个或多个Service
- Client是Service的使用者,使用前需要向Server Manager申请服务
- Client获取到Service后,可以调用Server服务了
四、Binder通信模型
1. 注册服务
-
首先Server在自己的进程向Binder驱动申请创建Service的Binder实体
-
Binder驱动为这个Service创建位于内核的Binder实体节点和Binder引用
-
Server通过Binder驱动将Server名字和Service的Binder引用打包发送给ServiceManager
-
ServiceManager收到数据包后,取出Service的名字额引用,写入一张查找表
2.获取服务
- Client利用hanle为0的应用找到ServiceManager
- 向ServiceManage发送XXXService的访问申请
- ServiceManager从请求包中获取XXXService的名字,在查找表中找到对应的条目,取出对应的Binder引用
- ServiceManager将XXXService的Binder引用回复给Client
3.使用服务
-
Client和Server既是发送方,又是接收方
-
发送方通过自身的Binder实体进行发送操作,把数据通过接收方的Binder引用发送给接收方
-
Binder驱动会处理这个发送请求,利用内核空间进程共享的机制:
(1) 把发送方的数据写入缓存(binder_write_read.write_buffer)(对于接收方来说为读缓存区)
(2) 接收方之前一直在阻塞状态中,当写缓存有数据,则会读取数据,执行命令操作
(3) 接收方执行完后,会把返回结果同样采用写入缓存区(对于发送方为读缓存区)
五、Binder机制的关键概念
- Binder实体对象:Binder服务的提供者,类型是BBinder,也称为BBinder对象
- Binder引用对象:Binder实体对象在客户端进程的代表,类型是BpBinder,也称BpBinder对象
- Binder代理对象:代理对象也称接口对象,主要是为客户端的上层服务提供接口服务,类型是IInterface;Android将Binder的引用对象和代理对象分开的好处是一个Binder引用对象可以有多个代理对象,方便应用层使用
- IBinder对象:实体对象和引用对象的统称,因为BBinder和BpBinder都继承自IBinder
代理对象,方便应用层使用
4. IBinder对象:实体对象和引用对象的统称,因为BBinder和BpBinder都继承自IBinder