AOSP源码下载与编译
- 一、在线查看AOSP源码
- 二、AOSP源码下载
-
- [2.1 下载repo工具](#2.1 下载repo工具)
- [2.2 下载源码](#2.2 下载源码)
-
- [2.2.1 方法一(推荐)](#2.2.1 方法一(推荐))
- [2.2.2 方式二](#2.2.2 方式二)
- [2.4 查看分支](#2.4 查看分支)
- [2.5 问题处理](#2.5 问题处理)
- 三、AOSP源码阅读搜索
- 四、AOSP源码编译
-
- [4.0 下载设备驱动文件](#4.0 下载设备驱动文件)
- [4.1 设置构建环境](#4.1 设置构建环境)
- [4.2 配置/选择目标](#4.2 配置/选择目标)
- [4.3 构建代码](#4.3 构建代码)
- [4.4 构建问题处理](#4.4 构建问题处理)
- [4.5 Jenkins自动编译](#4.5 Jenkins自动编译)
- 五、AOSP系统烧写
-
- [5.1 下载出厂映像](#5.1 下载出厂映像)
- [5.2 使用 fastboot 刷写](#5.2 使用 fastboot 刷写)
一、在线查看AOSP源码
AOSP官方文档:https://source.android.google.cn/?hl=zh-cn
中科大镜像:https://ipv4.mirrors.ustc.edu.cn/help/aosp.html
清华镜像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
AndroidXRef (5~16):http://aospxref.com/
二、AOSP源码下载
2.1 下载repo工具
1、从中科大服务器下载repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/main/repo?format=TEXT' | base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
2、下载完以后,检查repo安装情况:
repo version
which repo
whereis repo

3、修改repo下载资源的地址(可选)
选择熟悉的编辑器,我这里使用gedit
sudo gedit ~/bin/repo
搜索REPO_URL关键字,替换成中科大的地址
REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
2.2 下载源码
有两种下载方式:1. 下载初始化包,2. 直接下载源码。通过这两种方式下载的代码是相同的,但方式一下载速度远远快于方式二,而且支持断点续传,强烈推荐方式一。
2.2.1 方法一(推荐)
由于首次同步需要下载约 200GB 数据,过程中任何网络故障都可能造成同步失败,我们强烈建议您使用初始化包进行初始化。
由于初始包较大,需要注意磁盘格式是否支持大文件。初始化包方法支持断点续传。
1、下载初始包
在浏览器中点击下载初始化包aosp-latest.tar,这里推荐使用中国科学技术大学开源镜像站连接:https://mirrors.ustc.edu.cn/aosp-monthly/

另外也可以使用清华镜像下载:
bash
# 包含断点续传
curl -LOC - https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
2、解压压缩包
tar xf aosp-latest.tar // 解压后会自动生成一个文件夹aosp
cd aosp // 进入aosp文件夹,这时 ls 什么也看不到,因为只有一个隐藏的 .repo 目录
3、同步代码
这里需要根据实际情况,选择下面的其中之一即可。
(1)下载最新源码
repo sync // 同步一遍,即可得到完整最新源码
此后,每次只需运行 repo sync 即可保持同步。
(2)下载分支源码
我的设备是比较老的pixel 5,要构建pixel 5的镜像,就需要切换为android-14.0.0_r13分支的源码,进入aosp源码目录之后执行以下命令。
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r13
repo sync -c -j8
如何确定下载哪个分支的代码,设备和分支的对应关系,可以在官网上查询: Source code tags and builds 。

支持的设备一栏表明该分支的代码支持的手机型号,标记一栏指的是我们下载代码时指定的TAG,build ID一栏是用来下载Google的闭源资源的id。因为我们想要编译一个完整镜像的话,除了开源的aosp之外,还有一部分比如驱动、vendor.img等是不开源的,就需要通过这个build ID来下载对应的资源,放到aosp源码目录下进行解压编译,最后会生成完整的镜像。驱动下载链接:https://developers.google.cn/android/drivers?hl=zh-cn

下载完整镜像:https://developers.google.cn/android/ota?hl=zh-cn
2.2.2 方式二
1、新建一个目录aosp_code,用于存放AOSP源码文件
mkdir aosp_code
cd aosp_code
2、初始化仓库
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
选项:
-u:指定从中检索清单代码库的网址。常见清单位于 https://android.googlesource.com/platform/manifest。
-m:选择代码库中的清单文件。如果未选择清单名称,则默认为 default.xml。
-b:指定修订版本,即特定的 manifest-branch。
3、开始同步代码
repo sync
4、切换源码分支
根据我的实际情况,需要构建pixel 5的镜像,android-14.0.0_r13分支,进入aosp源码目录之后执行以下命令。
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-14.0.0_r13
repo sync -j8
2.4 查看分支
// 1. 进入aosp/.repo/manifests/目录下
cd aosp/.repo/manifests/
// 2. 执行以下命令可以查看所有现有的分支
git branch -a | cut -d / -f 3
2.5 问题处理
1、如果下载源码时出现python语法报错。
检查使用的python版本是否是python3,因为谷歌已经停用python2了,具体参考https://gitee.com/watom/mini-storage

2、命令'repo'没有找到。

linux中不同的用户环境是不同的,最好在同一个环境下操作。
3、java版本无法切换
java -version # 确认当前版本号
update-alternatives --config java # 根据已安装的java版本列表,选择需要版本。
有时候切换也不起作用,请检查并设置/etc/profile或/etc/environment文件。
sudo nano etc/profile
sudo nano /etc/environment
也可以设置临时环境(当前会话)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH # 将Java的bin目录添加到你的PATH环境变量中
4、PermissionError: [Errno 13] Permission denied: '/etc/.repo_gitconfig.json'
遇到 PermissionError: [Errno 13] Permission denied 这类错误通常意味着你的程序或脚本没有足够的权限去访问或修改指定的文件或目录。在 Linux 系统中,这种问题经常出现在尝试写入系统级文件或目录时。
解决方案:可以更改文件或目录的权限,使其对所有用户可写。使用 chmod 命令:
sudo chmod 666 /etc/.repo_gitconfig.json
三、AOSP源码阅读搜索
一般搭建本地OpenGrok,参考
https://blog.csdn.net/Watom_663/article/details/155171091?spm=1011.2415.3001.5331
四、AOSP源码编译
CPU:AMD Ryzen 7 9700X
主要参数:8核心 16线程 主频 3.8GHz
系统:Ubuntu 24.04.3 LTS
内存:32GB
硬盘:1T SSD
手机:pixel 5
4.0 下载设备驱动文件
https://developers.google.cn/android/drivers?hl=zh-cn
4.1 设置构建环境
获取 envsetup.sh 脚本的源代码以设置构建环境
bash
source build/envsetup.sh
此脚本会导入若干命令(包括本页中使用的命令),让您能够使用 Android 源代码。

4.2 配置/选择目标
这里根据我的实际情况,构建pixel 5的镜像,执行如下已经配置好的命令:
bash
lunch aosp_redfin-userdebug // 这里不写参数release_config会使用默认配置
解释/说明:
最新的代码已经删除了交互式菜单,如果需要恢复成原来的,依次执行以下命令:
lunch --help
list_products // 产品列表
list_releases // 版本配置,例如名为 trunk_staging 的开发版本配置。版本配置用于标识位于功能发布标志后面的特定功能和代码,并可为 build 启用或停用这些功能和代码。
list_variants // 构建类型:user userdebug eng
配置/选择构建目标的字符串格式:
lunch product_name-release_config-build_variant
具体参考官方文档说明:https://source.android.google.cn/docs/setup/build/building?hl=zh-cn

目标和构建环境的概要:

查看当前目标的启动设置:
echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"
4.3 构建代码
首次构建可能时间较长,最长可达数小时。后续构建所需的时间会大大减少。
bash
m // 输入m,即开始运行构建目标
4.4 构建问题处理
1、构建版本时报错:Build sandboxing disabled due to nsjail error.
问题原因:在Ubuntu24.04 上构建版本时,遇到这个问题,即就是在使用nsjail进行沙盒隔离时出现了问题。nsjail(也称为namespace jail)是一种用于Linux的沙盒技术,常用于隔离编译和构建环境,以提高安全性。一般会出现两中场景:
(1)在 Ubuntu24.04 上编译:
根据链接 https://groups.google.com/g/android-building/c/DbDKuaIik3M 所说,ubuntu24.04上的一些修改,会导致编译时遇到这个错误。
临时解决方案:执行命令 sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 即可。
持久化解决方案:编辑文件/usr/lib/sysctl.d/10-apparmor.conf,将上面的key value添加进去,使用 sysctl -p /usr/lib/sysctl.d/10-apparmor.conf 或者重启生效
(2)在Docker里面编译
在Docker里面编译可能会遇到这个错误,解决办法是创建容器时,添加一个 --privileged 参数。
2、构建版本时报错:prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real:
prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
问题通常由缺少 libncurses.so.5 库文件导致。
(1)直接安装(适用于大多数系统)
sudo apt-get install libncurses5
若提示无法定位软件包,可能需更新软件源。
(2)手动创建符号链接(适用于库版本不匹配):
# 查找系统中可用的 libncurses和libtinfo库
find /usr/lib -name "libncurses.so.*"
find /usr/lib -name "libtinfo.so.*"
# 找到 libncurses.so.6.4,创建符号链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libncurses.so.6.4 /usr/lib/x86_64-linux-gnu/libncurses.so.5
# 找到 libtinfo.so.6.4,创建符号链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5
3、构建版本时报错:bison: m4 subprocess failed
out/soong/.temp/sbox/90b28448b4f8ff51cd848be604f62c6d34e936d4/tools/out/bison/prebuilts/build-tools/linux-x86/bin/bison: m4 subprocess failed
问题通常由缺少 m4 工具或环境变量配置错误导致。
安装 m4 工具
sudo apt-get install m4
若提示无法定位软件包,可能需更新软件源(参考)。
安装后验证 m4 是否可用:
m4 --version
若仍报错,检查 bison 配置文件(如 bison.m4)是否引用了 m4。
如果系统中有m4工具,只是路径不匹配,可以手动创建符号链接
# 查找系统中可用的 m4 库
find / -name "m4" # 或者使用 which m4
sudo ln -s /usr/bin/m4 /path/to/bison/prebuilts/build-tools/linux-x86/bin/m4
4、构建版本时报错:ninja failed with: exit status 137
根据错误信息 ninja failed with: exit status 137,该问题通常由 OOM Killer 触发,需确保系统内存充足。Swap 增大后需重启编译环境生效。以下是解决方案:
(1)增加交换分区(Swap)
检查当前 Swap 空间: free -h
若 Swap 小于 8G,需增大 Swap 空间:
# 关闭现有 Swap
sudo swapoff -a
# 创建新 Swap 文件(16G)
sudo dd if=/dev/zero of=/swapfile bs=1G count=16
# 设置权限
sudo chmod 600 /swapfile
# 格式化为 Swap
sudo mkswap /swapfile
# 启用 Swap
sudo swapon /swapfile
# 永久生效(编辑 /etc/fstab)
echo "/swapfile swap swap sw 0 0" | sudo tee -a /etc/fstab
验证 Swap 是否生效: free -h

(2)调整 Java 堆内存
修改 config.go 文件:
# 打开文件
sudo vim build/soong/java/config/config.go
# 修改 JavacHeapSize 值(如 4096M)
pctx.StaticVariable("JavacHeapSize", "4096M")
保存后重新编译。
(3)检查系统内存使用:top
若内存使用率接近 100%,需关闭其他占用内存的进程。
(4)清理编译缓存
删除 out 目录: rm -rf out
重新编译前执行:export MAVEN_OPTS="-Xms4096m -Xmx4096m"

另外
4.5 Jenkins自动编译
https://zhuanlan.zhihu.com/p/587822493?utm_id=0
五、AOSP系统烧写
5.1 下载出厂映像
Pixel 5 Build number:TQ3A.230901.001
出厂映像:https://developers.google.cn/android/images?hl=zh-cn#redfin

5.2 使用 fastboot 刷写
使用 fastboot 工具可以刷写更多设备类型,还可以将自己的本地 build 刷写到设备上以进行测试。
1、验证 fastboot 和 adb 环境
bash
adb --version
fastboot --version
如果显示版本号,则表明已安装 fastboot 和 adb。
2、启动进入fastboot模式
- 使用 adb 命令:在命令行中,输入 adb reboot bootloader。
- 使用fastboot组合键:先关机,然后按住按组合键开机。
3、开始刷机
shell
# 1. 本地编译完成之后,生成的镜像文件在 /out/target/product/redfin(手机代号) 目录下,切换目录到该目录下
cd aosp/out/target/product/xxx型号/
# 2. 设置镜像文件路径
export ANDROID_PRODUCT_OUT=./
# 3. fastboot刷入img镜像文件。使用 -w 选项会擦除设备上的 /data 分区,这在您首次刷写特定设备时非常有用
fastboot flashall -w
执行完成后,将启动分区、恢复分区和系统分区一起写入,并重新启动系统。