1. HIDL 概述
在 Andoird 8.0 版本框架代码中,加入了 HIDL(HAL 接口定义语言),HIDL 的出现是为了将用户层和 HAL 层分割开,它指定了 HAL 和用户之间的接口,让用户能够替换 Android 框架,而无需重新编译 HAL,以便让厂商能够以更低的成本、更快速地将设备更新到新版 Android 版本中。
通俗的来说,HIDL 设计了一套通过的框架接口,将 HAL 层实现与 Android 操作系统框架分离开来,设备厂商只需要构建一次 HAL,并将其放置在 /vendor 分区中,便能适应大部分 Android 操作系统框架版本的升级。
图:HIDL 设计下的升级方式
在 HIDL 设计理念中,HAL 模块以一个独立的 Service 运行,用户通过 Binder IPC 与 HAL 模块进行通信。因此 在 Android 8.0 以上的版本中查看用户进程会发现很多 HAL 模块 Service 运行,如下:
consule:/ $ ps -A | grep android.hardware
system 219 1 9728 4852 0 0 S android.hardware.keymaster@3.0-service
audioserver 235 1 21268 8916 0 0 S android.hardware.audio@2.0-service
bluetooth 236 1 7716 3408 0 0 S android.hardware.bluetooth@1.0-service
cameraserver 237 1 28412 11948 0 0 S android.hardware.camera.provider@2.4-service
media 238 1 10232 4312 0 0 S android.hardware.cas@1.0-service
system 239 1 9976 3648 0 0 S android.hardware.configstore@1.1-service
这些 Service 提供了设备 HAL 模块具体接口实现(由 HIDL 主导设计),这些接口独立于 Android 平台与设备厂商 HAL 实现。下面会主要以 HIDL 设计下 Android 9.0 composer HAL 实现来插入分析。
2. HIDL 设计分析
HIDL 是一种接口定义语言,描述了 HAL 和它的用户之间的接口,因此首先需要设计一套通用接口实现。HIDL 为每个 HAL 模块设计了不同接口定义 hal 文件,以 .hal 结尾,在 hidl-gen 工具的帮助下即可自动编译生成对应接口 C++ 实现或者 Java 实现。
下面先来理清几个概念。
2.1 软件包
Google 为每个 HAL 模块设计一个接口软件包,大部分 HIDL 接口软件包位于 hardware/interfaces 下,hardware/interfaces 顶层会直接映射到 android.hardware 软件包命名空间,软件包名称可以具有子级,表示接口软件包的版本,如 HAL Service:android.hardware.graphics.composer@2.1-service 的接口软件包可以在 hardware/interfaces/graphics/composer/2.1 目录下找到。
下表列出了 Android 所有软件包前缀和位置:
软件包前缀 | 位置 |
---|---|
android.hardware.* |