碰到研究过 Android 进程间通信的朋友,我通常喜欢请教 Binder 相关的问题。但是,太细节的问题有点吹毛求疵了,对于本质的理解是我期望的。标题的问题通常是我最喜欢问的一个。

Android 8.0 以后的版本中,Binder有哪几种?它们都是怎么使用的?

IPC 域说明
/dev/binder框架/应用进程之间的 IPC,使用 AIDL 接口
/dev/hwbinder框架/供应商进程之间的 IPC,使用 HIDL 接口 供应商进程之间的 IPC,使用 HIDL 接口
/dev/vndbinder供应商/供应商进程之间的 IPC,使用 AIDL 接口

为什么会存在这三种 Binder?

Android 8.0 重新设计了 Android 系统框架,引入 Treble 机制。在新的架构中,引入了 HAL 接口定义语言(HIDL),提供了独立的供应商分区(vendor),以及供应商原生开发套件 (VNDK)。通过这些新技术,可以将系统框架与供应商实现分隔开来,使得用户可以独立替换分区镜像,以便制造商能够更轻松、更快速地更新 Android 系统。

Treble 的引进,使得 system 和 vendor 分区间无法直接访问,导致原有的 Binder 机制不能继续使用。因此将 Binder 拆分为 Binder、HwBinder 和 VndBinder,用于在 system/system、system/vendor 和 vendor/vendor 之间进行进程间通信。三种 Binder 的使用如下图所示,

![]

三种 Binder 使用的资源有什么不同?

这个问题的答案已经在上图中,可以归结为以下几点:

Device nodeBinder LibraryServiceInterface Language
Binder/dev/binderlibbinderservicemanagerAIDL
HwBinder/dev/hwbinderlibhwbinderhwservicemanagerHIDL
VndBinder/dev/vndbinderlibbindervndservicemanagerAIDL

为什么会引入 HwBinder?

HwBinder 引入的本质还是 Treble 机制的使用,这使得 system 和 vendor 分区相互隔离。在 Android 8.0 之前,Android HAL 与系统框架是紧耦合的,它们打包在一个镜像里。HAL只是一个个的so库,framework 通过打开动态库来调用 HAL。 为了适配 HwBinder,Android 8.0 同时引入了 HIDL,用于建立 framework 和 HAL 间的通信。

经过这个改变后,HAL 可以同时服务于 system 和 vendor。而 HAL 的实现位于 vendor 分区,通过 HwBinder 可以确保 system 和 vendor 独立升级,而不会影响 HAL 的调用。

三种 Binder 在驱动实现上有什么不同?

三种 Binder 除了设备节点不同以外,驱动实现是相同的。

参考文档:

使用 Binder IPC

Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要


戈壁老王
143 声望64 粉丝

做为一个不称职的老年码农,一直疏忽整理笔记,开博记录一下,用来丰富老年生活,