第二章: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核 |
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 刷入真车机
真车机刷机就复杂多了。不同硬件平台(比如瑞萨、高通、恩智浦)的刷机方式完全不同。这里我只讲通用步骤:
- 进入fastboot模式(通常按住音量减+电源键)
- 解锁bootloader:
fastboot flashing unlock - 刷入镜像:
fastboot flashall -w
2.5 验证环境:跑一个车载语音Demo
环境搭好了,怎么验证?我的习惯是跑一个简单的语音识别Demo。AAOS自带了 CarVoiceInteractionService,你可以用adb发送一个模拟的语音指令:
adb shell am broadcast -a android.car.intent.action.VOICE_COMMAND --es command "打开空调"
如果模拟器里弹出了空调控制界面,恭喜你,环境搭建成功了!
好了,这一章的内容就到这里。下一章我们会深入车载语音交互的架构设计,讲讲AAOS的音频通道和语音唤醒机制。到时候见。