1. Vehicle HAL 概述

Vehicle HAL(Hardware Abstraction Layer)是 Android Automotive 系统中连接 Framework 与车载硬件的核心中间层。它定义了车辆属性(Vehicle Property)的标准化访问接口,屏蔽了不同 OEM 硬件实现的差异,为上层应用和服务提供统一的车辆信号读写能力。

1.1 Vehicle HAL 在 Android Automotive 中的定位

在 Android Automotive 整体架构中,Vehicle HAL 位于系统服务层与硬件驱动层之间,属于 HAL 接口定义语言(HIDL / AIDL) 定义的系统级组件。其定位可概括为:

  • 硬件抽象边界:将车辆总线(CAN、LIN、以太网)上的原始信号转换为 Android 可识别的属性键值对。
  • 策略执行点:在 HAL 层实现访问控制、速率限制、属性订阅过滤等策略,避免上层直接操作硬件。
  • 系统稳定性屏障:HAL 进程崩溃不影响 Framework 核心服务,通过 android.hardware.automotive.vehicle@2.0(或更高版本)接口实现进程间通信。
关键概念: Vehicle HAL 不是单一进程,而是由 Vehicle Service(系统服务)管理的 HAL 实例。OEM 必须实现 IVehicle HAL 接口,并注册到 Vehicle Service 中。

1.2 核心职责

Vehicle HAL 承担以下五项核心职责:

职责 说明 典型场景
属性定义与注册 声明车辆支持的属性集合(属性 ID、类型、访问模式、区域配置) 定义 VEHICLE_PROPERTY_SPEED 为 INT32 类型,只读
属性读写 实现 get() 和 set() 方法,将属性请求映射到硬件总线操作 读取车速传感器值,写入空调温度设定
事件订阅与通知 支持上层按属性 ID 订阅变化事件,HAL 在硬件值变化时主动推送 订阅 VEHICLE_PROPERTY_TIRE_PRESSURE 实时更新
属性配置管理 管理属性的默认值、最小值、最大值、变化步长等元数据 配置车窗位置属性的范围 0–1000 mm
诊断与错误报告 返回硬件错误码、超时状态、属性不可用等异常信息 CAN 总线离线时返回 Status::TRY_AGAIN

1.3 与上层服务的关系

Vehicle HAL 不直接与 Android 应用交互,而是通过 Vehicle Service(系统服务)作为桥梁。下图展示了 HAL 与上层服务之间的分层关系:

Vehicle HAL 与上层服务关系架构 Android 应用层(Car App / 第三方 App) 通过 Car API 访问车辆属性 Car Service / Vehicle Service(系统服务) 属性订阅管理、权限校验、事件分发 Vehicle HAL(IVehicle 接口实现) 属性读写、事件上报、订阅过滤 车载硬件(CAN 总线 / LIN / 以太网 / 传感器) HIDL / AIDL 接口

上层服务通过 IVehicle 接口与 HAL 通信,主要交互模式包括:

  • 同步调用:get() 和 set() 方法,用于一次性属性读写,如读取 VIN 码。
  • 异步订阅:subscribe() 方法注册回调,HAL 在属性变化时通过 onPropertyEvent() 推送数据。
  • 批量获取:getAllProperties() 用于初始化时获取所有支持的属性列表。
最佳实践: 在 Vehicle Service 层实现属性缓存和去重逻辑,避免高频变化属性(如车速)频繁跨进程调用 HAL,降低系统负载。

1.4 属性订阅的核心流程

车辆信号订阅是 Vehicle HAL 最重要的能力之一。下图展示了从应用层到 HAL 的完整订阅链路:

车辆信号订阅流程 1. 应用注册订阅 CarPropertyManager.subscribe() 2. Vehicle Service 权限校验 + 订阅注册 3. Vehicle HAL subscribe() 回调注册 4. 硬件监听 CAN 总线轮询 硬件值变化时,事件沿反向路径推送 5. HAL 推送 onPropertyEvent() 6. Vehicle Service 事件分发 + 缓存更新 7. 回调应用 onPropertyChanged() 8. 应用处理 UI 更新 / 业务逻辑 订阅生命周期管理 应用退出或取消订阅时,Vehicle Service 调用 HAL 的 unsubscribe() 释放硬件监听资源 支持按属性 ID、区域 ID、采样频率等维度精细控制订阅行为

1.5 属性订阅的关键接口

Vehicle HAL 定义的核心接口方法如下(以 AIDL 版本为例):

// IVehicle.aidl
interface IVehicle {
    // 获取单个属性值
    StatusCode get(int32_t propId, in GetValueRequest request, out GetValueResult result);

    // 设置属性值
    StatusCode set(int32_t propId, in SetValueRequest request);

    // 订阅属性变化
    StatusCode subscribe(in ISubscriptionCallback callback, in SubscribeOptions options);

    // 取消订阅
    StatusCode unsubscribe(in ISubscriptionCallback callback, int32_t propId);

    // 批量获取所有支持的属性
    StatusCode getAllProperties(out VehiclePropConfig[] propConfigs);
}
注意事项: 订阅回调 ISubscriptionCallback 是 oneway 接口,HAL 实现必须保证回调线程安全,避免死锁。同时,订阅频率过高(如 < 10ms 间隔)可能导致 HAL 进程消息队列溢出,建议在 Vehicle Service 层做频率限制。

1.6 属性配置结构

每个车辆属性由 VehiclePropConfig 结构描述,包含以下关键字段:

字段 类型 说明
propId int32 属性唯一标识,如 VEHICLE_PROPERTY_SPEED = 0x2910
access int32 访问模式:READ、WRITE、READ_WRITE
changeMode int32 变化模式:STATIC、ON_CHANGE、CONTINUOUS
configArray int32[] OEM 自定义配置,如采样率、缓冲区大小
areaConfigs VehicleAreaConfig[] 区域配置,用于多区域属性(如四门车窗)
minSampleRate float 最小采样频率(Hz),仅 CONTINUOUS 模式有效
maxSampleRate float 最大采样频率(Hz)