2. 车载系统基础
说实话,搭建开发环境这件事,看着文档多,其实就三大块:源码怎么拉下来、编译环境怎么配、跑起来怎么调。我当年第一次搭 Automotive 环境时,光 repo sync 就重来了三回——不是网络断了,就是磁盘满了。这一章我把踩过的坑都摊开讲,你照着做就行。
2.1 硬件与系统要求
先别急着敲命令。看看你的机器够不够格。Android Automotive 的源码比手机 AOSP 还大,因为多了车机专用服务和 HAL。
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU 核心数 | 8 核 | 16 核及以上 |
| 内存 | 16 GB | 32 GB 或 64 GB |
| 磁盘空间 | 250 GB(源码 + 编译输出) | 500 GB SSD |
| 操作系统 | Ubuntu 20.04 LTS | Ubuntu 22.04 LTS |
| 网络 | 100 Mbps | 500 Mbps,稳定不丢包 |
2.2 AOSP 源码下载
下载 AOSP 源码,核心工具就两个:repo 和 git。repo 是 Google 用来管理多 Git 仓库的脚本,说白了就是批量操作工具。
2.2.1 安装依赖包
sudo apt update
sudo apt 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 22.04 上可能装不上,换成 libncurses5-dev 就行。我上次重装系统就卡在这一步,折腾了半小时。
2.2.2 安装 Repo 工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
记得把 export PATH=~/bin:$PATH 加到 ~/.bashrc 里,不然每次开终端都要重新 export。
2.2.3 初始化与同步
创建一个工作目录,比如 ~/aosp_automotive。然后初始化 Automotive 分支:
mkdir ~/aosp_automotive && cd ~/aosp_automotive
repo init -u https://android.googlesource.com/platform/manifest \
-b android-14.0.0_r30 --depth=1
repo sync -c -j8
--depth=1 只拉最新版本,不拉历史记录。能省 30% 的下载量。我第一次没加这个参数,多下了 40 GB 没用的 Git 历史。
-j8 是并行线程数,一般设成 CPU 核心数的 1.5 倍。网络好的话可以开到 -j16。
2.2.4 网络问题处理
国内下载 AOSP 经常断流。我建议用镜像站:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest \
-b android-14.0.0_r30 --depth=1
如果中途断了,重新执行 repo sync 会断点续传,不用从头再来。
2.3 编译环境配置
源码拉完了,接下来配编译环境。Android 编译依赖 JDK、Python 和一些系统库。
2.3.1 安装 JDK
Android 14 需要 OpenJDK 17:
sudo apt install openjdk-17-jdk
java -version
输出应该是 openjdk version "17.0.x"。如果系统里有多个 JDK,用 update-alternatives 切换。
2.3.2 安装 Python 与工具链
sudo apt install python3 python3-pip
sudo pip3 install meson ninja
Meson 和 Ninja 是 Android 14 开始用的新构建系统,比老式的 Make 快不少。
2.3.3 配置 ccache(加速编译)
ccache 能缓存编译中间文件。第二次编译能快 50% 以上。
sudo apt install ccache
echo 'export USE_CCACHE=1' >> ~/.bashrc
echo 'export CCACHE_DIR=~/.ccache' >> ~/.bashrc
source ~/.bashrc
ccache -M 50G
缓存大小我一般设 50 GB。太小了命中率低,太大了浪费磁盘。
2.4 编译 Automotive 系统
环境配好了,开始编译。Automotive 的编译命令和手机版略有不同。
2.4.1 选择目标设备
先加载编译环境:
source build/envsetup.sh
然后选择目标。模拟器用这个:
lunch sdk_car_x86_64-userdebug
真机的话,比如 Raspberry Pi 4:
lunch aosp_car_arm64-userdebug
| 目标名称 | 架构 | 适用场景 |
|---|---|---|
| sdk_car_x86_64-userdebug | x86_64 | 模拟器调试 |
| aosp_car_arm64-userdebug | ARM64 | 真机(RPi4、开发板) |
| aosp_car_x86_64-user | x86_64 | 性能测试(无 root) |
2.4.2 执行编译
make -j$(nproc)
$(nproc) 自动获取 CPU 核心数。第一次编译大概 2-4 小时,看机器配置。我 16 核的机器大概 1 小时 40 分钟。
out/target/product/ 下。模拟器镜像在 sdk_car_x86_64/ 目录里。
2.5 模拟器调试环境搭建
编译完了,先跑模拟器看看效果。不用真机也能调大部分车机功能。
2.5.1 启动模拟器
source build/envsetup.sh
lunch sdk_car_x86_64-userdebug
emulator -no-window -gpu swiftshader_indirect
-no-window 适合服务器环境。-gpu swiftshader_indirect 用软件渲染,兼容性好。
如果想看界面,去掉 -no-window:
emulator -gpu swiftshader_indirect
2.5.2 模拟器常用命令
- adb shell — 进入模拟器终端
- adb logcat — 查看日志
- adb install — 安装 APK
- adb reboot — 重启模拟器
logcat 实时看日志,另一个执行命令。这样出问题能立刻定位。
2.6 真机调试环境搭建
模拟器够用,但有些功能——比如 CAN 总线、GPS 模拟、车载传感器——必须上真机。
2.6.1 刷机准备
真机调试需要解锁 bootloader。不同设备方法不同,但通用步骤是:
- 开启开发者选项,勾选 OEM 解锁 和 USB 调试
- 进入 fastboot 模式(关机后按特定键组合)
- 执行
fastboot flashing unlock - 刷入编译好的镜像:
fastboot flashall
2.6.2 配置 USB 权限
Linux 下 adb 需要 udev 规则:
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666"' | \
sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
idVendor 是设备厂商 ID。Google 是 18d1,其他厂商可以查表。
2.6.3 验证连接
adb devices
输出应该显示设备序列号。如果显示 unauthorized,在手机上确认授权就行。
2.7 开发环境全景图
下面这张图把整个流程串起来了。从源码下载到真机调试,每一步都有对应工具和产物。
2.8 常见问题与避坑指南
最后,我把这些年遇到的高频问题列出来。你遇到类似情况,直接翻这里。
| 问题 | 原因 | 解决方案 |
|---|---|---|
| repo sync 卡住不动 | 网络不稳定或 Git 连接超时 | 换镜像源,或加 --jobs=4 降低并发 |
编译报错 Out of memory |
内存不足,Swap 没开 | 加 16 GB Swap,或降低 -j 线程数 |
| 模拟器启动黑屏 | GPU 渲染模式不对 | 加 -gpu swiftshader_indirect |
| adb 找不到设备 | udev 规则没配或 USB 线不行 | 检查 lsusb,配 udev,换线 |
| 刷机后无限重启 | 镜像版本不匹配或分区损坏 | 重新 fastboot flashall,必要时擦除 userdata |
lunch 选错了目标——用了手机版的 aosp_x86_64,不是 Automotive 的 sdk_car_x86_64。所以,lunch 一定要选带 car 的。