1. Android Automotive 概述:什么是 Android Automotive、与 Android Auto 的区别、车载系统架构概览
大家好,我是你们的老朋友。今天咱们正式开讲《Android Automotive 系统服务深度解析》的第一章。
说实话,每次开新课程我都有点小兴奋。尤其是讲车载系统——这个领域变化太快了。几年前大家还在争论“车机到底要不要用安卓”,现在呢?几乎成了标配。
好,咱们直接进入正题。
1.1 什么是 Android Automotive?
Android Automotive,说白了,就是 Google 为汽车量身定制的原生 Android 操作系统。它直接跑在车机的硬件上,不依赖手机。
你想想看,传统车机是什么样?要么是 QNX,要么是 Linux 改一改,再加个定制 UI。每个厂商自己搞一套,底层千奇百怪。开发者想做个导航应用?得适配七八种平台,累死。
Android Automotive 的出现,就是为了解决这个痛点。
它跟手机上的 Android 同源,但做了大量裁剪和增强。比如:
- 去掉了电话、短信等手机专属功能——车机不需要这些
- 增加了车辆相关的 API——比如车速、车门状态、空调控制
- 重新设计了 UI 框架——要适合驾驶场景,不能分散注意力
- 引入了 Car Service——这是车载系统的核心服务,后面我们会花好几章来讲
我记得第一次接触 Automotive 项目时,心里还嘀咕:“这不就是改改 UI 吗?”结果一深入才发现,完全不是那么回事。底层架构、权限模型、生命周期管理,全都不一样。
核心要点:Android Automotive 是一个完整的、独立的操作系统。它运行在车机硬件上,提供车载应用运行环境,并通过 Car Service 与车辆硬件交互。
1.2 Android Automotive 与 Android Auto 的区别
这个问题,我几乎每次培训都会被问到。很多人搞混这两个概念,很正常。名字太像了。
咱们用一个表格来对比,一目了然:
| 对比维度 | Android Automotive | Android Auto |
|---|---|---|
| 运行位置 | 车机硬件上直接运行 | 手机上运行,投射到车机屏幕 |
| 是否需要手机 | 不需要,独立运行 | 必须连接手机 |
| 系统完整性 | 完整的操作系统 | 只是一个应用模式/投射协议 |
| 应用生态 | 专为车载优化的原生应用 | 手机应用的投射版本 |
| 车辆控制能力 | 强,可直接控制车辆硬件 | 弱,只能读取部分信息 |
| 典型代表 | 沃尔沃 Polestar 2、宝马 iDrive 8 | 几乎所有支持 Android Auto 的车型 |
简单来说:Android Auto 是“手机投屏”,Android Automotive 是“车机原生系统”。
我曾经遇到一个客户,非要我们在 Automotive 上跑 Android Auto 的应用。嗯,理论上可以,但体验很差。因为 Android Auto 的应用设计时假设了手机的存在,很多功能依赖手机的网络和传感器。强行移植,反而会出问题。
我的建议:如果你要开发车载应用,先搞清楚目标平台。如果是 Automotive,就按 Automotive 的规范来;如果是 Auto,就按手机应用的标准来。别混着来,容易踩坑。
1.3 车载系统架构概览
好,接下来咱们看看 Android Automotive 的整体架构。这部分很重要,后面的章节都会围绕这个架构展开。
我把架构分成四层,从上到下:
1.3.1 应用层(Application Layer)
这一层就是我们平时看到的那些车载应用:导航、音乐、电话、车辆设置等。
跟手机不同的是,车载应用有严格的驾驶安全约束。比如:
- 驾驶中不能播放视频(除非是副驾或后排)
- 导航应用必须优先显示
- 通知不能弹窗干扰驾驶
这些约束由 Car UX Restrictions 模块管理。嗯,这个模块很有意思,后面我们会专门讲。
1.3.2 框架层(Framework Layer)
这一层是 Android Automotive 的核心。它包含:
- Car Service:车载系统的“大脑”,管理车辆状态、应用生命周期、驾驶模式等
- Car API:提供给应用开发者使用的接口,比如获取车速、控制空调
- Vehicle HAL:硬件抽象层,屏蔽不同厂商的硬件差异
- Car App Library:一些通用的车载 UI 组件和工具类
我个人觉得,Car Service 是整个系统最复杂、也最精彩的部分。它要处理的事情太多了:
- 车辆启动时,要按顺序启动各个服务
- 车辆熄火时,要优雅地关闭,不能丢数据
- 驾驶模式切换时,要通知所有应用
- 还要处理各种车辆事件,比如车门开关、安全带状态
我曾经在一个项目中,Car Service 启动顺序没调好,导致每次车辆启动后,空调要等 30 秒才能响应。用户投诉说“这车机还不如十年前的老车”。后来我们花了整整一周,才把启动时序理顺。
1.3.3 硬件抽象层(HAL Layer)
这一层的作用,说白了就是“让上层代码不关心底层硬件是谁家的”。
Android Automotive 定义了一套标准的 Vehicle HAL 接口。车厂只需要实现这些接口,上层就能正常工作。
比如,获取车速:
// Vehicle HAL 接口定义
public class VehicleHAL {
// 获取当前车速(km/h)
public abstract float getVehicleSpeed();
// 获取发动机转速(rpm)
public abstract int getEngineRpm();
// 控制车窗升降
public abstract void setWindowPosition(int windowId, int position);
}
不同厂商的硬件实现可能完全不同。有的用 CAN 总线,有的用以太网,有的用私有协议。但只要实现了这个接口,上层代码就不用改。
注意:HAL 层的性能很关键。我曾经见过一个项目,HAL 层读取车速的延迟高达 200ms,导致导航应用显示的车速总是慢半拍。用户在高架上开着 120km/h,导航还显示 100km/h,这体验能好吗?所以,HAL 层的实时性一定要保证。
1.3.4 内核层(Kernel Layer)
这一层就是 Linux 内核,加上一些车载相关的驱动和补丁。
Android Automotive 对内核有一些特殊要求:
- 实时性:某些车辆控制需要微秒级的响应
- 安全性:要支持 SELinux,隔离不同应用的权限
- 稳定性:不能随便崩溃,车机死机可不是闹着玩的
嗯,内核层咱们不会深入太多,毕竟这是系统服务课程,不是内核课程。但了解它的存在和职责,还是很有必要的。
1.4 架构图(文字描述)
虽然不能放图片,但我用文字描述一下这个架构的层次关系:
+------------------------------------------+
| 应用层 |
| (导航、音乐、电话、车辆设置等) |
+------------------------------------------+
| 框架层 |
| Car Service | Car API | Vehicle HAL |
| Car App Library | UX Restrictions |
+------------------------------------------+
| 硬件抽象层 |
| Vehicle HAL 实现 (CAN/以太网/私有协议) |
+------------------------------------------+
| 内核层 |
| Linux Kernel + 车载驱动 + SELinux |
+------------------------------------------+
| 硬件层 |
| (SoC、传感器、执行器、总线等) |
+------------------------------------------+
每一层都依赖下一层提供的服务,同时向上层屏蔽细节。这就是分层架构的好处——各司其职,互不干扰。
1.5 本章小结
好,第一章的内容就到这里。咱们回顾一下:
- Android Automotive 是原生车载操作系统,独立运行在车机上
- 它和 Android Auto 是两码事,一个是系统,一个是投屏
- 车载系统架构分四层:应用层、框架层、HAL 层、内核层
- Car Service 是核心,后面我们会重点讲解
下一章,咱们会深入 Car Service 的启动流程。我会带着大家一步步看代码,看看车辆启动时,系统到底在干什么。
到时候见。