2、源码下载与编译:配置Repo环境、下载AOSP源码、选择编译目标、执行编译

好,咱们进入正题。上一章我们把开发环境搞定了,这一章就来干点真活——把AOSP源码拉下来,然后编译它。

说实话,我第一次搞这个的时候,光是下载源码就折腾了两天。网速慢、硬盘不够、Repo配置出错……各种坑踩了个遍。今天我把这些经验都揉碎了讲给你听,争取让你一次搞定。

2.1 配置Repo环境

Repo是Google专门为AOSP开发的一个工具。说白了,它就是Git的“管家”——帮你管理几百个Git仓库。

你想想看,AOSP有几百个独立的Git仓库,要是每个都手动clone、同步,那不得累死?Repo就是干这个的。

2.1.1 安装Repo

安装Repo其实很简单,就几步:

# 创建bin目录
mkdir -p ~/bin

# 下载Repo脚本
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

# 加执行权限
chmod a+x ~/bin/repo

# 加到PATH里
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc

嗯,这里要注意一点。如果你在墙内,上面的URL可能访问不了。我遇到过这种情况,当时用的是清华的镜像:

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
小提示:Repo其实是个Python脚本。你可以用 head -n 5 ~/bin/repo 看看它的第一行,指定了Python解释器。确保你的Python版本是3.x。

2.1.2 配置Git身份

Repo在操作Git仓库时,需要知道你是谁。所以先配好Git的全局信息:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

这个邮箱不一定要真实存在,但建议用你常用的。我在公司里就吃过亏——用了临时邮箱,后来找提交记录时根本对不上人。

2.2 下载AOSP源码

环境配好了,接下来就是拉源码。这一步最考验耐心,也最考验网络。

2.2.1 创建工作目录

我个人习惯把AOSP源码放在 ~/aosp 下。你也可以放别的地方,但路径里最好不要有中文和空格:

mkdir ~/aosp
cd ~/aosp

2.2.2 初始化Repo仓库

这一步是告诉Repo:我要下载哪个版本的AOSP。比如我们要下载Android 14:

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

同样,墙内用户请用镜像:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r1
关于分支选择:
-b 参数指定了分支。常用的分支有:
  • android-14.0.0_r1 — Android 14正式版
  • android-13.0.0_r1 — Android 13正式版
  • master — 最新开发版(不稳定,不建议初学者用)
你可以在 Google官方文档 上查到所有分支的对应关系。

2.2.3 同步源码

初始化完成后,执行同步命令:

repo sync -j4

-j4 表示用4个线程并行下载。这个数字怎么设?我一般看CPU核心数。比如你的CPU是8核,可以试试 -j8。但别太大,否则网络容易卡死。

同步过程会很久。AOSP源码大概有30-40GB,网速好的话也要一两个小时。我建议你找个空闲时间,比如晚上睡觉前跑上。

警告:同步过程中如果中断了,不要慌。重新执行 repo sync 就行,它会断点续传。我曾经因为网络波动断了三次,最后也完整拉下来了。

2.3 选择编译目标

源码拉下来了,但还不能直接编译。你得告诉系统:你要编译成什么样子?

这就涉及到 lunch 命令了。它用来选择编译目标(也就是你最终要烧到设备上的镜像)。

2.3.1 加载编译环境

首先,加载编译脚本:

source build/envsetup.sh

执行后,你会看到一堆输出。别怕,这是正常的。它加载了各种编译函数,比如 lunchmmm 等。

2.3.2 查看可用的编译目标

运行 lunch 不加参数,会列出所有可用的目标:

lunch

你会看到类似这样的列表:

1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_x86_64-eng
4. aosp_cf_x86_64_phone-userdebug
...

每个目标的名字由三部分组成:设备名-构建类型

2.3.3 理解构建类型

构建类型有三种,我简单解释一下:

类型 说明 适用场景
eng 工程版,带调试工具,性能最差 开发调试,我平时用这个最多
userdebug 用户调试版,有root权限 测试阶段,比eng版稳定一些
user 用户版,无root,性能最好 发布版本,普通用户使用

我个人建议初学者选 aosp_x86_64-eng。为什么?因为x86_64可以在模拟器上跑,不用真机。而且eng版带了很多调试工具,方便你后面学Framework源码。

2.3.4 选择目标

比如我们选第3个:

lunch aosp_x86_64-eng

或者直接输入编号:

lunch 3

执行后,系统会设置一堆环境变量。你可以用 echo $TARGET_PRODUCT 看看当前选的是什么。

2.4 执行编译

终于到这一步了。编译AOSP,说白了就是跑一个命令:

make -j4

或者用更现代的 m 命令:

m -j4

mmake 的封装,会自动检测当前目录是不是AOSP根目录。我个人更喜欢用 m,少打几个字嘛。

2.4.1 编译时间

编译时间取决于你的机器配置。我列个参考表:

机器配置 首次编译时间 增量编译时间
8核CPU + 16GB内存 + SSD 约2-3小时 10-30分钟
16核CPU + 32GB内存 + SSD 约1-1.5小时 5-15分钟
32核CPU + 64GB内存 + NVMe 约30-45分钟 2-5分钟

我第一次编译时用的是一台8GB内存的笔记本,结果编译到一半直接OOM了。后来加了16GB交换分区才勉强跑完。所以内存真的很重要,建议至少16GB。

2.4.2 编译过程中的常见问题

编译过程中可能会遇到各种错误。我挑几个常见的说说:

  • 内存不足:报错信息里会有 KilledOut of memory。解决办法:减少 -j 参数,或者加内存。
  • 磁盘空间不足:AOSP编译后大概需要100-150GB空间。检查一下你的磁盘。
  • Java版本不对:AOSP对Java版本有要求。Android 14需要Java 17,Android 13需要Java 11。用 java -version 检查一下。
避坑指南:我曾经在编译时遇到一个奇怪的错误,提示某个头文件找不到。折腾了半天,最后发现是 repo sync 时网络中断,导致部分文件没下载完整。重新 repo sync 后就解决了。所以遇到莫名其妙的编译错误,先试试重新同步。

2.4.3 编译成功

如果一切顺利,你会看到类似这样的输出:

#### build completed successfully (01:23:45) ####

看到这个,恭喜你!AOSP编译成功了。

编译产物在 out/target/product/<设备名>/ 目录下。比如我们编译的是 aosp_x86_64,那就在 out/target/product/generic_x86_64/ 里。里面有 system.imgboot.imguserdata.img 等镜像文件。

2.5 小结

这一章我们走完了从配置Repo到编译成功的全过程。说实话,第一次编译AOSP确实有点磨人,但当你看到那行 build completed successfully 时,成就感还是很足的。

下一章,我们会把编译好的镜像跑起来,然后开始真正的Framework源码调试。准备好了吗?