引子
按照既定的计划,在讲解了 Activity 启动过程以后,接下来我们就要讲 Activity 的显示过程了。但是 Activity 显示过程会涉及到两个 Hal 模块 Gralloc 和 Hardware Composer,不懂话,去看代码就会很懵逼。
所以我们就先把 Hal 学了吧。
Android HAL(Hardware Abstract Layer)硬件抽象层,从字面意思可以看出是对硬件设备的抽象和封装,为 Android 在不同硬件设备提供统一的访问接口。HAL 处于 Android framework 和 Linux kernel driver 之间,HAL 存在的意义有以下 2 个方面:
- HAL 屏蔽了不同硬件设备的差异,为 Android 提供了统一的访问硬件设备的接口。不同的硬件厂商遵循 HAL 标准来实现自己的硬件控制逻辑,Framework 开发者不必关心不同硬件设备的差异,只需要按照 HAL 提供的标准接口访问硬件就可以了。
- HAL 层帮助硬件厂商隐藏了设备相关模块的核心细节。硬件厂商处于利益考虑,不希望公开硬件设备相关的实现细节;有了HAL层之后,他们可以把一些核心的算法之类的东西的实现放在 HAL 层,而 HAL 层位于用户空间,不属于 linux 内核,和 android 源码一样遵循的是 Apache license 协议,这个是可以不开源的。
Android 经过多年的迭代,HAL 层也经历了三个阶段:
- Android 8 以前的 HAL,我们称之为传统 HAL
- Android 8 到 Android 10 的 HAL,为了更好的解耦 google 和硬件厂商之间的代码,Android 8 在 HAL 中引入了 HIDL,这个阶段的 HAL,我们称之为 HIDL HAL
- Android 11 开始,又引入了 AIDL 来简化 HDIL HAL,我们称之为 AIDL HAL
googler 你们天天刷 KPI,不考虑下游的打工仔吗?
Android 8 以前的 HAL,传统 HAL
在这个阶段,HAL 层以 so 库的形式存在,Framework 层通过 JNI 加载到这些 so 库,然后 Framework 层通过 Binder 服务的形式向 App 提供操作硬件的接口。
Android 8 到 Android 10 的 HIDL HAL
在这个阶段,HAL 层以进程加 Binder 服务的形式存在,Framework 层通过 HIDL 调用到 HAL 层的 Binder 服务,然后 Framework 层通过 Binder 服务的形式向 App 提供操作硬件的接口。
Android 11 以后的 AIDL HAL
在这个阶段,HAL 层以进程加 Binder 服务的形式存在,App 直接通过 AIDL 访问到 HAL 层的 Binder 服务来操作硬件。
总结
google 迭代了 3 类 HAL,实际改变的就是:
- Hal 层的存在方式
- 层级之间的通信方式。