2. 开发环境搭建:AOSP源码下载、车载模拟器配置、编译系统详解、刷机与调试

说实话,车载开发环境搭建这件事,我见过太多人在这里栽跟头了。有人下载源码三天三夜没成功,有人编译到一半硬盘爆了,还有人刷机把设备刷成砖。嗯,今天我就把这些坑一个个给你指出来。

先看一张整体流程图,帮你建立全局认知:

车载AOSP开发环境搭建流程 阶段1:源码下载 repo init + sync 阶段2:编译系统 source build/envsetup.sh 阶段3:模拟器配置 lunch + emulator 阶段4:刷机 fastboot flashall 阶段5:调试 adb logcat + gdb 关键配置要求 • 磁盘:至少250GB(建议500GB SSD) • 内存:至少16GB(建议32GB) • CPU:8核以上,支持KVM虚拟化 • 系统:Ubuntu 20.04 LTS(强烈推荐) • 网络:稳定且能访问Google源 • Python:3.8+,git 2.25+

2.1 AOSP源码下载:别让网络卡住你

源码下载是第一步,也是很多人第一步就卡住的地方。我个人习惯用 repo 工具来管理,Google 官方也是这么推荐的。

先装 repo:

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

然后初始化并同步代码。这里有个关键点——一定要选对分支。车载开发通常用 android-12.0.0_r34 或更新的版本:

mkdir aaos-source
cd aaos-source
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r34
repo sync -j8 -c
⚠️ 警告: 千万别用 -j32 这种参数。我曾经在项目里图快,开了32个线程同步,结果网络直接崩了,还得重新来。建议 -j4 到 -j8 之间,稳定第一。

同步完成后,源码大概 40-60GB。嗯,这只是开始,编译后还会膨胀好几倍。

2.2 车载模拟器配置:没有真车机也能跑

说实话,不是每个团队都有真车机。Google 提供了 Automotive 模拟器,配置起来其实不复杂。

首先确保你的环境支持 KVM:

kvm-ok
# 如果输出 "KVM acceleration can be used",说明没问题

然后编译模拟器镜像:

source build/envsetup.sh
lunch sdk_car_x86_64-userdebug
make -j8

编译完成后启动模拟器:

emulator -avd AAOS_AVD -gpu host -memory 2048 -cores 4
💡 小技巧: 我建议在启动参数里加上 -wipe-data,特别是第一次启动时。不然有时候旧数据会导致奇怪的崩溃,排查起来很头疼。

模拟器启动后,你会看到一个车载中控界面。这时候可以试试用 adb 连接:

adb devices
# 应该能看到 emulator-5554 device

2.3 编译系统详解:别被 Makefile 吓到

AOSP 的编译系统,说白了就是一套基于 Make 的构建框架。但 Google 封装了一层 Soong(用 Go 写的),现在大部分模块都用 Android.bp 文件来配置。

核心流程就三步:

  1. source build/envsetup.sh —— 加载编译环境
  2. lunch <product>-<variant> —— 选择目标产品和编译类型
  3. make -jN —— 开始编译

车载开发常用的 lunch 选项:

产品名 说明 适用场景
sdk_car_x86_64 模拟器用 x86_64 镜像 开发调试
sdk_car_arm64 模拟器用 ARM64 镜像 兼容性测试
aosp_car_x86_64 真车机 x86_64 镜像 实车部署
aosp_car_arm64 真车机 ARM64 镜像 实车部署

编译类型有三种:

  • user —— 正式发布版,没有 root 权限
  • userdebug —— 开发版,有 root 权限,带调试符号
  • eng —— 工程版,最全的调试功能,但性能最差

我的建议: 日常开发用 userdebug。既保留了调试能力,性能又不会太差。我见过有人一直用 eng 编译,结果模拟器卡得鼠标都动不了。

编译单个模块也很方便:

mmm packages/services/Car/
# 或者
make CarService

编译完成后,输出在 out/target/product/<product>/ 目录下。

2.4 刷机与调试:真机验证的最后一公里

模拟器跑通了,下一步就是刷到真车机上。这里我踩过不少坑,一个个说。

首先,进入 fastboot 模式:

adb reboot bootloader
# 或者直接按车机上的物理按键(不同设备不一样)

然后刷机:

fastboot flashall -w
# -w 表示 wipe data,会清空用户数据
⚠️ 警告: 我曾经有一次忘记加 -w 参数,结果刷完后系统一直崩溃。原因是旧数据和新系统不兼容。所以,跨版本刷机一定要 wipe

刷完后重启:

fastboot reboot

调试方面,最常用的就是 adb logcat:

adb logcat -b all | grep CarService
# 只看 CarService 的日志

如果遇到 native 层崩溃,可以用 gdb 调试:

adb shell
gdbserver :5039 --attach <pid>
# 然后在主机上连接
adb forward tcp:5039 tcp:5039
gdbclient <pid>
💡 小技巧: 调试车载应用时,我习惯用 adb shell dumpsys car_service 来查看车辆状态。这个命令能输出当前的车速、车门状态、空调温度等信息,对排查问题特别有用。

还有一个调试利器是 bugreport

adb bugreport bugreport.zip
# 会生成一个包含所有日志、dump、配置的压缩包

嗯,到这里,你的开发环境就搭建好了。接下来就是写代码、编译、调试的循环。记住,环境搭建虽然枯燥,但基础打好了,后面会省很多事。


公众号:蓝海资料掘金营,微信deep3321