前言
Android Treble 简介 一文中提到了Android O之后使用Treble的架构,为了解决Android 系统的碎片化问题和提高系统更新的效率,减少了framework 和HAL 的耦合性,进而引出了HIDL 的概念。本文将详细的总结HIDL 的使用。
本文代码基于:Android P
HIDL简介
HIDL 全称为HAL interface definition language(发音为“hide-l”)是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL)。
HIDL 的目标是,框架可以在无需重新构建 HAL 的情况下进行替换。HAL 将由供应商或 SOC 制造商构建,放置在设备的 /vendor 分区中,这样一来,框架就可以在其自己的分区中通过 OTA 进行替换,而无需重新编译 HAL,这也是Project Treble框架设计而诞生的。
HIDL对比与AIDL
相同不同
AIDLHIDL
都是使用Binder 机制进行IPC
都使用service manager进行管控
文件的后缀为 aidl文件的后缀为 hal
适用于框架/应用 之间的IPC
适用于框架/HAL 进程之间的IPC
或
适用于OEM 进程之间的IPC
使用设备节点为/dev/binder
使用设备节点为/dev/hwbinder
或 /dev/vndbinder
语言实现方式不同(例如数据类型、types.hal等)
HIDL 设计原则
HIDL 的目标是,框架可以在无需重新构建 HAL 的情况下进行替换。HAL 将由供应商或 SOC 制造商构建,放置在设备的 /vendor 分区中,这样一来,框架就可以在其自己的分区中通过 OTA 进行替换,而无需重新编译 HAL。
HIDL 设计在以下方面之间保持了平衡:
互操作性。在可以使用各种架构、工具链和编译配置来编译的进程之间创建可互操作的可靠接口。HIDL 接口是分版本的,发布后不得再进行更改。
效率。HIDL 会尝试尽可能减少复制操作的次数。HIDL 定义的数据以 C++ 标准布局数据结构传递至 C++ 代码,无需解压,可直接使用。此外,HIDL 还提供共享内存接口;由于 RPC 本身有点慢,因此 HIDL 支持两种无需使用 RPC 调用的数据传输方法:共享内存和快速消息队列 (FMQ)。
直观。通过仅针对 RPC 使用 in 参数,HIDL 避开了内存所有权这一棘手问题(请参阅 Android 接口定义语言 (AIDL));无法从方法高效返回的值将通过回调函数返回。无论是将数据传递到 HIDL 中以进行传输,还是从 HIDL 接收数据,都不会改变数据的所有权,也就是说,数据所有权始终属于调用函数。数据仅需要在函数被调用期间保