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 与上层服务之间的分层关系:
上层服务通过 IVehicle 接口与 HAL 通信,主要交互模式包括:
- 同步调用:
get()和set()方法,用于一次性属性读写,如读取 VIN 码。 - 异步订阅:
subscribe()方法注册回调,HAL 在属性变化时通过onPropertyEvent()推送数据。 - 批量获取:
getAllProperties()用于初始化时获取所有支持的属性列表。
最佳实践: 在 Vehicle Service 层实现属性缓存和去重逻辑,避免高频变化属性(如车速)频繁跨进程调用 HAL,降低系统负载。
1.4 属性订阅的核心流程
车辆信号订阅是 Vehicle HAL 最重要的能力之一。下图展示了从应用层到 HAL 的完整订阅链路:
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) |