3. AOSP HAL框架回顾:Android HAL接口定义语言(HIDL/AIDL)、HAL Service与HAL Server模型、Treble架构对HAL的影响

在深入Vehicle HAL适配之前,必须系统回顾AOSP HAL框架的演进脉络。Android 8.0引入的Treble架构彻底重构了HAL层,将原本紧密耦合的vendor实现与Android框架解耦。本节聚焦三个核心维度:接口定义语言(HIDL vs AIDL)、运行时模型(Service vs Server)、以及Treble带来的架构变革。

3.1 接口定义语言:从HIDL到AIDL的演进

Android HAL接口定义语言决定了framework与vendor实现之间的契约形式。HIDL(HAL Interface Definition Language)是Treble时代的主语言,而AIDL(Android Interface Definition Language)在Android 13之后逐步成为统一选择。

对比维度 HIDL AIDL(HAL模式)
引入版本 Android 8.0 (Treble) Android 13 (HAL AIDL)
后端类型 Passthrough / Binderized 仅Binderized
接口文件后缀 .hal .aidl
包命名规范 android.hardware.xxx@X.Y android.hardware.xxx.IXxx
版本管理 显式major.minor版本 通过接口继承实现
稳定性保证 VTS强制接口冻结 API review + 冻结机制
代码生成 hidl-gen aidl + aidl_interface 构建规则
关键决策: 新项目应优先选择AIDL HAL模式。Google已明确HIDL进入维护模式,AIDL提供更简洁的语法、更好的工具链集成,且支持跨进程回调(oneway)和接口继承。

3.1.1 HIDL接口示例(Vehicle 2.0)

// android.hardware.automotive.vehicle@2.0
package android.hardware.automotive.vehicle@2.0;

interface IVehicle {
    getAllPropConfigs() generates (vec<VehiclePropConfig> propConfigs);
    get(VehiclePropValue requestedPropValue)
        generates (StatusCode status, VehiclePropValue propValue);
    set(VehiclePropValue propValue) generates (StatusCode status);
    subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
        generates (StatusCode status);
    ...
};

3.1.2 AIDL HAL接口示例(Vehicle AIDL)

// android.hardware.automotive.vehicle.IVehicle.aidl
package android.hardware.automotive.vehicle;

interface IVehicle {
    void getAllPropConfigs(out VehiclePropConfig[] propConfigs);
    void get(in VehiclePropValue requestedPropValue,
             out VehiclePropValue propValue);
    void set(in VehiclePropValue propValue);
    void subscribe(in IVehicleCallback callback,
                   in SubscribeOptions[] options);
    ...
};
迁移要点: AIDL HAL不再使用generates关键字,改用out参数传递返回值;错误码通过ServiceSpecificException抛出,而非返回StatusCode枚举。

3.2 HAL Service与HAL Server模型

Treble架构下,HAL实现以两种运行时形态存在:HAL Service(服务端进程)和HAL Server(注册与管理实体)。理解二者的分工是编写稳定HAL的基础。

HAL Service 与 HAL Server 运行时模型 Android Framework SystemServer / CarService 通过Binder调用HAL接口 获取IVehicle代理对象 HAL Server hwservicemanager / servicemanager 管理HAL Service注册与发现 提供getService() / register() HAL Service vendor进程(如vehicle_service) 实现IVehicle接口方法 操作硬件设备节点 getService() 返回Binder代理 Binder IPC 直接调用 模型要点 • HAL Server(servicemanager)是注册中心,不参与业务逻辑 • HAL Service 是实际硬件操作进程,每个HAL接口对应一个或多个Service实例 • Framework通过Binder直连HAL Service,Server仅提供服务发现 硬件设备(CAN / UART / I2C) 通过设备节点或内核驱动访问 操作硬件

3.2.1 注册与发现流程

  1. HAL Service启动:vendor进程调用registerAsService()向servicemanager注册自身实例。
  2. Framework获取服务:通过IVehicle::getService()(HIDL)或IVehicle::getService()(AIDL)获取Binder代理。
  3. 直连通信:后续所有接口调用直接通过Binder IPC在Framework进程与HAL Service进程之间完成。
  4. 死亡通知:Framework注册linkToDeath监听,HAL Service异常退出时触发重连逻辑。
常见陷阱: 多个HAL Service实例可能注册同一个接口名(如default),servicemanager默认返回第一个注册的实例。Vehicle HAL通常只注册一个实例,但调试时需注意进程重启导致的注册竞争。

3.3 Treble架构对HAL的影响

Treble(Android 8.0+)是Android HAL历史上最重大的架构变革。它将vendor实现与framework编译时解耦,通过稳定接口保证系统升级时vendor镜像无需重新编译。

3.3.1 核心变革

变革维度 Treble之前 Treble之后
接口稳定性 无强制接口冻结,vendor与framework紧耦合 VTS强制接口兼容性测试,冻结的.hal/.aidl文件
编译依赖 vendor库链接framework内部头文件 vendor仅依赖稳定NDK + HAL接口定义
进程模型 同进程加载(libhardware.so) 强制Binderized(跨进程),仅legacy保留passthrough
版本管理 无版本概念,直接修改头文件 显式major.minor版本,接口升级通过继承扩展
测试验证 依赖厂商自测 VTS(Vendor Test Suite)自动化接口兼容性测试

3.3.2 Treble对Vehicle HAL的具体影响

  • 接口冻结:Vehicle HAL 2.0(HIDL)和Vehicle HAL AIDL接口必须通过VTS兼容性测试,任何接口变更需Google审核。
  • 独立进程:Vehicle HAL Service运行在独立的vendor进程中(如/vendor/bin/hw/android.hardware.automotive.vehicle-service),与SystemServer隔离。
  • SELinux策略:Treble强化了vendor与system分区的SELinux隔离,Vehicle HAL Service需要明确的file_contexts和te规则才能访问硬件设备。
  • OTA兼容性:framework OTA升级时,vendor镜像(包括Vehicle HAL Service)无需更新,只要接口版本匹配即可继续工作。
Treble架构下的Vehicle HAL分层与隔离 System分区(可OTA升级) CarService / VehicleManager VTS测试框架 通过Binder调用HAL接口 稳定HAL接口层(HIDL / AIDL)—— 接口冻结,VTS强制兼容 Vendor分区(OTA不更新) Vehicle HAL Service 硬件驱动 / 设备节点 操作CAN / UART / GPIO Binder IPC Treble隔离收益 • System分区OTA升级时,Vendor分区无需重新编译或验证 • 接口冻结保证前后向兼容,VTS自动化验证接口一致性 • SELinux策略隔离vendor进程,防止framework漏洞影响硬件层

3.3.3 适配Vehicle HAL时的Treble注意事项

实战清单:
  • 确认目标Android版本对应的HAL接口版本(Android 13+推荐AIDL,Android 8-12使用HIDL)。
  • VTS测试必须通过:VtsHalAutomotiveVehicleTargetTest 覆盖所有必选属性。
  • SELinux策略文件需包含:hal_automotive_vehicle.te、file_contexts 中声明service二进制路径。
  • 使用 android.hardware.automotive.vehicle-service 作为标准service名称,便于servicemanager发现。
  • 实现 dump() 方法支持 dumpsys 调试,这是VTS和开发者调试的关键入口。

3.4 小结