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的完整流程。建议保存下来对照操作。

AOSP环境准备流程 1. 硬件与系统要求 CPU≥8核 / RAM≥16GB / 磁盘≥250GB / Ubuntu 20.04 2. 安装Repo与依赖 curl > ~/bin/repo + apt-get install build-essential等 3. repo init / sync 同步源码 选择分支(如android-13.0.0_r41)同步全部仓库 4. 安装JDK + 编译工具链 OpenJDK 11 / gcc / clang / ninja (在prebuilts内) 5. 首次编译验证 source build/envsetup.sh → lunch → make -jN 6. 验证产物 + 确认目录结构 检查out/target/product/ 确保make completed successfully 💡 建议首次编译用eng模式 减少签名验证的问题

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回放框架时,你就能专注在代码逻辑上,不用再被环境折腾了。