1. 课程导入

Android Automotive(常缩写为 AAOS,Android Automotive OS)是 Google 面向汽车座舱推出的、以 Android 为基座的完整车载操作系统。它不是把手机投屏到车机上的“外挂方案”,而是直接运行在车机硬件上的原生系统:系统启动后由车载 HAL 与车辆总线交互,由 SystemServer 拉起一整套系统服务,再由 Launcher、设置、媒体、导航等应用呈现给用户。理解这一点,是后续所有系统服务开发工作的起点。

核心判断:Android Auto 是“手机在车机上投屏”,Android Automotive 是“车机自己就是一台 Android 设备”。前者应用跑在手机里,后者应用跑在车机上,并可直接读取车速、挡位、空调、电池等车辆信号。

一、核心原理:AAOS 的分层结构与系统服务的位置

AAOS 在传统 Android 架构上增加了车载专属层。自下而上可以概括为:硬件与车辆总线(CAN/LIN/以太网)→ 车载 HAL(Vehicle HAL、CarPowerManagement、CarAudio 等)→ 原生库与运行时 → 系统服务层(CarService 及其子服务、SystemServer 中的各类 Manager)→ 应用框架 API(Car API、CarPropertyManager 等)→ 车载应用。系统服务开发者的主战场,集中在“车载 HAL 之上、应用 API 之下”的这一层。

其中 CarService 是车载能力的汇聚点,它把车辆属性、电源状态、驾驶状态、乘员信息等抽象为可被应用订阅的属性与回调;而 SystemServer 中的 ActivityManagerService、WindowManagerService、PackageManagerService 等则决定了应用能否启动、窗口能否显示、权限能否授予。二者协同,才构成完整的车载系统行为。

Android Automotive 分层架构与系统服务定位 车载应用层 Launcher · 设置 · 媒体 · 导航 · 空调面板 · 语音助手 应用框架 API Car API · CarPropertyManager · CarUxRestrictionsManager · CarPowerManager 系统服务层(开发主战场) CarService 车辆属性 / 电源 / 驾驶状态 SystemServer AMS / WMS / PMS / 权限 车载专属服务 音频 / 乘员 / 诊断 / OTA 原生库与运行时 Binder · HIDL/AIDL · ART · Native 服务 车载 HAL Vehicle HAL · CarPowerManagement · CarAudio · CarDiagnostic 硬件与车辆总线 CAN / LIN / 以太网 · MCU · SoC 调用与回调方向

二、发展历程:从投屏到原生车载 OS

Android 进入汽车领域经历了三个阶段。第一阶段是 Android Auto(2015 年前后),手机通过 USB 或无线连接把界面投射到车机屏幕,车机只负责显示与输入,应用逻辑仍在手机端。第二阶段是 Android Automotive OS 的提出与开源(2017 年起随 AOSP 发布),Google 把车载能力下沉到系统层,引入 Vehicle HAL 与 Car API,车机成为独立计算平台。第三阶段是近年来的规模化落地,沃尔沃、通用、福特、本田、宝马等厂商陆续量产,Android Automotive 从“实验性平台”变成主流座舱方案之一。

对开发者而言,这个演进意味着技能重心的迁移:早期只需处理投屏协议与手机端适配,如今必须理解系统服务、车辆属性、权限模型、多屏与多用户、驾驶安全限制等系统级问题。

三、Android Automotive 与 Android Auto 的关键区别

对比维度 Android Auto Android Automotive
运行位置 应用运行在手机 应用运行在车机
系统依赖 依赖手机与投屏协议 车机自带完整 Android 系统
车辆信号 仅能获取有限信息 可通过 Car API 读取车速、挡位、空调等
开发重点 手机端适配与投屏兼容 系统服务、HAL、权限、多屏多用户
典型产物 手机 App + 车机显示 车机系统镜像 + 车载应用

四、系统服务开发在车载中的定位

在车载项目中,系统服务开发者通常承担三类职责:一是把车辆能力“翻译”成应用可用的 API,例如把 CAN 信号封装为 CarPropertyManager 的属性;二是保障系统行为符合车规与安全要求,例如驾驶中限制视频播放、限制输入复杂度;三是解决跨模块问题,例如电源状态切换时应用如何优雅退出、多用户切换时数据如何隔离。

一个典型场景是“行车限制”。当车速超过阈值或挡位进入 D 挡,系统服务需要把驾驶状态分发给应用框架,由 CarUxRestrictionsManager 通知应用调整界面。这个过程涉及 Vehicle HAL 上报、CarService 解析、SystemServer 分发、应用响应四个环节,任何一环出错都会导致限制失效。

// 车载属性订阅的典型形态(示意)
CarPropertyManager manager =
        (CarPropertyManager) car.getCarManager(Car.PROPERTY_SERVICE);
manager.registerCallback(callback,
        VehiclePropertyIds.PERF_VEHICLE_SPEED,
        CarPropertyManager.SENSOR_RATE_ONCHANGE);

// 回调中拿到车速,再结合挡位判断驾驶状态
public void onChangeEvent(CarPropertyValue value) {
    float speed = (float) value.getValue();
    // 交由 UX Restrictions 逻辑处理
}

五、学习路线与常见误区

建议的学习路线是:先建立 AOSP 构建与刷机能力,能编译并运行 AAOS 模拟器或开发板;再理解 CarService 与 Vehicle HAL 的交互,能读懂属性定义与信号映射;随后掌握系统服务开发范式,包括 Binder 接口、AIDL 定义、权限校验、SELinux 策略;最后进入实战,完成一个自定义车载服务并让应用成功调用。

常见误区一:把 Android Automotive 当成 Android Auto 的升级版,忽略“应用运行在车机”这一根本差异。误区二:只关注应用层 UI,忽视系统服务与 HAL 的链路,导致车辆信号读不到、权限被拒。误区三:忽略驾驶安全与多用户约束,做出的功能在真实车辆上无法通过验收。
入门阶段最有效的验证方式:在 AAOS 模拟器上运行 adb shell dumpsys car_service,观察当前车辆属性、电源状态与驾驶状态,把抽象概念对应到真实输出,理解会快很多。