第1章:开发环境搭建——AOSP源码下载、编译环境配置(Ubuntu)、搭建车载模拟器、使用真机调试

做车载Android系统定制,第一步就是搭环境。这事儿说难不难,说简单吧,坑是真不少。我这些年带过不少新人,十有八九都卡在环境搭建这一步。今天我就把压箱底的经验掏出来,带你把这关过了。

1.1 AOSP源码下载——别让网络成了拦路虎

下载AOSP源码,说白了就是跟Google的服务器打交道。国内网络环境你懂的,直接repo sync大概率会超时。我建议你这么做:

核心思路:用清华或中科大的镜像站,速度能快10倍不止。

先安装repo工具:

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

然后初始化AOSP仓库:

mkdir aosp-car
cd aosp-car
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r30

这里我选了Android 13的tag。为什么选这个?因为车载系统通常需要比较新的内核和HAL层支持,13的稳定性在车机上已经验证过了。

同步代码:

repo sync -c -j8

-j8表示8个线程并行下载。你机器核多可以调大,但别超过16,否则磁盘IO会成为瓶颈。我在项目上遇到过有人开32线程,结果硬盘直接跑满100%,反而更慢。

小技巧:如果中途断了,再跑一次repo sync就行,它会断点续传。我曾经连着下了三天才搞定全套代码,中间断了十几次,别慌。

1.2 编译环境配置——Ubuntu 20.04是最稳的选择

编译AOSP对系统有要求。我踩过不少坑,最后发现Ubuntu 20.04 LTS是最省心的。18.04的gcc版本太老,22.04又太新,有些依赖包还没适配好。

安装必要依赖:

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

嗯,这里要注意,不同Android版本依赖包会有差异。Android 13需要Python 3.8以上,而系统自带的可能是3.6。我建议用pyenv管理Python版本:

curl https://pyenv.run | bash
pyenv install 3.9.10
pyenv global 3.9.10

Java环境也别忘:

sudo apt-get install -y openjdk-11-jdk

为什么不用JDK 17?Android 13的构建系统对JDK 17支持还不完善,我试过,编译到一半会报错。老老实实用JDK 11最稳。

避坑指南:我曾经在Ubuntu 22.04上折腾了整整两天,就为了搞定一个libncurses5的兼容性问题。后来发现20.04根本不会有这个问题。所以,听我一句劝,别在系统版本上搞创新。

1.3 搭建车载模拟器——没有真车机也能调试

车载模拟器和普通手机模拟器不一样。它需要模拟车载特有的硬件环境,比如CAN总线、多屏显示、方向盘按键等。

Google官方提供了Automotive模拟器镜像,但说实话,不太好用。我推荐用Cuttlefish,它是AOSP自带的虚拟化方案。

编译Cuttlefish镜像:

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

编译完成后启动:

cvd start

你会看到一个车载系统的模拟器窗口弹出来。第一次启动会比较慢,因为要创建磁盘镜像。之后启动就快多了。

核心配置:模拟器默认是单屏,车载系统通常需要双屏甚至三屏。修改device/google/cuttlefish/shared/config/vehicle_config.pb可以增加屏幕数量。

我个人习惯在模拟器里先验证UI逻辑和基本功能,等稳定了再烧到真机上。这样能省不少时间,毕竟真机刷机一次要十几分钟。

1.4 使用真机调试——从刷机到logcat

真机调试是绕不开的。车载开发板常见的有Renesas R-Car、Qualcomm SA8155、NXP i.MX8等。我以R-Car为例说说流程。

刷机前先解锁bootloader:

fastboot flashing unlock
fastboot oem unlock

然后刷入编译好的镜像:

fastboot flash bootloader u-boot.bin
fastboot flash system system.img
fastboot flash vendor vendor.img
fastboot reboot

刷完后用adb连接:

adb devices
adb logcat -b all

这里有个坑:车载设备通常通过USB转串口连接,adb可能识别不到。你需要先确认驱动装好了。在Ubuntu上,可以这样检查:

lsusb | grep "Qualcomm\|Renesas\|NXP"

如果看不到设备,多半是udev规则没配。创建一个/etc/udev/rules.d/51-android.rules文件,写入:

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

然后重启udev服务:

sudo service udev restart

调试技巧:车载系统经常遇到休眠唤醒的问题。用adb shell dumpsys power可以查看电源状态,用adb shell dumpsys car_service可以查看车载服务状态。这两个命令我几乎天天用。

1.5 本章知识体系总览

下面这张图把整个开发环境搭建的流程串起来了。你跟着这个路线走,基本不会迷路。

车载Android开发环境搭建流程 1. AOSP源码下载 repo init + repo sync 2. 编译环境配置 Ubuntu 20.04 + 依赖包 3. 编译AOSP lunch + make -j8 4a. 搭建车载模拟器 Cuttlefish / Android Automotive Emulator 多屏配置、CAN模拟 4b. 真机调试 fastboot刷机 + adb连接 logcat + dumpsys调试 可用的车载Android开发环境 源码 环境 编译 调试

这张图把整个流程分成了五个阶段。你会发现,模拟器和真机调试是并行的两条路。我个人的建议是:前期用模拟器快速迭代UI和逻辑,中期用真机验证硬件相关功能,后期两者结合做回归测试。

1.6 常见问题与解决方案

问题 原因 解决方案
repo sync超时 网络不稳定或GFW干扰 使用清华/中科大镜像,或设置HTTP代理
编译报错"missing libncurses5" 系统版本过高,依赖包不兼容 安装libncurses5-dev,或换Ubuntu 20.04
模拟器启动黑屏 缺少GPU加速或内存不足 启用KVM,分配至少4GB内存
adb识别不到设备 udev规则未配置或驱动问题 配置51-android.rules,重启udev服务
刷机后设备无限重启 bootloader版本不匹配 确认u-boot版本与内核一致,重新烧录

重要提醒:车载开发板和普通手机不一样,有些板子有硬件加密芯片,刷机前一定要备份原始镜像。我曾经手快把一台R-Car H3的bootloader刷坏了,花了三天才从厂家要到恢复工具。嗯,血的教训。

好了,环境搭建这部分就讲到这里。你跟着步骤走,应该半天内就能把整套环境跑起来。下一章我们会深入AOSP的目录结构,看看车载系统到底改了哪些东西。


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