编程模型
Binder 是一种被 Android 广泛应用的 IPC 机制,但是它并不是基于原有的 Linux 的 IPC 机制实现的,而是通过一个 binder 内核模块来实现的。“Binder”的中文是“装订机”或者“黏合剂”,这说明它在中间沟通 IPC 中的 server 和 client 的作用。
虽然像 Socket 等 IPC 机制也会有类似 server 和 client 的分工,但是 binder 的抽象程度要更高,它可以直接让 client 使用 server 注册的函数(还是以面向对象的方式),而其他的 IPC 机制,还局限于传递数据。
工作流程
启动:
- Server 启动,将给 Client 提供的服务注册到 ServiceManager
- Server 创建一个
Stub对象,用于调用 Server 的服务 - Client 启动,并通过查询 ServiceManager 找到 Server 提供的服务
- Client 创建一个
Proxy对象,Client 如果想调用 Server 的服务,可以直接调用Proxy
调用:
- Client 通过
Proxy调用方法 Proxy将这个方法通过ioctl发送给/dev/binder驱动binder将方法转发给StubStub在 Server 侧开始进行处理
底层实现
在 IPC 时,Binder 采用的是以 mmap 为原理的“一次拷贝”流程。
即 Server 和 Client 都通过 mmap 与 kernel 共享地址空间,但是它们两个的共享地址空间并不相同,所以还需要由内核帮忙中转一次。