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
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— 最新开发版(不稳定,不建议初学者用)
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
执行后,你会看到一堆输出。别怕,这是正常的。它加载了各种编译函数,比如 lunch、m、mm 等。
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
m 是 make 的封装,会自动检测当前目录是不是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 编译过程中的常见问题
编译过程中可能会遇到各种错误。我挑几个常见的说说:
- 内存不足:报错信息里会有
Killed或Out 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.img、boot.img、userdata.img 等镜像文件。
2.5 小结
这一章我们走完了从配置Repo到编译成功的全过程。说实话,第一次编译AOSP确实有点磨人,但当你看到那行 build completed successfully 时,成就感还是很足的。
下一章,我们会把编译好的镜像跑起来,然后开始真正的Framework源码调试。准备好了吗?