1. HAL 架构概述:Android HAL 架构演进、HIDL 与 HAL 的关系、Treble 项目背景与意义
1.1 Android HAL 架构演进
硬件抽象层(HAL,Hardware Abstraction Layer)是 Android 系统中连接 Android Framework 与 底层硬件驱动 的关键中间层。它屏蔽了不同硬件厂商的驱动实现差异,为上层应用提供统一的硬件访问接口。随着 Android 版本的迭代,HAL 架构经历了从 传统 HAL(Legacy HAL) 到 Treble HAL(HIDL) 的重大演进。
1.1.1 传统 HAL(Legacy HAL)架构
在 Android 8.0(Oreo)之前,HAL 以 .so 共享库的形式存在,直接由 system_server 或 mediaserver 等系统进程通过 dlopen 动态加载。这种架构存在以下问题:
- 紧耦合: HAL 库与 Framework 运行在同一进程空间,HAL 库的崩溃会直接导致系统服务进程崩溃。
- 升级困难: Framework 与 HAL 库之间没有稳定的二进制接口(ABI),Framework 更新必须同时更新所有 HAL 库。
- 厂商锁定: 硬件厂商的 HAL 实现与特定 Android 版本绑定,无法独立升级。
hw_module_t 和 hw_device_t 结构体定义接口,通过 HAL_MODULE_INFO_SYM 符号导出模块信息。
1.1.2 Treble HAL(HIDL)架构
Android 8.0 引入的 Treble 项目 彻底重构了 HAL 架构,核心变化是使用 HIDL(HAL Interface Definition Language) 定义 HAL 接口,并将 HAL 实现从 Framework 进程空间分离到独立的 HAL 服务进程 中。Framework 与 HAL 服务之间通过 Binderized 或 Passthrough 模式进行进程间通信(IPC)。
| 特性 | 传统 HAL(Legacy HAL) | Treble HAL(HIDL) |
|---|---|---|
| 接口定义 | 头文件 + 结构体(C 语言) | HIDL 文件(.hal) |
| 通信方式 | 函数直接调用(同进程) | Binder IPC / 直通模式 |
| 进程模型 | 加载到 Framework 进程 | 独立 HAL 服务进程 |
| 稳定性 | 低(HAL 崩溃影响 Framework) | 高(HAL 崩溃不影响 Framework) |
| 升级灵活性 | 差(必须同步升级) | 好(Framework 与 HAL 可独立升级) |
1.2 HIDL 与 HAL 的关系
HIDL 是 Treble 项目引入的接口定义语言,用于描述 HAL 与 Framework 之间的通信接口。它定义了接口的方法、数据类型和包结构,并自动生成客户端(Client)和服务端(Server)的 C++ 或 Java 代码骨架。
1.2.1 HIDL 的核心作用
- 接口标准化: 使用
.hal文件定义接口,确保不同厂商的 HAL 实现遵循相同的接口规范。 - 二进制稳定性: HIDL 接口版本化,保证 Framework 与 HAL 之间 ABI 的长期稳定。
- 自动代码生成:
hidl-gen工具根据.hal文件自动生成 Binder IPC 的桩代码(Stub)和代理代码(Proxy),简化开发。 - 跨进程通信: 默认使用 Binder 机制实现跨进程调用,也支持 Passthrough 模式用于性能敏感场景。
// IMyCamera.hal
package vendor.example.hardware.my_camera@1.0;
interface IMyCamera {
openCamera(uint32_t cameraId) generates (CameraStatus status);
startPreview() generates (Status status);
stopPreview() generates (Status status);
closeCamera() generates (Status status);
};
1.2.2 HIDL 与 HAL 的映射关系
HIDL 接口定义的是 通信契约,而 HAL 实现则是 契约的具体履行者。一个 HIDL 接口可以有多个 HAL 实现(例如不同厂商的摄像头 HAL),但所有实现都必须遵守相同的 HIDL 接口规范。
| 角色 | 描述 | 示例 |
|---|---|---|
| HIDL 接口 | 定义通信协议和方法签名 | android.hardware.camera.provider@2.4::ICameraProvider |
| HAL 服务端 | 实现 HIDL 接口的具体逻辑,运行在独立进程中 | cameraserver 进程中的 Camera HAL 实现 |
| Framework 客户端 | 通过 HIDL 代理调用 HAL 服务端的方法 | CameraService 中的 ICameraProvider 代理 |
1.3 Treble 项目背景与意义
Treble 项目 是 Android 团队为解决系统碎片化和升级缓慢问题而发起的重大架构重构。其核心目标是将 Android Framework 框架 与 厂商硬件实现(Vendor Implementation) 解耦,使得 Framework 可以独立于底层硬件进行升级。
1.3.1 项目背景
- 碎片化严重: 不同厂商、不同芯片平台的 Android 设备,其 HAL 实现差异巨大,导致 Google 无法直接向用户推送系统更新。
- 升级周期长: 每次 Android 大版本升级,都需要 SoC 厂商(如 Qualcomm、MediaTek)先适配 BSP,然后 OEM 厂商(如 Samsung、Xiaomi)再集成测试,整个过程耗时数月甚至一年以上。
- 安全补丁滞后: 由于升级流程复杂,关键安全补丁无法及时推送到老旧设备上,造成安全隐患。
1.3.2 核心意义
| 意义 | 详细说明 |
|---|---|
| 加速系统更新 | Framework 与 Vendor 分区解耦,Google 可以直接通过 Project Treble 更新 Framework 部分,无需等待厂商适配。 |
| 降低开发成本 | HIDL 接口标准化后,厂商只需实现稳定的 HIDL 接口,无需为每个 Android 版本重写 HAL 代码。 |
| 提升系统稳定性 | HAL 运行在独立进程中,其崩溃不会影响 Framework 核心服务,系统鲁棒性显著增强。 |
| 促进生态发展 | 清晰的接口边界使得第三方开发者可以更容易地开发和测试硬件相关功能,推动 Android 生态的繁荣。 |
1.4 HAL 架构演进与 Treble 项目关系图
下图展示了从传统 HAL 到 Treble HAL 的架构演进,以及 HIDL 在其中的核心位置:
1.5 本章小结
本章介绍了 Android HAL 架构从传统模式到 Treble 模式的演进历程,重点阐述了 HIDL 作为接口定义语言在 HAL 架构中的核心作用,以及 Treble 项目对 Android 系统生态的深远影响。理解这些基础概念,是后续深入调试 HIDL 接口通信链路的前提。
- 传统 HAL 与 Framework 同进程紧耦合,升级困难。
- Treble 项目引入 HIDL,将 HAL 实现分离为独立服务进程。
- HIDL 接口提供稳定的二进制契约,支持 Framework 与 HAL 独立升级。
- Treble 项目加速了系统更新,降低了开发成本,提升了系统稳定性。