一、车机系统概述:Android Automotive 与 AOSP 的区别

做车机移植这么多年,我经常被问到同一个问题:「Android Automotive 不就是 AOSP 改了个名字吗?」

嗯,这个问题其实挺有代表性的。我刚开始接触车机项目时,也这么想过。但实际动手做起来才发现——差远了

1.1 Android Automotive 是什么?

Android Automotive 是 Google 专门为汽车打造的原生操作系统。它不是一个「改装版」,而是一个从底层就为车载场景设计的独立分支

说白了,AOSP(Android Open Source Project)是给手机、平板用的。而 Automotive 是给车用的。两者虽然共享同一套内核和框架,但上层应用、交互逻辑、硬件抽象层完全不同。

核心区别一:应用生态

  • AOSP:依赖 Google 移动服务(GMS),应用从 Play Store 下载
  • Automotive:内置 Automotive 专用应用(如车载地图、媒体、电话),不支持普通手机应用直接运行

我记得第一次在车机上跑一个普通 AOSP 的 Launcher,结果触摸事件完全不对——因为车机用的是旋钮+触摸板,不是手机那种电容屏滑动。嗯,这个坑我踩过。

1.2 两者在架构上的差异

对比项 AOSP Android Automotive
窗口管理 单窗口、多任务 多窗口、分屏、画中画(车载专用)
输入系统 触摸为主 触摸+旋钮+方向盘按键+语音
电源管理 手机待机/休眠 车辆点火/熄火、深度睡眠、快速唤醒
音频策略 单一音频焦点 多音频区域(导航、电话、媒体独立控制)
安全认证 Google 认证 Automotive 认证 + 车规级安全要求

你想想看,手机可以随便关机重启,但车机不行。车在行驶中,导航突然重启?那可不是闹着玩的。所以 Automotive 在稳定性、实时性、安全性上做了大量定制。

我的建议:如果你是从 AOSP 转过来做 Automotive,第一件事就是忘掉手机那套电源管理逻辑。车机的「熄火不关机」机制,会让你重新理解什么叫「系统休眠」。

二、车机硬件架构:SoC、MCU、GPU

车机的硬件架构,说白了就是「一个大脑 + 一个管家 + 一个画师」

2.1 SoC(系统级芯片)—— 大脑

SoC 是车机的核心计算单元。它集成了 CPU、GPU、DSP、ISP、NPU 等模块。目前主流的有高通 SA8155/8295、瑞萨 R-Car H3、NXP i.MX8 等。

我个人习惯把 SoC 比作「车机的心脏」。它决定了系统的流畅度、应用启动速度、多任务能力。

选型时要注意:

  • CPU 核心数:至少 4 核,推荐 8 核(A76/A78 架构)
  • 制程工艺:7nm 以下(散热和功耗更友好)
  • 车规级温度范围:-40°C ~ 85°C(消费级芯片扛不住)

我曾经在一个项目里用了消费级 SoC,结果夏天暴晒后车机直接死机。嗯,那之后我再也不敢省这个钱了。

2.2 MCU(微控制器)—— 管家

MCU 负责车机的实时控制安全相关任务。它不跑 Android,而是跑 RTOS(实时操作系统)。

为什么需要 MCU?因为 Android 不是实时系统。你想想看,刹车信号来了,Android 还在 GC(垃圾回收)?那后果不堪设想。

MCU 负责的事情包括:

  • 电源管理(点火/熄火时序)
  • CAN 总线通信(车速、车门、灯光等)
  • 安全监控(看门狗、温度检测)
  • 唤醒管理(蓝牙、Wi-Fi、语音唤醒)

注意:MCU 和 SoC 之间通常通过 SPI/UART/I2C 通信。我曾经遇到过 MCU 发送的 CAN 数据包被 SoC 的 Android 层延迟处理,导致仪表显示滞后。解决方案是在 MCU 端做数据缓存和优先级标记。

2.3 GPU(图形处理器)—— 画师

车机的 GPU 不仅要渲染 UI,还要处理仪表盘、导航地图、360° 全景影像。这比手机游戏的要求高多了。

目前主流车机 GPU 有:

  • 高通 Adreno 系列(SA8155 配 Adreno 640)
  • ARM Mali 系列(瑞萨 R-Car 配 G610)
  • Imagination PowerVR 系列(部分老平台)

