文章目录
概览
因为Android 10开始不支持创建新的HIDL,所以后续从AIDL切入。
error: hardware/interfaces/hal/1.0/Android.bp:4:9: module "android.hardware.hal@1.0_interface": name: No more HIDL interfaces can be added to Android. Please use AIDL.
10:19:03 soong bootstrap failed with: exit status 1
HIDL
- HAL 接口定义语言或 HIDL 是一种接口描述语言 (IDL),用于指定 HAL 与其用户之间的接口。
- HIDL 全称是 Hardware Interface Definition Language。在 Android 8.0 中被全面使用。其诞生目的是:框架可以在无需重新构建 HAL 的情况下进行替换。
- HAL将由供应商或SOC 制造商构建,放置在设备的 /vendor 分区中,这样一来,框架就可以在其自己的分区中通过 OTA 进行替换,而无需重新编译 HAL。
- HIDL 允许指定类型和方法调用,收集到接口和包中。更广泛地说,HIDL 是一种用于在可以独立编译的代码库之间进行通信的系统。从 Android 10 开始,HIDL 已被弃用,Android 正在迁移以在任何地方使用AIDL 。
- HIDL 旨在用于进程间通信 (IPC)。使用 HDL 创建的 HALS 称为绑定 HAL,因为它们可以使用绑定程序进程间通信 (IPC) 调用与其他架构层进行通信。 Binderized HAL 在与使用它们的客户端不同的进程中运行。对于必须链接到进程的库,也可以使用直通模式(Java 中不支持)。
对于HIDL的理解
- 便于给硬件厂商定义一套规范标准
- 隔离FWK和BSP部分代码,BSP硬件部分改变引起的软件代码改变,不会影响标准接口。
HAL的类型
为了更好地实现模块化,Android 8.0 对 Android 操作系统底层进行了重新架构。运行 Android 8.0 的设备必须支持绑定式或直通式 HAL:
- 绑定式 HAL(Binder HAL): 以 HAL 接口定义语言 (HIDL) 表示的 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。
所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。(这个是趋势) - 直通式 HAL(Passthrough HAL)。以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。
通过 dlopen 方式加载库,也就是在同一进程直接调用。这里需要注意,默认情况下通常会使用 *Binder 化直通式 HAL *,也就是说最后仍然是跨进程 Binder 通信。
对于直通式和绑定式HAL类型的理解
- 直通模式仅适用于 C++ 客户端和实现。运行早期版本的 Android 的设备没有用 Java 编写的 HAL,因此 Java HAL 自然而然经过 Binder 化。
- 所以直通式HAL类型(JAVA中不支持)
HIDL 指定数据结构和方法签名,这些数据结构和方法签名以接口(类似于类)进行组织,这些接口被收集到包中。 HIDL 的语法对于 C++ 和 Java 程序员来说看起来很熟悉,但使用了一组不同的关键字。 HIDL 还使用 Java 样式的注释。
接口和软件包
HIDL 围绕接口构建而成,而接口是在面向对象的语言中用来定义行为的抽象类型。每个接口都是软件包的一部分。
软件包
软件包名称可以具有子级,如 package.subpackage。已发布的 HIDL 软件包的根目录为 hardware/interfaces 或 vendor/vendorName(例如,对于 Pixel 设备,根目录为 vendor/google)。软件包名称在根目录下形成一个或多个子目录;定义同一个软件包的所有文件都位于同一目录下。例如,您可以在 hardware/interfaces/example/extension/light/2.0 下找到 package android.hardware.example.extension.light@2.0。
下表列出了软件包前缀和位置:
软件包前缀 | 位置 | 接口类型 |
---|---|---|
android.hardware.* | hardware/interfaces/* | HAL |
android.frameworks.* | frameworks/hardware/interfaces/* | frameworks/ 相关 |
android.system.* | system/hardware/interfaces/* | system/ 相关 |
android.hidl.* | system/libhidl/transport/* | 核心 |
软件包目录中包含扩展名为 .hal 的文件。每个文件均必须包含一个指定文件所属的软件包和版本的 package 语句。types.hal 文件(如果存在)并不定义接口,而是定义软件包中每个接口可以访问的数据类型。
版本编号
软件包分版本,用两个整数表示: major.minor :
Major 版本不向后兼容 : 递增 Major 版本号将会使 Minor 版本号重置为 0 。
Minor 版本向后兼容 : 如果递增 Minor 版本号,则意味着较新版本完全向后兼容之前的版本。可以添加新的数据结构和方法,但不能更改现有的数据结构或方法签名。
可同时在一台设备上提供 HAL 的多个 Major 或 Minor 版本。不过 Minor 版本应优先于 Major 版本,因为与之前的 Minor 版本接口一起使用的客户端代码也适用于同一接口的后续 Minor 版本。
接口定义
导入
import android.hardware.nfc@1.0; // import a whole package
import android.hardware.example@1.0::IQuux; // import an interface and types.hal
import android.hardware.example@1.0::types; // import just types.hal
代码样式指南
### 接口哈希
### 服务和数据转移
### 快速消息队列
### 使用Binder IPC
### 使用MemoryBlock
### 数据类型
.....
HIDL—C++实现
HIDL制作步骤
HAL层添加HIDL实现过程
小笔记
对于Composer.hal最后查找的动态库是android.hardware.graphics.composer@2.1-impl.so,调用函数集是HIDL_FETCH_IComposer
各个.hal文件,首先会注册到HwServiceManager里面,然后由HwServiceManager再统一注册进ServiceManager中!