Skip to main content
 首页 » 编程设计

Android HIDL学习笔记记录

2022年07月19日57tuyile006

一、HIDL概述

1. Google对于HIDL的详细说明,以及语法解析链接如下:https://source.android.com/devices/architecture/hidl/ (需要FQ才可以打开)

2. HIDL的定义
HIDL 全称是 Hardware Interface Definition Language。在 Android 8.0 中被全面使用。其诞生目的是:框架可以在无需重新构建 HAL 的情况下进行替换。HAL将由供应商或SOC 制造商构建,放置在设备的 /vendor 分区中,这样一来,框架就可以在其自己的分区中通过 OTA 进行替换,而无需重新编译 HAL。

3. HAL的类型
为了更好地实现模块化,Android 8.0 对 Android 操作系统底层进行了重新架构。运行 Android 8.0 的设备必须支持绑定式或直通式 HAL:
(1)绑定式 HAL: 以 HAL 接口定义语言 (HIDL) 表示的 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。(这个是趋势)
(3)直通式 HAL。以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。

4. HIDL的实现
1.Android O 对 Android 操作系统的架构重新进行了设计,以在独立于设备的 Android 平台与特定于设备和供应商的代码之间定义清晰的接口。Android 已经以 HAL 接口的形式(在 hardware/libhardware 中定义为 C 标头)定义了许多此类接口。HIDL 将这些 HAL 接口替换为稳定的带版本接口,它们可以是采用 C++(如下所述)或 Java 的客户端和服务器端 HIDL 接口。

5. HIDL 接口具有客户端和服务器实现
HIDL接口的客户端:指通过在该接口上调用方法来使用该接口的代码
HIDL接口的服务器端:指 HIDL 接口的实现,它可接收来自客户端的调用并返回结果。
在 libhardware HAL 转换为 HIDL HAL 的过程中,HAL 实现成为服务器,而调用 HAL 的进程则成为客户端。

6. HIDL版本维护
HIDL 要求每个使用 HIDL 编写的接口均必须带有版本编号。HAL 接口一经发布便会被冻结,如果要做任何进一步的更改,都只能在接口的新版本中进行。虽然无法对指定的已发布接口进行修改,但可通过其他接口对其进行扩展。
然而虽然google规定,已经发的hal版本是不能再更改的,除非再update成新的版本,而在porting的平台上,几乎都没有遵守这个规定,只是在原先的基础版本上去update而已,把要修改的文件进行重新继承整理,没更新版本。但这样却也可以过google的测试。。。

7.为什么需要HIDL

HIDL 是用于指定 HAL 与其用户之间接口的一个接口描述语言(Interface Description Language),它允许定义变量和函数类型做成封装接口给其他程序调用。通俗的说,HIDL是两个独立程序的桥梁,另外两个程序可以独自编译生成互不影响。

HIDL 实际上是用于进行进程间通信(Inter-process Communication,IPC)。进程间的通信可以称为 Binder 化(Binderized)。对于必须连接到进程的库,也可以使用 passthough 模式(但在Java中不支持)。

HIDL 将指定的数据结构与方法签名组织到接口中,这些接口又会被收集到包中以供使用。它的语法与 C++、JAVA 是类似的,不过他们的关键字存在一些差异。其注释风格与 JAVA 是一致的。

设计 HIDL 这个机制的目的,主要是想把**框架(framework)**与 HAL 进行隔离,使得框架部分可以直接被覆盖、更新,而不需要重新对 HAL 进行编译。HAL 的部分将会放在设备的 /vendor 分区中,并且是由设备供应商(vendors)或 SOC 制造商来构建。这使得框架部分可以通过 OTA 方式更新,同时不需要重新编译 HAL。

如果Framework直接调用 HAL,这样导致一个问题,如果HAL增加了什么接口,就需要重新整个都编译系统。大佬们就发现了这个问题,然后就想多加一个东西,这个东西可以规范一些接口,底层的同学就去填充这些接口就好了。然后就有了直通模式,Binderized化模式。

8.是Framework和HAL的发展图示


二、参考

Android O HIDL的实现对接:https://blog.csdn.net/gh201030460222/article/details/80551897
1.偏向于应用和实践

AndroidO Treble架构下hwservicemanager启动过程: https://blog.csdn.net/marshal_zsx/article/details/80293163
1.偏向于代码走读,更详细更好,有举例Composer.hal。

2.对于Composer.hal最后查找的动态库是android.hardware.graphics.composer@2.1-impl.so,调用函数集是HIDL_FETCH_IComposer

3.各个.hal文件,首先会注册到HwServiceManager里面,然后由HwServiceManager再统一注册进ServiceManager中!


本文参考链接:https://www.cnblogs.com/hellokitty2/p/12258131.html