AOSP源码下载与编译

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

执行完成后,将启动分区、恢复分区和系统分区一起写入,并重新启动系统。

相关推荐
五阿哥永琪1 天前
MySQL 如何定位&分析慢查询?
android·数据库·mysql
柒.梧.1 天前
从原理到实战:Spring AOP全解析
数据库·sql
恋猫de小郭1 天前
作为 Cursor 和 Claude Code 的研发者,他们是如何看待和使用 AI
android·前端·ai编程
山峰哥1 天前
SQL优化中的索引策略与Explain分析实战
大数据·汇编·数据库·sql·编辑器
galaxyffang1 天前
Redis 的 16 个数据库应用场景
数据库·redis·缓存
喜欢猪猪1 天前
深度解析 SGLang:大模型编程新范式——从 Prompt Engineering 到 Structured Generation 的系统性跃迁
java·数据库·prompt
·云扬·1 天前
利用Orchestrator Hook实现MySQL高可用切换与VIP管理
android·数据库·mysql
源远流长jerry1 天前
DNS解析过程以及CDN流程
http·缓存
坚持学习前端日记1 天前
Android JS桥技术深度解析
android·开发语言·javascript