4、Android系统搭建:Android 12 AOSP 编译环境搭建、刷机与调试

好,咱们进入正题。这一章要聊的,是座舱测试里最基础也最绕不开的一步——把Android 12的AOSP环境搭起来,然后编译、刷机、调试。说实话,我见过不少测试同事在这块栽跟头,不是编译报错就是刷成砖。其实没那么玄乎,咱们一步步来。

4.1 为什么非得自己编译AOSP?

你可能会问:直接用厂商给的镜像不行吗?嗯,大部分时候可以。但做座舱测试,你免不了要改系统级的东西。比如改个WiFi策略、调个音频通道、甚至加个自定义的HAL层服务。这时候,没有源码在手,你就像个盲人。

我自己在项目里就遇到过:某次需要验证一个车载蓝牙的A2DP延迟问题,厂商的镜像死活不暴露底层log。最后只能自己编译一个userdebug版本,把log等级拉满,问题才定位到。说白了,自己编译AOSP,是你掌控测试深度的第一步。

4.2 硬件与软件环境准备

先说说硬件。编译AOSP 12,机器不能太差。我个人的建议是:

  • CPU:至少8核,16核更舒服。我用的AMD 5950X,编译一次大概40分钟。
  • 内存:32GB起步,64GB不嫌多。你想想看,光是加载源码和中间产物,16GB就捉襟见肘了。
  • 硬盘:必须SSD,建议500GB以上空闲空间。AOSP 12完整编译一次,占用大概200GB左右。
  • 操作系统:Ubuntu 20.04 LTS,这个版本最稳。我试过22.04,有些依赖包会出小问题。
注意:千万别用虚拟机跑编译,除非你时间多到用不完。原生Linux系统是唯一推荐的选择。

4.3 搭建编译环境

环境搭建说白了就是装一堆依赖包。我直接给出一份经过验证的清单:

sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
  lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

这里有个坑:libncurses5 在Ubuntu 20.04的默认源里可能找不到。我曾经在这卡了半小时,最后发现需要手动添加一下源。解决办法很简单:

sudo apt-get install -y libncurses5-dev

如果还报错,试试 libncurses5 的32位版本。嗯,这里要注意,不同Ubuntu小版本可能会有细微差异。

4.4 下载AOSP 12源码

下载源码,我推荐用清华或中科大的镜像站。Google官方的速度,你懂的。用repo工具来管理:

mkdir ~/aosp-12
cd ~/aosp-12
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-12.0.0_r32
repo sync -c -j8

-j8 表示8个线程并行下载。如果你的网络带宽够,可以加到 -j16。我第一次下载时用了 -j4,结果等了一整夜。后来发现,线程数设成CPU核心数的两倍左右,速度最理想。

小技巧:如果下载中途断了,别慌。直接再跑一次 repo sync,它会断点续传。我经常在下载到90%时断网,这招救了我很多次。

4.5 编译AOSP

源码下好了,开始编译。先初始化环境:

source build/envsetup.sh
lunch aosp_car_x86_64-userdebug

这里我选的是 aosp_car_x86_64-userdebug,因为咱们做座舱测试,车机版最合适。userdebug 版本比 user 版本多了root权限和更多调试接口。我个人习惯,只要不是给最终用户用,一律选userdebug。

然后就是编译:

make -j16

第一次编译,时间会比较长。我的机器大概40分钟,如果你的是笔记本,可能得2-3小时。这时候可以去喝杯咖啡,或者看看文档。编译过程中如果报错,多半是依赖包没装全。别慌,看错误日志,缺什么装什么。

核心要点:编译成功后会生成镜像文件,路径在 out/target/product/<设备名>/。你需要关注的主要是 system.imgvendor.imgboot.img 这三个。

4.6 刷机与调试

镜像编译好了,接下来就是刷到设备上。我以常见的Pixel设备为例(车机版同理,只是fastboot命令略有差异):

adb reboot bootloader
fastboot flash system system.img
fastboot flash vendor vendor.img
fastboot flash boot boot.img
fastboot reboot

刷机前,记得备份数据。我曾经有一次手滑,把 fastboot flash boot 写成了 fastboot flash bootloader,结果设备直接变砖。还好Pixel有救砖模式,不然就真凉了。

刷完重启,如果卡在开机动画,别急。等5分钟,如果还不行,可能是镜像有问题。这时候可以进recovery模式,双清一下:

adb reboot recovery
# 在recovery界面选择 wipe data/factory reset

调试方面,我推荐几个必装工具:

  • adb:不用多说,调试必备。
  • fastboot:刷机工具。
  • logcat:看日志,定位问题。我习惯用 adb logcat -v threadtime 看带时间的详细日志。
  • dumpsys:查看系统服务状态。比如 adb shell dumpsys car 可以看车机服务。

4.7 常见问题与避坑指南

最后,分享几个我踩过的坑:

  • 编译时提示内存不足:增加swap空间。我一般设16GB swap,够用。
  • 刷机后无法开机:检查一下 lunch 时选的设备型号对不对。选错了设备,镜像不兼容。
  • adb devices 找不到设备:先检查驱动,再检查USB调试是否开启。有时候换个USB口就好了,别问我怎么知道的。
重要提醒:刷机有风险,操作需谨慎。尤其是车机设备,一旦变砖,维修成本很高。建议先在开发板上练手,再上真车机。

好了,这一章的内容就这些。环境搭好、编译通过、刷机成功,你就迈出了座舱测试的第一步。下一章,咱们聊聊怎么在AOSP上搭建自动化测试框架。到时候见。