1. 课程导入
Android Automotive(常缩写为 AAOS,Android Automotive OS)是 Google 面向汽车座舱推出的、以 Android 为基座的完整车载操作系统。它不是把手机投屏到车机上的“外挂方案”,而是直接运行在车机硬件上的原生系统:系统启动后由车载 HAL 与车辆总线交互,由 SystemServer 拉起一整套系统服务,再由 Launcher、设置、媒体、导航等应用呈现给用户。理解这一点,是后续所有系统服务开发工作的起点。
一、核心原理:AAOS 的分层结构与系统服务的位置
AAOS 在传统 Android 架构上增加了车载专属层。自下而上可以概括为:硬件与车辆总线(CAN/LIN/以太网)→ 车载 HAL(Vehicle HAL、CarPowerManagement、CarAudio 等)→ 原生库与运行时 → 系统服务层(CarService 及其子服务、SystemServer 中的各类 Manager)→ 应用框架 API(Car API、CarPropertyManager 等)→ 车载应用。系统服务开发者的主战场,集中在“车载 HAL 之上、应用 API 之下”的这一层。
其中 CarService 是车载能力的汇聚点,它把车辆属性、电源状态、驾驶状态、乘员信息等抽象为可被应用订阅的属性与回调;而 SystemServer 中的 ActivityManagerService、WindowManagerService、PackageManagerService 等则决定了应用能否启动、窗口能否显示、权限能否授予。二者协同,才构成完整的车载系统行为。
二、发展历程:从投屏到原生车载 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 策略;最后进入实战,完成一个自定义车载服务并让应用成功调用。
adb shell dumpsys car_service,观察当前车辆属性、电源状态与驾驶状态,把抽象概念对应到真实输出,理解会快很多。