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 测试框架集成中,接口语言的选择直接影响测试用例的编写方式与覆盖范围。以下是决策流程:

  1. 项目启动时间:若项目基于 Android 8.0 ~ 10,优先使用 HIDL;若基于 Android 12+,优先使用 AIDL。
  2. 接口稳定性要求:HIDL 提供强制的版本冻结机制,适合长期维护的 HAL 接口;AIDL 的版本化较灵活,适合快速迭代。
  3. 测试框架兼容性:VTS 对 HIDL 的测试支持更成熟(自动生成测试模板);AIDL 测试需要手动配置 aidl_test_gen.py 或编写自定义测试。
  4. 跨分区通信:HIDL 专为 system/vendor 分区隔离设计;AIDL 统一后也支持,但需显式声明 @VintfStability。
VTS 验证建议: 对于新开发的 HAL 模块,若目标 Android 版本 ≥ 12,推荐使用 AIDL 定义接口,以降低未来迁移成本;但必须确保接口添加 @VintfStability 注解,否则 VTS 不会识别为稳定接口。

3.4 接口定义语言架构对比图

下图展示了 HIDL 与 AIDL 在 Android 系统架构中的位置与通信路径:

HIDL 与 AIDL 架构对比 HIDL 与 AIDL 在 Android 架构中的位置 应用层 (Application Framework) System Server / 系统服务 传统 AIDL (Binder IPC) HAL 层 (Hardware Abstraction Layer) HIDL (Binderized / Passthrough) AIDL 统一 (Binder IPC) Vendor 实现 (HAL 实现库 / 驱动) HIDL 特点 • 显式版本号 @1.0, @2.0 • 接口冻结后不可变 • 支持 passthrough 模式 AIDL 统一特点 • @VintfStability 注解版本化 • 支持 NDK/Java 后端 • 更丰富的数据类型

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 注解解析。