我建议你在选 GPU 时,重点关注多图层合成能力。车机 UI 通常有 4-6 个图层(导航、媒体、仪表、HUD、倒车影像等),GPU 需要同时合成并输出到不同屏幕。

避坑指南:我曾经在一个项目里用了低端 GPU,结果 360° 全景影像的拼接算法跑不动,画面延迟超过 200ms。后来换了 Adreno 640,延迟降到 30ms 以内。所以,GPU 的钱不能省。

三、车机软件分层:应用层、框架层、HAL层、内核层

车机的软件架构,和手机 Android 类似,但每一层都有车载特有的定制。我按从顶到下的顺序给你捋一遍。

3.1 应用层(Application Layer)

这一层是用户直接看到的。包括:

  • Launcher(主界面)
  • 车载地图(高德、百度、Google Maps)
  • 媒体播放(音乐、电台、视频)
  • 电话/通讯
  • 车辆设置(空调、座椅、灯光)
  • 仪表盘应用(速度、转速、续航)

应用层开发,说白了就是写 Android App。但要注意:车机应用不能随便用第三方 SDK。比如定位服务,必须用车载专用的高精度定位 API,而不是手机那种粗略定位。

3.2 框架层(Framework Layer)

框架层是 Android 的核心。在车机上,Google 新增了以下关键模块:

  • CarService:车机服务的核心,管理车辆状态、驾驶模式、车辆属性
  • CarAudioService:多音频区域管理(导航、电话、媒体独立音量)
  • CarInputService:旋钮、方向盘按键、触摸板等输入设备管理
  • CarProjectionService:手机投屏(Android Auto / CarPlay)
  • VehicleHalManager:车辆硬件抽象层管理

重点:框架层是移植工作的核心。你需要修改 CarService 来适配你的车辆属性(VHAL),修改 CarAudioService 来适配你的音频路由,修改 CarInputService 来适配你的物理按键。

3.3 HAL 层(Hardware Abstraction Layer)

HAL 层是 Android 和硬件之间的桥梁。在车机上,最重要的 HAL 是:

  • Vehicle HAL(VHAL):车辆属性接口(车速、车门、空调、灯光等)
  • Audio HAL:音频路由和混音
  • Camera HAL:车载摄像头(倒车影像、环视)
  • Display HAL:多屏显示(中控、仪表、HUD)
  • Sensors HAL:车辆传感器(GPS、IMU、轮速)

我做过最头疼的事,就是写 VHAL。每个车厂的 CAN 协议都不一样,你需要把 CAN 信号解析成 Android 能理解的 VehicleProperty。比如车速信号,有的车厂用 km/h,有的用 mph,还有的用脉冲数。嗯,这个坑我踩过不止一次。

注意:VHAL 的实现必须考虑实时性。我曾经见过一个项目,VHAL 通过 Java 层轮询 CAN 数据,结果延迟超过 500ms。正确的做法是在 Native 层用 C++ 实现,通过共享内存或 Binder 回调给 Java 层。

3.4 内核层(Kernel Layer)

内核层是 Android 的基础。在车机上,你需要关注:

  • Linux 内核版本:推荐 5.10 以上(支持更多车规级驱动)
  • 设备树(Device Tree):描述硬件拓扑(SoC、外设、内存映射)
  • 驱动开发:CAN 驱动、GPIO 驱动、I2C/SPI 驱动、显示驱动
  • 电源管理:suspend/resume、wakeup sources、regulator
  • 安全模块:SELinux、dm-verity、AVB(Android Verified Boot)

我个人习惯把内核层比作「地基」。地基不稳,上面盖的楼再漂亮也没用。我见过太多项目,应用层改得花里胡哨,结果内核驱动一塌糊涂,系统三天两头死机。

我的经验:移植车机系统,70% 的工作量在内核和 HAL 层。应用层反而是最简单的。所以,别急着写 UI,先把底层调稳了再说。

小结

这一章我们聊了:

  • Android Automotive 和 AOSP 的区别——不是改名,是重写
  • 车机硬件架构——SoC 是大脑,MCU 是管家,GPU 是画师
  • 车机软件分层——应用层、框架层、HAL 层、内核层,每一层都有坑

下一章,我会带你搭建车机开发环境,包括 AOSP 源码下载、编译工具链配置、模拟器调试。到时候咱们手把手操作,你就能真正感受到车机移植的乐趣了。

嗯,今天就到这里。有什么问题,欢迎随时交流。