HAL与HIDL简介
什么是HAL?
HAL硬件抽象层(Hardware Abstraction Layer),是谷歌开发的用于屏蔽底层硬件抽象出来的一个软件层;
每一个平台厂商可以将不开源的的代码封装在HAL层,仅提供二进制文件(so库文件,通过dlopen函数接口加载);
HIDL
(1)什么是HIDL?
HIDL(HAL Interface Description Language),是一种自定义语言,指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL)。
HIDL其核心是接口的定义,而谷歌为了使开发者将注意力落在接口的定义上而不是机制的实现上,主动封装了HIDL机制的实现细节,开发者只需要通过*.hal文件定义接口,填充接口内部实际的实现即可;
(2)HIDL的存在的目的(解耦)?
HIDL 允许指定收集到接口和软件包的类型和方法调用。
HIDL 旨在用于进程间通信 (IPC)。
HIDL 存在的目的是,可以在无需重新构建 HAL 的情况下替换HAL层以上的框架。
HAL 将由供应商或 SOC 制造商构建,并放置在设备的 /vendor
分区中;
这样就可以在system分区中通过 OTA 替换框架,而无需重新编译 HAL。
HIDL接口文件位于AOSP中的四个不同位置:
1.https://www.androidos.net.cn/android/10.0.0_r6/xref/hardware/interfaces
2.https://www.androidos.net.cn/android/10.0.0_r6/xref/frameworks/hardware/interfaces
3.https://www.androidos.net.cn/android/10.0.0_r6/xref/system/hardware/interfaces
4.https://www.androidos.net.cn/android/10.0.0_r6/xref/system/libhidl/transport
以指纹为例:
http://androidxref.com/9.0.0_r3/xref/hardware/interfaces/biometrics/fingerprint/2.1/types.hal
HAL层如何实现?
以指纹为例:
从Android O开始(安卓官网上可以搜索到“Android Treble"相关的论文),新引入/dev/hwbinder接口使用HIDL语言,文件后缀名为.hal。
FingerprintService.java是通过hwbinder(新的HIDL语言)与HAL层也的BiometricsFingerprint.cpp通信。
FingerprintService.java->BiometricsFingerprint.cpp->fingerprint.c->IC厂商自实现HAL(具体实现android源码中提供的方法)->IC厂商提供的CA--------IC厂商提供的TA(TEE,不同的平台有不同的方案,例如高通是QTEE)
IC厂商自实现HAL(具体实现android源码中提供的方法)->IC厂商提供的CA--------IC厂商提供的TA(TEE)涉及到驱动的集成与调试。
HAL层如何加载?
Google在HAL层定义了一套通用标准接口,平台厂商都遵守该规则定义自己的Module:
- 每一个硬件都通过hw_module_t来描述,具有固定的名字HMI(Hardware Module Info)
- 每一个硬件都必须实现hw_module_t里面的open方法,用于