文章目录
Android O HIDL的实现对接
Google对于HIDL的详细说明,以及语法解析链接如下(ps: 需要翻墙才可以打开)
https://source.android.com/devices/architecture/hidl/
以下是个人学习整理的资料,以及实做的一个例子
1. HIDL的定义
HIDL 读作 hide-l,全称是 Hardware Interface Definition Language。它在 Android Project Treble 中被起草,在 Android 8.0 中被全面使用。其诞生目的是,框架可以在无需重新构建 HAL 的情况下进行替换。HAL将由供应商或SOC 制造商构建,放置在设备的 /vendor 分区中,这样一来,框架就可以在其自己的分区中通过 OTA 进行替换,而无需重新编译 HAL
1.1. 关于Android更新
利用新的供应商接口,Project Treble 将供应商实现(由芯片制造商编写的设备专属底层软件)与 Android 操作系统框架分离开来。Android 7.x 及更早版本中没有正式的供应商接口,因此设备制造商必须更新大量 Android 代码才能将设备更新到新版 Android 系统。
图 1. Treble 推出前的 Android 更新环境
Treble 提供了一个稳定的新供应商接口,供设备制造商访问 Android 代码中特定于硬件的部分,这样一来,设备制造商只需更新 Android 操作系统框架,即可跳过芯片制造商直接提供新的 Android 版本:
图 2. Treble 推出后的 Android 更新环境
2. HIDL处于系统哪个部位及怎么通信的
2.1. Android 系统架构包含以下组件
2.2. HAL的类型
为了更好地实现模块化,Android 8.0 对 Android 操作系统底层进行了重新架构。作为此变化的一部分,运行 Android 8.0 的设备必须支持绑定式或直通式 HAL:
• **绑定式 HAL。**以 HAL 接口定义语言 (HIDL) 表示的 HAL。这些 HAL 取代了早期 Android 版本中使用的传统 HAL 和旧版 HAL。在绑定式 HAL 中,Android 框架和 HAL 之间通过 Binder 进程间通信 (IPC) 调用进行通信。所有在推出时即搭载了 Android 8.0 或后续版本的设备都必须只支持绑定式 HAL。
• 直通式 HAL。以 HIDL 封装的传统 HAL 或旧版 HAL。这些 HAL 封装了现有的 HAL,可在绑定模式和 Same-Process(直通)模式下使用。升级到 Android 8.0 的设备可以使用直通式 HAL。
3. HIDL的实现
Android O 对 Android 操作系统的架构重新进行了设计,以在独立于设备的 Android 平台与特定于设备和供应商的代码之间定义清晰的接口。Android 已经以 HAL 接口的形式(在 hardware/libhardware 中定义为 C 标头)定义了许多此类接口。HIDL 将这些 HAL 接口替换为稳定的带版本接口,它们可以是采用 C++(如下所述)或 Java 的客户端和服务器端 HIDL 接口。
HIDL 接口具有客户端和服务器实现:
• HIDL 接口的客户端实现是指通过在该接口上调用方法来使用该接口的代码
• 服务器实现是指 HIDL 接口的实现,它可接收来自客户端的调用并返回结果(如有必要)
在从 libhardware HAL 转换为 HIDL HAL 的过程中,HAL 实现成为服务器,而调用 HAL 的进程则成为客户端。默认实现可提供直通和绑定式 HAL,并可能会随着时间而发生变化,如下所示:
4. HIDL版本维护
HIDL 要求每个使用 HIDL 编写的接口均必须带有版本编号。HAL 接口一经发布便会被冻结,如果要做任何进一步的更改,都只能在接口的新版本中进行。虽然无法对指定的已发布接口进行修改,但可通过其他接口对其进行扩展。
5. 实例对接HIDL完整过程
因为要google规定,已经发的hal版本是不能再更改的,除非再update成新的版本,而在porting的平台上,几乎都没有遵守这个规定,只是在原先的基础版本上去update而已,把要修改的文件进行重新继承整理,没更新版本。但这样却也可以过google的测试。。。
而对于新加的可以修改p2p group密码的接口,这个是一个新的接口,所以,也没有重新生成新的版本去update。下面让我们一起来看下这个hidl新接口的添加过程
5.1. 新功能接口的添加
因为这个是添加了一个新的接口功能,所以在wpa_supplicant中添加了可以修改p2p group密码的接口,新加接口记为
p2p_set_passphrase()
# wpa_cli -ip2p0 -p /data/misc/wifi/sockets/
> SET p2p_pwd “12345678”
<3>P2P-GROUP-STARTED p2p-p2p0-1 GO ssid="DIRECT-ac-Android_e8q7" freq=2472