4. 环境准备:AOSP源码下载与编译环境归纳总结
说实话,做AOSP测试Mock回放框架,最难的不是写代码,而是先把环境搭对。我见过太多人卡在repo sync这一步,一卡就是一整天。
这一章我就把自己的实践经验摊开讲。你跟着走,应该能少踩几个坑。
4.1 硬件与操作系统要求
先聊硬件。AOSP编译非常吃资源。我个人的建议是:
- CPU:至少8核,16核更舒服。我当初用4核笔记本编译一次花了6小时……后来换了工作站,32核,40分钟搞定。
- 内存:16GB起步,32GB是安全线。编译时内存不够直接OOM,你想想看,等了两小时突然崩了。
- 磁盘:至少250GB空闲空间。一个AOSP完整树加编译产物,轻轻松松吃掉200GB。最好用SSD,机械盘会慢到怀疑人生。
操作系统推荐Ubuntu 18.04或20.04 LTS。我个人一直用20.04,兼容性最好。注意不要用Windows或macOS直接搞,AOSP原生只支持Linux。
我曾经遇到过:用Ubuntu 22.04编译AOSP 12,结果一堆库版本不兼容,修了两天依赖才搞定。所以尽量按官方推荐走,别追新。
4.2 AOSP源码下载
下载源码是第一步,也是最容易出问题的环节。你要做两件事:配置Repo工具,然后同步代码。
4.2.1 安装Repo
Repo是Google用来管理多Git仓库的工具。安装很简单:
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin
记得把 export 加到 ~/.bashrc 里,不然每次开终端都要重新设。
4.2.2 选择分支与初始化
根据你想回放的AOSP版本,选一个稳定分支。我一般用 android-13.0.0_r41。初始化命令:
mkdir aosp-13
cd aosp-13
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
如果你在墙内,建议用清华或中科大的镜像,速度快很多:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r41
关键点:repo init 之后会下载一个 .repo 目录,里面只有清单文件,不是真正的代码。你还需要执行 repo sync 来拉取所有仓库。
4.2.3 同步代码
这是最耗时的步骤。同步命令:
repo sync -j8 -c
参数解释:-j8 表示8个并行任务,看你的CPU核数来调。 -c 表示只下载当前分支,能省不少流量和时间。
我个人的经验:第一次同步建议用 -j4,网络稳定后再加高并行。太多并行请求容易被服务器限流。
同步过程中如果中断,重新执行同样的命令就行,它不会重新下载已完成的部分。
4.3 编译环境搭建
代码下完了,还编译不了。你得把编译工具链装好。
4.3.1 安装必要依赖
Ubuntu 20.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 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev \
libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
不同Android版本可能还有额外依赖。我建议你直接看官方文档的“Initializing a Build Environment”一节,那里列得最全。
4.3.2 JDK版本
AOSP 13 以下用 OpenJDK 8/11,Android 13 开始推荐 OpenJDK 11。安装:
sudo apt-get install openjdk-11-jdk
检查版本:
java -version
避坑指南:我曾经用JDK 17去编译AOSP 12,结果编译中途报了一堆类型推断错误。老老实实换回JDK 11就过了。别乱升级。
4.3.3 磁盘空间与文件系统
编译过程中会产生大量临时文件。确保你的磁盘格式是 ext4,不要用 NTFS 或 exFAT,那些坑到让你哭。
我习惯在编译前先运行:
df -h
确认 /home 或你的工作分区至少有 200GB 以上。如果不够,通过软链接把 out/ 目录挪到其他大分区也行。
4.4 首次编译测试
环境搭好了,先编译一个最小镜像验证一下。从AOSP根目录执行:
source build/envsetup.sh
lunch aosp_x86_64-eng
make -j16
-j后面的数字建议是CPU线程数的1.5到2倍。如果内存不大,就用线程数等值。
编译成功后,你会看到类似这样的输出:
#### make completed successfully (01:31:56 (hh:mm:ss)) ####
嗯,看到这个就说明环境完全OK了。
注意:第一次编译很可能失败,因为有些依赖没装全。看报错信息,缺什么就 apt-get install 什么。别慌,这是常态。
4.5 环境验证与工作目录结构
为了后续搭建Mock回放框架,你还需要确认一些关键路径:
| 路径 | 说明 | 是否必须 |
|---|---|---|
prebuilts/ |
预编译工具链(clang、ninja等) | 是 |
out/target/product/ |
编译产物目录,镜像、符号表都在这里 | 是 |
frameworks/base/ |
基础框架代码,我们主要Mock的目标 | 是 |
system/core/ |
核心系统组件,也经常需要修改 | 建议 |
vendor/ |
厂商扩展代码,如果只做AOSP Mock可能用不到 | 可选 |
我的习惯是:立刻编译一次后,把 out/ 目录做个软链接到独立分区,避免后续空间不足。同时把 lunch 那条命令加到 ~/.bashrc 里,方便每次开终端直接 build。
4.6 本章知识体系图
下面这张图帮你理清从零到能编译AOSP的完整流程。建议保存下来对照操作。
4.7 常见问题与速查
我整理了一个小表格,遇到问题先看一眼:
| 问题 | 原因 | 解决 |
|---|---|---|
| repo sync 卡在 99% | 网络波动导致某个仓库没拉完 | 直接 Ctrl+C 重跑,不要清 .repo |
编译报错 missing libncurses.so |
32位库没装 | sudo apt install libncurses5:i386 |
java.lang.UnsupportedClassVersionError |
JDK版本不对 | 切换成OpenJDK 11 |
| 磁盘空间不足 | out/ 占用太大 | 用 df -h 检查,然后 rm -rf out/ 再重编 |
环境准备这部分,说难不难,说简单也容易翻车。我建议你先把虚拟机开出来,严格按照上面的顺序走一遍,至少通一次。后面搭建Mock回放框架时,你就能专注在代码逻辑上,不用再被环境折腾了。