2、开发环境搭建:Ubuntu 22.04 LTS安装、AOSP源码下载与编译工具链配置

说实话,做车机移植这件事,环境搭建是第一步,也是最容易让人摔跟头的地方。我见过不少新手,上来就急着下载源码,结果编译到一半发现工具链版本不对,又得重来。嗯,咱们今天就把这事一次说清楚。

2.1 为什么选Ubuntu 22.04 LTS?

你可能要问,为什么非得用这个版本?我用20.04或者24.04行不行?

我个人习惯是跟着Google官方推荐的版本来。AOSP的编译环境对系统库的依赖非常敏感。Ubuntu 22.04 LTS(Jammy Jellyfish)是目前官方文档里明确支持、且社区验证最充分的版本。我在项目中遇到过用20.04编译AOSP 14,结果因为Python版本太低,折腾了两天才搞定。

说白了,选22.04就是图个省心。它的软件包仓库里自带的工具链版本,跟AOSP要求的匹配度最高。

核心要求:Ubuntu 22.04 LTS 64位系统,至少分配100GB磁盘空间(我建议直接给200GB,源码编译一次就能吃掉80GB),内存建议16GB以上。

2.2 安装Ubuntu 22.04 LTS

安装过程我就不啰嗦了,重点说几个坑。

  • 分区建议:把/home单独分出来,至少100GB。因为AOSP源码和编译产物都放在工作目录下,万一系统崩了,源码还在。
  • 语言选择:选英文。中文环境有时候会导致终端里的路径编码问题,虽然能解决,但何必给自己找麻烦?
  • 安装SSH Server:如果你用虚拟机或者远程开发,装完系统第一件事就是打开SSH。命令很简单:sudo apt install openssh-server

我的小技巧:装完系统后,先把软件源换成国内的(比如清华源或阿里源),不然下载依赖包能等到你怀疑人生。

2.3 安装基础依赖包

系统装好了,接下来就是安装编译AOSP所需的基础软件包。别小看这一步,漏掉一个包,编译时就会报莫名其妙的错。

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

嗯,这里有个坑。我记得有一次编译AOSP 13,报了一个libncurses5找不到的错误。查了半天才发现,Ubuntu 22.04默认已经不提供32位的libncurses5了,得手动装。上面那行命令已经帮你避开了这个问题。

2.4 安装OpenJDK 11

AOSP从Android 11开始,就强制要求使用OpenJDK 11了。别想着用JDK 8或者JDK 17糊弄过去,编译脚本会直接报错。

sudo apt install -y openjdk-11-jdk

装完之后,检查一下版本:

java -version
# 输出应该类似:openjdk version "11.0.22" 2024-01-16

注意:如果你系统里之前装了其他版本的JDK,记得用update-alternatives把默认JDK切换到11。我曾经因为忘记切换,编译到一半报错,排查了半小时才发现是JDK版本不对。

2.5 配置Python 3.8

Ubuntu 22.04默认装的是Python 3.10,但AOSP的某些工具(比如repo)对Python 3.8的兼容性最好。我个人习惯是装一个Python 3.8,然后用update-alternatives管理版本。

sudo apt install -y python3.8 python3.8-dev python3.8-venv
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
# 选择默认版本
sudo update-alternatives --config python3

选完之后,验证一下:

python3 --version
# 输出:Python 3.8.x

为什么要这么折腾?因为repo initrepo sync这两个命令,在Python 3.10下偶尔会出现SSL证书验证的问题。我遇到过两次,换成3.8就一切正常了。

2.6 安装GCC/G++

车机移植经常需要编译内核模块和HAL层代码,这些依赖原生的GCC/G++工具链。Ubuntu 22.04自带的GCC 11就够用,但建议把G++也装上。

sudo apt install -y gcc g++ gcc-multilib g++-multilib

验证一下:

gcc --version
g++ --version

这里多说一句。如果你要编译32位的代码(车机上有些老旧的硬件驱动还是32位的),gcc-multilibg++-multilib是必须的。不然链接的时候会报cannot find -lgcc之类的错误。

2.7 下载AOSP源码:repo init与repo sync

终于到了最激动人心的环节——下载源码。但别急,先把repo工具装好。

mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# 把~/bin加入PATH
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc

然后创建一个工作目录,开始初始化:

mkdir ~/aosp
cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1

这里-b参数指定分支。我选的是Android 14的稳定版,因为车机项目一般用最新的稳定版,兼容性最好。

避坑指南:我曾经在repo init时忘记加-b参数,结果下载了master分支的源码。master分支每天都在变,编译到一半可能就出错了。所以,一定要指定一个具体的tag或分支。

初始化成功后,开始同步源码:

repo sync -c -j8

这里-c表示只下载当前分支的代码(不下载其他分支的历史),-j8表示用8个线程并行下载。网速好的话,大概1-2小时能下完。如果网速慢,建议用国内镜像源:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r1
repo sync -c -j8

2.8 验证环境

源码下载完成后,跑一下编译环境的检查脚本,确保所有依赖都到位:

source build/envsetup.sh
lunch

如果lunch命令能正常弹出设备列表,说明环境搭建成功了。你可以选一个目标(比如aosp_x86_64-eng)试试编译:

make -j$(nproc)

第一次编译时间会比较长,大概2-4小时。如果编译通过,恭喜你,开发环境已经完美搭建好了。

我的经验:第一次编译时,建议用make -j4而不是-j$(nproc)。因为如果内存不够(比如只有16GB),开太多线程会导致OOM(内存溢出)。我吃过这个亏,编译到99%的时候崩了,气得我直接加了根内存条。

2.9 小结

环境搭建这件事,说白了就是一次性的体力活。但正因为是一次性的,才更要仔细。我见过太多人因为环境问题浪费了一两天时间。按照上面的步骤来,一步都不要跳,基本不会出问题。

下一章,咱们开始真正进入车机移植的核心——Bootloader和内核的配置。到时候你会用到今天装好的所有工具链。