详细图解 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_第1张图片


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


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


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


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


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


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

你可能感兴趣的:(嵌入式,Android,C++)