什么是Binder
Binder 是 Android 系统中跨进程通信(IPC)的核心机制
,它允许不同进程(如 App 进程和系统服务进程)之间安全、高效地传递数据和调用方法。简单来说,Binder 是 Android 的“通信桥梁”,负责协调进程间的交互
Binder的组成
组件 | 作用 |
---|
Binder驱动 | 位于 Linux 内核层,负责进程间通信的底层调度(如线程管理、数据传输) |
Service Manager | 系统核心服务的管理者,负责注册和查找 Binder 服务 |
Binder 客户端(Proxy | 客户端:通过代理对象(Proxy)发起远程调用 |
Binder服务端(Stub) | 服务端:通过存根对象(Stub)接收请求并处理 |
用 快递系统
理解 Binder
对应角色
场景 | Binder组件 | 作用 |
---|
寄件人 | 客户端(Client) | 发起请求(寄送包裹) |
收件人 | 服务端(Server) | 处理请求(接收并处理包裹)) |
快递公司 | Binder 驱动 | 调度包裹传输,确保数据安全送达 |
包裹 | 数据(Parcel)) | 需要传递的请求参数或结果 |
快递单号 | Binder 引用(IBinder)) | 唯一标识服务端地址,确保包裹不送错 |
快递客服中心 | Service Manager | 记录所有收件人地址(服务注册与查找) |
包裹 | 服务端(Server) | 处理请求(接收并处理包裹) |
实名认证 | UID/PID 权限验证 | 确保只有授权客户可以寄送特定包裹 |
直达运输专线 | 内存映射(mmap)) | 包裹直达收件人,无需多次中转(一次拷贝) |
工作流程
1.服务注册
- 快递:收件人(服务端)在快递公司登记地址
- Binder:服务端通过 Service Manager 注册服务
2.查找服务
- 快递:寄件人(客户端)打电话给快递客服中心,询问收件人地址
- Binder:客户端通过 Service Manager 查找服务,获取 Binder 引用
3.打包数据
- 快递:寄件人将文件装进包裹,贴上快递单号
- Binder:客户端将数据写入 Parcel 对象,绑定 Binder 引用。
4.发起请求
- 快递:包裹交给快递公司(Binder 驱动),走直达专线(mmap)
- Binder:transact() 触发数据传输,驱动通过内存映射直接传递数据(仅一次拷贝)
5.Binder 驱动处理
- 快递:包裹交给快递公司(Binder 驱动),走直达专线(mmap)
- Binder:transact() 触发数据传输,驱动通过内存映射直接传递数据(仅一次拷贝)
6.服务端工作
- 快递:收件人拆开包裹,处理文件(如盖章签字),将结果放回包裹。
- Binder:服务端在 onTransact() 中处理请求,将结果写入 Parcel
7.结果回调
- 快递:收件人通过原物流专线将结果包裹送回寄件人
- Binder:驱动将结果返回客户端的 transact() 方法
总结
- 直达专线(mmap)确保包裹(数据)快速直达
- 实名认证(UID/PID)和密封包裹(内核隔离)保障安全
- 客服中心(Service Manager)帮你找到正确的收件地址(服务引用)