2. AAOS 架构概览

Android Automotive OS(AAOS)并不是简单地把手机 Android 装进车机,而是在标准 Android 框架之上,增加了一整套面向车辆属性的服务层与硬件抽象层。理解 AAOS 的关键,是看清它的分层结构,以及 Car Service 与 Vehicle HAL(VHAL)之间“服务—抽象—硬件”的三角关系。本节从整体架构入手,逐层拆解,并梳理 VHAL 从 Android 9 到 Android 14 的版本差异。

一、AAOS 分层架构:从应用到车辆总线

AAOS 自上而下可分为五层,每一层都有明确的职责边界:

  • 应用层(App Layer):包括系统自带应用(如 Car Launcher、Settings、Media)和第三方应用。应用不直接访问车辆硬件,而是通过 Car API(如 CarPropertyManager)获取车辆属性。
  • Car API 层:位于 android.car 包中,是应用与 Car Service 之间的契约。它定义了属性 ID、权限、访问模式(读/写)和数据类型。
  • Car Service 层:系统核心服务,运行在 system_server 或独立进程中。它负责属性权限校验、订阅管理、区域映射、速率限制,并将请求转发给 VHAL。
  • Vehicle HAL 层:即 VHAL,是 Car Service 与车辆硬件之间的抽象接口。它定义了属性 ID、属性配置、事件回调,并通过 Binder 与 Car Service 通信。
  • 硬件与总线层:包括 MCU、CAN/LIN/FlexRay 总线、传感器和执行器。VHAL 的底层实现(Vendor HAL)负责将属性读写转换为具体的总线信号。

这五层之间是严格的单向依赖:上层依赖下层提供的接口,下层不感知上层业务逻辑。这种分层使得应用可以跨车型复用,而硬件差异被隔离在 VHAL 之下。

AAOS 五层架构与 Car Service / VHAL 关系 应用层 Car Launcher · Settings · Media · 第三方 App CarPropertyManager Car API 调用 Car API 层 android.car · 属性 ID · 权限 · 访问模式 · 数据类型 Binder 接口 Binder 调用 Car Service 层 权限校验 · 订阅管理 · 区域映射 · 速率限制 · 属性转发 CarPropertyService · CarDrivingStateService · CarUxRestrictionsService IVehicle Binder Vehicle HAL 层 属性 ID 定义 · 属性配置 · 事件回调 · get/set/subscribe IVehicle.aidl · VehiclePropertyStore · Emulator/Vendor 实现 HAL 调用 硬件与总线层 MCU · CAN / LIN / FlexRay · 传感器 · 执行器 物理信号 依赖方向:上层 → 下层;硬件差异被隔离在 VHAL 之下,应用可跨车型复用

二、Car Service 与 VHAL 的关系

Car Service 与 VHAL 之间是“服务消费者”与“硬件抽象提供者”的关系,具体体现在三个层面:

  1. 接口契约:VHAL 通过 IVehicle.aidl 暴露 get()、set()、subscribe() 等方法。Car Service 是这些接口的主要调用方,它把应用的属性请求翻译成 VHAL 调用。
  2. 属性配置:VHAL 在启动时通过 getAllPropConfigs() 返回所有支持的属性配置,包括属性 ID、访问权限、数据类型、区域支持、变更模式等。Car Service 据此建立属性索引,并在应用请求时进行合法性校验。
  3. 事件回调:当车辆状态变化时,VHAL 通过 onPropertyEvent() 主动上报。Car Service 接收后,再分发给已订阅的 CarPropertyManager 回调,形成“硬件 → VHAL → Car Service → 应用”的完整链路。

核心理解:Car Service 不直接读 CAN 信号,VHAL 也不处理业务权限。两者通过属性 ID 和 Binder 接口解耦,这是 AAOS 能够支持多车型、多供应商的关键设计。

三、VHAL 的演进与版本差异

VHAL 的接口形态和属性模型在 Android 9 到 Android 14 之间经历了多次重要变化。下表梳理了关键版本差异:

Android 版本 VHAL 接口形态 关键变化 对集成的影响
Android 9 (P) HIDL 1.0 属性模型初步建立,支持基础 get/set/subscribe 供应商需实现 HIDL 接口,属性 ID 较少
Android 10 (Q) HIDL 2.0 引入属性配置、区域支持、连续属性 支持多区域属性,如分区空调
Android 11 (R) AIDL 过渡 开始从 HIDL 向 AIDL 迁移,引入 IVehicle.aidl 供应商需同时维护 HIDL 与 AIDL 实现
Android 12 (S) AIDL 稳定 AIDL 成为默认接口,属性 ID 大幅扩展 新项目建议直接使用 AIDL VHAL
Android 13 (T) AIDL + 调试增强 支持 VHAL 调试工具、属性转储、更细粒度权限 便于排障,但权限配置更严格
Android 14 (U) AIDL 成熟 属性模型稳定,支持更多车辆域属性 推荐作为新车型的基线版本

从演进趋势看,VHAL 的接口从 HIDL 转向 AIDL,属性模型从“少量基础属性”扩展到“覆盖车身、动力、座舱、ADAS 的完整属性集”。对于集成工程师而言,选择 VHAL 版本时需重点确认:目标 Android 版本、供应商提供的 HAL 实现、以及属性 ID 是否与 Car API 对齐。

四、案例场景:读取车速属性的完整链路

以应用读取车速为例,完整链路如下:

// 1. 应用层:获取 CarPropertyManager
CarPropertyManager mgr = (CarPropertyManager) car.getCarManager(Car.PROPERTY_SERVICE);

// 2. 应用层:读取车速属性
CarPropertyValue<Float> value = mgr.getProperty(
    VehiclePropertyIds.PERF_VEHICLE_SPEED,
    VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL
);

// 3. Car Service:校验权限、查找属性配置、转发给 VHAL
// 4. VHAL:将属性 ID 转换为 CAN 信号,读取 MCU 数据
// 5. VHAL:返回 CarPropertyValue,Car Service 再返回给应用

这条链路中,任何一层出错都会导致读取失败。常见问题包括:属性 ID 未在 VHAL 中声明、权限未授予、区域类型不匹配、VHAL 实现未正确响应 get() 调用。

常见误区:很多初学者认为“应用可以直接调用 VHAL”。实际上,应用只能通过 Car API 访问 Car Service,再由 Car Service 调用 VHAL。绕过 Car Service 直接访问 VHAL 会导致权限校验缺失、订阅管理混乱,甚至引发系统稳定性问题。

五、复盘与要点总结

  • AAOS 五层架构的核心是“分层解耦”:应用层、Car API、Car Service、VHAL、硬件层各司其职。
  • Car Service 是属性访问的“守门人”,负责权限、订阅、区域和速率控制;VHAL 是硬件差异的“隔离层”。
  • VHAL 从 HIDL 演进到 AIDL,属性模型不断扩展。集成时需确认版本、接口形态和属性 ID 对齐情况。
  • 调试属性问题时,应沿着“应用 → Car API → Car Service → VHAL → 总线”的链路逐层排查,优先确认属性配置和权限。

掌握本节的分层关系和版本差异,是后续进行 VHAL 属性定义、Car Service 集成和车辆服务开发的基础。只有在架构层面建立清晰的认知,才能在具体集成工作中快速定位问题、做出正确的技术选型。