第二章:Android Automotive平台搭建:AAOS模拟器配置、开发环境搭建、AOSP源码编译与刷机

好,咱们直接进入正题。这一章,说白了就是教你如何把Android Automotive的开发环境给“支棱”起来。很多朋友刚开始接触AAOS,最头疼的就是环境搭建——各种依赖、各种报错,搞不好一天都搭不起来。我当年第一次搞AOSP编译,光同步源码就花了整整一个下午,结果编译到一半硬盘满了……嗯,这些坑咱们今天都得填上。

2.1 AAOS模拟器配置:从零开始跑起来

我个人习惯,先搞定模拟器。为啥?因为真机刷机太费时间,而且不是每个人都有开发板。AAOS的模拟器,其实就是在标准Android模拟器的基础上,加了一套车载的HAL和UI。

2.1.1 下载预构建的AAOS模拟器镜像

Google官方其实提供了预编译好的AAOS模拟器镜像。你不需要自己编译,直接下载就能用。我建议你从 ci.android.com 或者 source.android.com 上找最新的 aosp_car_x86_64-userdebug 版本。

小提示: 记得选 userdebug 版本,不是 user 版本。userdebug 带root权限,调试起来方便很多。我在项目中吃过亏,用user版本连log都抓不全。

2.1.2 创建并启动AAOS模拟器

下载完镜像后,用Android Studio的AVD Manager创建模拟器。这里有个关键点:必须选择“Automotive”类型的设备定义。普通的手机模拟器定义是跑不了车载界面的。

# 命令行启动方式(更推荐,方便调试)
emulator -avd AAOS_AVD_NAME -netdelay none -netspeed full -no-snapshot -wipe-data

为什么要加 -wipe-data?因为车载模拟器经常会有一些状态残留,比如导航的模拟位置信息。我每次启动都习惯清一下数据,避免奇奇怪怪的问题。

2.2 开发环境搭建:工欲善其事,必先利其器

开发环境这块,我踩过的坑最多。尤其是Ubuntu版本和JDK版本的匹配问题,能让人崩溃。

2.2.1 操作系统与硬件要求

项目 推荐配置 最低配置
操作系统 Ubuntu 22.04 LTS (x86_64) Ubuntu 20.04 LTS
内存 64 GB 32 GB
磁盘 500 GB SSD (剩余空间) 250 GB SSD
CPU 16核以上 8核
警告: 千万别用Windows子系统WSL2来编译AOSP!我曾经试过,编译到一半文件系统就崩了。老老实实用原生Linux或者Docker。

2.2.2 安装必要依赖包

嗯,这里有个小技巧。不要一个一个手动装,直接复制下面这个命令,一次性搞定。

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

为什么我要列这么多?因为少一个包,编译的时候就会报一个莫名其妙的错。你想想看,编译到一半停下来装包,多耽误事。

2.2.3 安装Repo工具与配置Git

Repo是Google用来管理AOSP多仓库的神器。配置其实很简单,但有个坑:记得设置git的用户名和邮箱,不然repo sync会报错。

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

# 配置git
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

2.3 AOSP源码编译:第一次编译的仪式感

第一次编译AOSP,就像程序员的一种仪式。我记得我第一次编译成功时,看到终端里出现 #### build completed successfully ####,那种成就感,嗯,比写出一段完美的代码还爽。

2.3.1 同步AAOS源码

这里要特别注意:AAOS的源码分支和手机版不一样。我们要选 android-14.0.0_r30 这种带车载支持的分支。

mkdir aaos-source
cd aaos-source
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r30
repo sync -j8 -c --no-tags

-j8 表示8个线程并行下载。如果你的网络带宽够大,可以改成 -j16 甚至 -j32。但注意,不要超过你CPU核心数的两倍,否则反而会变慢。

避坑指南: 我曾经在同步源码时,因为网络不稳定导致中途失败。后来我加了个 --fail-fast 参数,一旦失败就停下来,方便排查。你也可以用 repo sync -j8 --force-sync 来强制覆盖本地修改。

2.3.2 选择编译目标

编译AAOS,目标产品和手机不一样。我们要选 aosp_car_x86_64-userdebug

source build/envsetup.sh
lunch aosp_car_x86_64-userdebug

为什么选x86_64?因为模拟器跑在x86架构上,编译成ARM的话,模拟器里还要跑一层翻译,性能会打折扣。如果你有真车机(比如高通8155),那才需要编译ARM版本。

2.3.3 开始编译

编译命令很简单,但等待时间不简单。第一次编译,即使是顶配机器,也要1-2小时。

make -j16 2>&1 | tee build.log

这里我习惯把日志输出到文件。为什么?因为编译过程中如果报错,终端滚动太快根本看不清。用 tee 命令,既能在屏幕上看进度,又能保存日志方便事后排查。

2.4 刷机:把系统烧进模拟器或真机

编译完成后,你会得到一堆镜像文件。怎么用?分两种情况。

2.4.1 刷入模拟器

模拟器刷机最简单,一条命令搞定:

emulator -kernel prebuilts/qemu-kernel/x86_64/5.15/kernel-qemu -system out/target/product/emulator_car_x86_64/system.img -vendor out/target/product/emulator_car_x86_64/vendor.img -ramdisk out/target/product/emulator_car_x86_64/ramdisk.img -wipe-data -no-snapshot

嗯,这里要注意:kernel文件不要用错了。AAOS模拟器必须用5.15版本的内核,老版本内核不支持车载的一些HAL接口。

2.4.2 刷入真车机

真车机刷机就复杂多了。不同硬件平台(比如瑞萨、高通、恩智浦)的刷机方式完全不同。这里我只讲通用步骤:

  1. 进入fastboot模式(通常按住音量减+电源键)
  2. 解锁bootloader:fastboot flashing unlock
  3. 刷入镜像:fastboot flashall -w
警告: 刷真机前,一定要确认你的镜像和硬件平台匹配。我见过有人把高通平台的镜像刷到瑞萨板子上,结果屏幕直接黑掉,最后只能拆机短接恢复。千万别干这种傻事。

2.5 验证环境:跑一个车载语音Demo

环境搭好了,怎么验证?我的习惯是跑一个简单的语音识别Demo。AAOS自带了 CarVoiceInteractionService,你可以用adb发送一个模拟的语音指令:

adb shell am broadcast -a android.car.intent.action.VOICE_COMMAND --es command "打开空调"

如果模拟器里弹出了空调控制界面,恭喜你,环境搭建成功了!

好了,这一章的内容就到这里。下一章我们会深入车载语音交互的架构设计,讲讲AAOS的音频通道和语音唤醒机制。到时候见。