3. HIDL 与 AIDL:接口定义语言的对比、选择与演进
在 Android HAL 层接口协议验证中,HIDL(HAL Interface Definition Language)与AIDL(Android Interface Definition Language)是定义进程间通信(IPC)接口的两种核心语言。理解两者的差异、选择依据及演进历史,是 VTS 测试框架集成与 HAL 层验证的基础。
3.1 演进历史:从 AIDL 到 HIDL,再到统一
Android 接口定义语言的演进经历了三个阶段,反映了系统架构从单体到模块化、再到稳定可测试的转变。
| 阶段 | Android 版本 | 核心变化 | 驱动因素 |
|---|---|---|---|
| 传统 AIDL | Android 1.0 ~ 7.x | 仅用于应用层 Service 与 Activity 的 Binder IPC | 应用组件间通信需求 |
| HIDL 诞生 | Android 8.0 (Treble) | 专为 HAL 层设计,支持稳定接口、版本化、passthrough/binderized 模式 | Project Treble 解耦 framework 与 vendor 实现 |
| AIDL 统一 | Android 10 ~ 12+ | AIDL 扩展支持稳定接口、版本化、后端(NDK/Java),逐步替代 HIDL | 减少学习成本,统一 IPC 语言生态 |
VTS 视角: HIDL 接口的 VTS 测试集中在
/vendor 分区实现的合规性验证;而 AIDL 统一后,VTS 测试框架需要同时支持两种接口的测试用例生成与执行。
3.2 HIDL 与 AIDL 核心对比
以下表格从语言特性、传输机制、版本管理、测试适配等维度进行对比:
| 对比维度 | HIDL | AIDL(扩展后) |
|---|---|---|
| 设计目标 | HAL 层稳定接口,vendor 与 system 分区解耦 | 通用 IPC,覆盖应用层与 HAL 层 |
| 接口文件后缀 | .hal |
.aidl |
| 包名规范 | android.hardware.xxx@X.Y |
android.hardware.xxx(无版本号) |
| 版本管理 | 显式版本号(@1.0, @2.0),接口不可变 | 通过 @VintfStability 注解支持版本化 |
| 传输后端 | Binder(binderized)或直通(passthrough) | Binder(默认),支持 NDK/Java 后端 |
| 数据类型 | 固定类型集(vec<T>, fmq_sync 等) | 扩展类型集(Parcelable, List, Map) |
| VTS 测试生成 | VTS 自动生成 VtsHalXxxV1_0TargetTest |
VTS 通过 aidl_test_gen.py 生成测试 |
| 稳定性保证 | 接口冻结后不可修改,保证 vendor 兼容 | 通过 @UnsupportedAppUsage 控制稳定性 |
3.3 选择依据:何时用 HIDL,何时用 AIDL?
在 VTS 测试框架集成中,接口语言的选择直接影响测试用例的编写方式与覆盖范围。以下是决策流程:
- 项目启动时间:若项目基于 Android 8.0 ~ 10,优先使用 HIDL;若基于 Android 12+,优先使用 AIDL。
- 接口稳定性要求:HIDL 提供强制的版本冻结机制,适合长期维护的 HAL 接口;AIDL 的版本化较灵活,适合快速迭代。
- 测试框架兼容性:VTS 对 HIDL 的测试支持更成熟(自动生成测试模板);AIDL 测试需要手动配置
aidl_test_gen.py或编写自定义测试。 - 跨分区通信:HIDL 专为 system/vendor 分区隔离设计;AIDL 统一后也支持,但需显式声明
@VintfStability。
VTS 验证建议: 对于新开发的 HAL 模块,若目标 Android 版本 ≥ 12,推荐使用 AIDL 定义接口,以降低未来迁移成本;但必须确保接口添加
@VintfStability 注解,否则 VTS 不会识别为稳定接口。
3.4 接口定义语言架构对比图
下图展示了 HIDL 与 AIDL 在 Android 系统架构中的位置与通信路径:
3.5 接口定义示例对比
以下展示同一功能(温度传感器 HAL)在 HIDL 与 AIDL 中的定义差异:
HIDL 接口定义(@1.0)
// ITemperature.hal
package android.hardware.temperature@1.0;
interface ITemperature {
/**
* 获取当前温度值
* @return 温度值(摄氏度)
*/
getTemperature() generates (float temp);
/**
* 注册温度变化回调
*/
registerCallback(ITemperatureCallback callback) generates (bool success);
};
// ITemperatureCallback.hal
package android.hardware.temperature@1.0;
interface ITemperatureCallback {
oneway onTemperatureChanged(float temp);
};
AIDL 接口定义(统一后)
// ITemperature.aidl
package android.hardware.temperature;
@VintfStability
interface ITemperature {
/**
* 获取当前温度值
*/
float getTemperature();
/**
* 注册温度变化回调
*/
boolean registerCallback(ITemperatureCallback callback);
}
// ITemperatureCallback.aidl
package android.hardware.temperature;
@VintfStability
interface ITemperatureCallback {
oneway void onTemperatureChanged(float temp);
}
VTS 验证注意: AIDL 接口必须添加
@VintfStability 注解,否则 VTS 测试框架不会将其识别为稳定 HAL 接口,导致测试跳过或失败。HIDL 接口的版本号(@1.0)天然具备稳定性语义。
3.6 VTS 测试框架中的适配策略
在 VTS 测试框架集成中,针对 HIDL 与 AIDL 的测试适配遵循以下策略:
| 测试阶段 | HIDL 适配 | AIDL 适配 |
|---|---|---|
| 接口发现 | 通过 lshal 枚举所有 HIDL 服务 |
通过 dumpsys 或 service list 发现 AIDL 服务 |
| 测试生成 | VTS 自动生成 VtsHalXxxV1_0TargetTest.cpp |
使用 aidl_test_gen.py 生成 Java/CPP 测试 |
| 版本兼容 | 支持多版本共存(@1.0, @2.0) | 通过 @VintfStability 版本化,需手动管理 |
| 测试执行 | 使用 vts-tradefed 运行 HIDL 测试模块 |
使用 atest 或 vts-tradefed 运行 AIDL 测试 |
3.7 演进趋势与 VTS 影响
从 Android 14 开始,Google 明确推荐新 HAL 接口使用 AIDL 定义,HIDL 进入维护模式。这一趋势对 VTS 测试框架的影响如下:
- 测试用例迁移:现有 HIDL 测试用例需要逐步迁移到 AIDL 测试框架,VTS 提供
hidl2aidl转换工具辅助。 - 测试覆盖要求:AIDL 接口的 VTS 测试覆盖标准与 HIDL 一致,但测试编写方式更接近应用层测试。
- 兼容性测试套件:CTS/VTS 将同时包含 HIDL 和 AIDL 测试模块,直到 HIDL 完全退役。
专家建议: 在 VTS 测试框架集成项目中,建议同时保留 HIDL 和 AIDL 的测试能力,直到目标 Android 版本明确废弃 HIDL。对于新项目,优先选择 AIDL 定义接口,并确保 VTS 测试脚本支持
@VintfStability 注解解析。