详细图解 Android vndBinder

详细图解 Android vndBinder

注意:本文基于 Android 8.1 进行分析
Qidi 2020.07.03 (Markdown & Haroopad)


【前言】
图虽然是根据 vndBinder 的类关系和调用顺序画出的,但实际上对于 Binder 和 hwBinder 也适用。

Binder driver 代码十分庞杂,基于安全考虑还存在与 LSM 的交互,所以这部分的调用关系图有所省略。


【Binder 通信概要】
如果说 Binder 通信机制是 Android 的心脏(数据流动好似血液循环),那么 ServiceManager 进程就是 Binder 通信的核心。在 user-space 空间,ServiceManager 必须在任何 Binder 请求来临前启动。
详细图解 Android vndBinder


【Binder 类关系】
Binder 机制的框架已经非常稳固,我们只需编写 *.hal 文件,在其中将自定义服务的接口描述清楚,再分别实现 Bp 和 Bn 端就可以了。
详细图解 Android vndBinder


【ServiceManager 启动】
ServiceManager 是一个独立进程,根据/frameworks/native/cmds/servicemanager/servicemanager.rc配置,在设备上电时,它会随 system 组一起启动。
详细图解 Android vndBinder


【获取 ServiceManager】
在你自己的进程中调用 IServiceManager::defaultServiceManager() 即可获得 IServiceManager Bp端实例。
详细图解 Android vndBinder


【注册(添加)vndBinder 服务】
获得 IServiceManager Bp端实例后,调用 addService(name, yourServiceInstance) 即可实现注册。
详细图解 Android vndBinder


【查询(获取)vndBinder 服务】
获得 IServiceManager Bp端实例后,调用 getService(name) 即可获取目标 Binder 服务的 Bp端实例。
详细图解 Android vndBinder


【vndBinder 跨进程调用】
vndBinder 跨进程调用的逻辑与 addService() 和 getService() 酷似,区别只在于传入的 Command Code 不同,以及 Binder 驱动中执行的 switch…case… 也相应不同。略。