sudo snap install curl
Then follow
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
install repo:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
由于首次同步需要下载约 60GB 数据,过程中任何网络故障都可能造成同步失败,我们强烈建议您使用初始化包进行初始化。
curl -OC - https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包tar xf aosp-latest.tar
cd AOSP # 解压得到的 AOSP 工程目录# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync# 正常同步一遍即可得到完整目录# 或 repo sync -l 仅checkout代码
传统初始化方法
建立工作目录:
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
初始化仓库:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
如果提示无法连接到 gerrit.googlesource.com,请参照git-repo的帮助页面的更新一节。
如果需要某个特定的 Android 版本(列表):
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r3
同步代码
上面步骤三只是下载了 .repo 文件,具体的代码还需要执行 repo sync 来进行下载。由于镜像站的限制和下载过程中可能会遇到的问题,建议大家用 -j4 来下载
repo sync -j4
然后就开始了漫长的下载,由于下载过程中可能会出现失败的情况,你可以搞一个 sh 脚步来循环下载,一觉醒来就下载好了
#!/bin/bash
repo sync -j4
while [ $? -ne 0 ]
do
echo "======sync failed ,re-sync again======"
sleep 3
repo sync -j4
done
具体方法
touch repo.sh # 1. 创建 repo.sh 文件
vim repo.sh # 2. 复制上面的脚本内容到 repo.sh 里面,这里你可以使用你自己喜欢的方法打开并修改文件,比如 vscode
chmod a+x repo.sh #3. 修改权限
./repo.sh # 4. 运行脚本,万事大吉
. 代码编译
代码和驱动都下载好之后,就可以开始代码的编译工作了,由于新版本不再支持 Mac 编译,所以建议大家还是使用 Linux 来进行编译,推荐使用 Ubuntu

3.1 设置编译环境
参考:https://source.android.google.cn/setup/build/initializing
Ubuntu 18.04 以上直接运行:
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
3.2 设置代码编译环境
每次关闭 Shell 之后都需要重新执行下面这个脚本,相当于配置了一下编译环境
source build/envsetup.sh
或者
. build/envsetup.sh
3.3 选择编译目标
lunch
运行 lunch 之后,会有一堆设备出来让你选择,还是以我的 Pixel 3 XL 为例,其代号是 ,在这里可以查看所有机型对应的代号:https://source.android.google.cn/setup/build/running#selecting-device-buildPixel 3 XL 对应的代号是:crosshatch

查找对应的机型
所以我选择编译的是 aosp_crosshatch-userdebug ,这里可以输入编号也可以直接输入 aosp_crosshatch-userdebug

lunch 选项
然后脚本会进行一系列的配置,输出下面的内容

编译配置展示
3.4 全部编译
使用 m 构建所有内容。m 可以使用 -jN 参数处理并行任务。如果您没有提供 -j 参数,构建系统会自动选择您认为最适合您系统的并行任务计数
m
如上所述,您可以通过在 m 命令行中列出相应名称来构建特定模块,而不是构建完整的设备映像。此外,m 还针对各种特殊目的提供了一些伪目标。以下是一些示例:
droid - m droid 是正常 build。此目标在此处,因为默认目标需要名称。
all - m all 会构建 m droid 构建的所有内容,加上不包含 droid 标记的所有内容。构建服务器会运行此命令,以确保包含在树中且包含 Android.mk 文件的所有元素都会构建。
m - 从树的顶部运行构建系统。这很有用,因为您可以在子目录中运行 make。如果您设置了 TOP 环境变量,它便会使用此变量。如果您未设置此变量,它便会从当前目录中查找相应的树,以尝试找到树的顶层。您可以通过运行不包含参数的 m 来构建整个源代码树,也可以通过指定相应名称来构建特定目标。
mma - 构建当前目录中的所有模块及其依赖项。
mmma - 构建提供的目录中的所有模块及其依赖项。
croot - cd 到树顶部。
clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同。
运行 m help 即可查看 m 提供的其他命令
输入 m 之后开始第一次全部编译,漫长的等待,编译时间取决于你的电脑配置... 主要是 cpu 和内存,建议内存 32G 走起,cpu 也别太烂

编译准备界面
编译成功之后,会有下面的输出

整机编译成功
4. 刷机
自己编译的 UserDebug 固件用来 Debug 是非常方便的,不管是用来 Debug Framework 还是 App
编译好之后下面开始刷机,以我的测试机器 Pixel 3 XL 为例,依次执行下面的命令
adb reboot fastboot
# 等待手机进入 fastboot 界面之后
fastboot flashall -w
# 刷机完成之后,执行 fastboot reboot 长期系统即可
fastboot reboot