EN

Android 系统开发系列(1):Android 12 源代码下载、编译和刷机

字数统计: 4k阅读时长: 15 min
2021/10/26
loading

Android 12 源码于 2021 年发布,我当时用来折腾的测试机是 Pixel 3 XL。本文保留那次实操记录,并将可复现的发布版示例固定为 android-12.0.0_r3。版本对应关系以 AOSP tags/build numbers 为准。

本文介绍这条历史分支的下载、编译和刷机。本地编译便于查看/修改系统源码、增加调试信息,主要用途如下:

  1. 可以刷真机,方便开发者进行本地 Debug,同时代码可以导入 Android Studio 进行 Debug
  2. 可以编译 userdebug 版本以使用更多调试能力。adb root/remount 是否可用还取决于 adbd、AVB/verity、分区和构建配置;userdebug 不等于所有目录直接可写,也不代替应用自身的调试权限。
  3. 可以更方便地进行 Android 源代码的学习,本地版本可以打开很多系统级别的 Debug Log,也可以自己加 Log,或者自己修改流程

历史版本说明(2026-10-14 核查):下文的 Android 12 r3、Pixel 3 XL 和 2021 年截图用于旧版本学习,不是当前设备或生产固件建议。r3 的安全补丁级别是 2021-10-05。原文还混入了 master 开发分支截图,其中 Tiramisu/AOSP.MASTER 不是 Android 12 r3 构建证明;这些图片保留并在相应位置标明。

当前 AOSP 的入口另见源码下载与构建指南。新工作区可按官方流程使用 android-latest-release,它是会移动的分支,不能用于锁定 Android 12:

1
2
3
4
5
6
7
# Current AOSP example: use a separate working directory, not the Android 12 tree.
repo init --partial-clone --no-use-superproject \
-b android-latest-release -u https://android.googlesource.com/platform/manifest
repo sync -c -j8
source build/envsetup.sh
lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug
m

这是当前文档中的 Cuttlefish 虚拟设备示例,不是 Pixel 3 XL 刷机目标。新格式是 product-release_config-variant;本文 Android 12 仍用 product-variant。分支和目标可用性以实际 checkout 为准,保存 repo manifest -r 的结果便于定位版本;不要在不同版本间混用 vendor 文件。科大镜像有自己的并发限制,下文使用不超过 4 路,不能照搬上面的官方源 -j8。

如果只看源码,可以使用 cs.android.com。复现本文需:

  1. 与目标匹配、允许解锁 bootloader 的 Pixel 3 XL(crosshatch)。Pixel 3 是 blueline,不可混刷;SIM 解锁也不等于 bootloader 可解锁。“Pixel 3及以上”不是所有后续机型都能刷 Android 12 的保证。
  2. x86-64 Linux 构建主机、区分大小写的文件系统及足够磁盘/内存。原图主机是 Ubuntu 18.04.6;原文 32GB是当时经验,swap 不能视作等量RAM。当前官方资源要求为至少 400GB 可用磁盘、64GB RAM,见环境要求。旧分支所需资源随目标和并行度变化,不能靠降低一个数字保证构建成功。

1. 代码下载

当时从国内下载 Google 官方源码,有时慢得下不动,连 .repo 都可能卡住,所以这篇文章用科大 AOSP 镜像演示下载,官方入口为 Android source download。镜像协议和限流规则以镜像站说明为准;本次核查其文档使用 HTTPS,不再沿用原文的 git:// 地址。

建议在实际编译所用的 Linux 文件系统内下载。WSL2、macOS 上能运行部分 Git/Repo 命令,不等于它们是本文已验证的 Android 12 构建与 USB 刷机环境;尤其不要默认 Windows 挂载盘或不区分大小写的目录满足源码要求。

1.1 步骤1:Repo 工具下载

在支持该包的 Ubuntu 软件源中,可按官方安装说明安装启动器:

1
2
3
sudo apt-get update
sudo apt-get install repo
repo version

若发行版没有 repo 包,使用官方手动下载并验证签名的流程。不要直接把网络错误页写成可执行启动器;也不需要手改启动器内部的 REPO_URL。Repo 启动器和稍后下载的 Repo 工具版本可不同,记录 repo version 的实际结果。

1.2 步骤2:配置个人信息

如果没有安装 git,先自己安装一下 git,然后执行下面的命令,填上自己的 Name 和 Email

1
2
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

比如我填的

1
2
git config --global user.name "Gracker"
git config --global user.email "dreamtale.jg@gmail.com"

1.3 步骤3:创建工程目录

在本地建立一个工作目录(名字任意,这里以 Android_12_AOSP 为例子)

1
2
mkdir Android_12_AOSP
cd Android_12_AOSP

1.4 步骤4:初始化仓库

先选择版本,再初始化。本文复现路径是 Android 12 r3,推荐使用 1.4.2 的固定 tag;若研究当前分支,另建工作区。-b 选择 manifest 的分支或 tag,不代表“加了-b才需要匹配驱动”,两种路径都要匹配设备和构建版本。

1.4.1 原来的默认分支方式(历史记录)

原文没有指定分支,记录中走的是当年的 master。这并不是“下载全部 Android 版本”,也不能保证拿到 Android 12。当前 Repo 默认分支和远端设置还可能变化,不再推荐省略版本来复现实验。

只有 Repo 自身仓库无法访问时,才按镜像说明设置导出的环境变量;它与 manifest 的 -u 地址是两件事:

1
export REPO_URL=https://gerrit-googlesource.proxy.ustclug.org/git-repo

下面保留当年的 Repo 2.17 初始化输出,里面的路径、版本和 git:// 地址属于历史记录,不是要继续照抄的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜  Android12 repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
Downloading Repo source from https://gerrit-googlesource.proxy.ustclug.org/git-repo

... A new version of repo (2.17) is available.
... You should upgrade soon:
cp /home/gracker/Code/Android12/.repo/repo/repo /home/gracker/bin/repo

Downloading manifest from git://mirrors.ustc.edu.cn/aosp/platform/manifest
remote: Enumerating objects: 91965, done.
remote: Total 91965 (delta 0), reused 0 (delta 0)

Your identity is: Gracker <dreamtale.jg@gmail.com>
If you want to change this, please re-run 'repo init' with --config-name

repo has been initialized in /home/gracker/Code/Android12

复现 Android 12 请继续 1.4.2;无论使用哪个分支,编译前都不能跳过 3.2 的环境设置。

1.4.2 下载特定的 Tag

从 build numbers 表选取机型对应的版本。下面图片是2021 年初期的列表,后续还有其他 Android 12 tag:

本例固定 android-12.0.0_r3,对应 Build ID SP1A.210812.016.A1,支持列表包含 Pixel 3 XL。指定 tag 固定 manifest 版本,并不自动等于浅克隆、只保留一个提交或一定下载更快。

1
2
repo init -u https://mirrors.ustc.edu.cn/aosp/platform/manifest \
-b android-12.0.0_r3

使用官方源时,把 -u 换成 https://android.googlesource.com/platform/manifest,保留同一 tag。版本更新应重新核对 manifest、设备配置和二进制,不把另一个 tag 的 vendor 目录直接混进来。

1.5 步骤5 :同步代码

repo init 配置 Repo 客户端和 manifest;具体项目还需要同步。科大文档限制并发不超过 4 路,因此这里使用:

1
2
3
repo sync -c -j4
# After a successful sync, record the resolved project revisions.
repo manifest -r -o android12-r3-resolved.xml

-c 聚焦 manifest 所需分支,不代表所有仓库都变成浅克隆。失败时先看具体项目与错误:短暂网络失败可重新运行 sync;磁盘不足、缺失 ref、权限或本地改动冲突需要先解决。不要每 3 秒无限重试并忽略持续错误;只有 sync 成功退出后才进入驱动和构建阶段。

2. 驱动下载

真机构建还依赖匹配的厂商二进制,其中可能包含 HAL、用户态库、vendor 镜像以及设备固件,并不全是“驱动源码”。按机型、源码 Build ID 和厂商说明配套;“用不用-b”不是判断依据。不要将 Google Apps/Pixel Launcher 与这些硬件支持文件混为一谈。

2.1 直接下载方式所对应的驱动

Preview binaries 只适用于页面明确列出的设备/开发构建组合,不是任何 master/main 提交的通用驱动。下面 7798681 是原图中的历史构建号,不能拿它替代本例 r3 的二进制:

没有匹配设备与分支的二进制时,不能仅凭“同一Pixel型号”推定兼容;应选择受支持组合,或改用对应的虚拟设备目标。

2.2 下载特定 Tag 的代码所对应的驱动

在 Google driver binaries 页面查找 Pixel 3 XL / Android 12.0.0 / SP1A.210812.016.A1。本例 r3 的版本关系也由 build_id.mk 确认。

上图同时有 SP1A.210812.015,别选错行。下载对应的 Google vendor image 和 Qualcomm 二进制包,并分别核对页面 SHA-256;不要跨版本拼两个包。

2.3 驱动提取

解压对应下载包后,将其中的提取脚本放到源码根目录执行。先阅读许可,仅在同意条款时按提示确认;不把“输入 I ACCEPT”当作无需阅读的固定步骤。以下文件名是本例,实际以包内文件名为准:

1
./extract-google_devices-crosshatch.sh

1
./extract-qcom-crosshatch.sh

成功后确认 vendor/google_devices/crosshatch 与 vendor/qcom/crosshatch 中相应文件已生成。脚本提取成功只证明文件落盘,不证明版本兼容或设备已能启动。

3. 代码编译

本文目标使用 x86-64 Linux 主机。macOS 平台构建支持已于2021 年停止,原截图如下;不能因源码能在 Mac 上查看就推定 Android 12 可在本机直接构建。

不再支持Mac编译

3.1 设置编译环境

按官方环境说明安装主机依赖,下面是其 Ubuntu 通用包列表。原文额外列出的 libncurses5 等旧包在不同发行版上不一定有同名包,不能把“18.04以上”理解成任何新版本都可原样执行旧列表。

1
2
3
4
sudo apt-get update
sudo apt-get install git-core gnupg flex bison build-essential zip curl \
zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev \
libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

Android 12 的旧预编译工具仍可能依赖旧发行版库。若新主机缺包或报动态链接错误,先确认失败工具与分支要求,使用匹配的 Linux 环境;不要把下载任意旧库或替换系统库当通用修复。Java/编译器优先使用该源码分支选定的工具链,不要照抄当前 Android 分支的 JDK 要求。

3.2 设置代码编译环境

在源码根目录执行;每个新 shell 或切换源码树后重新设置,并重新选择目标:

1
source build/envsetup.sh

或者

1
. build/envsetup.sh

3.3 选择编译目标

Android 12 r3 的 AndroidProducts.mk 明确列出 aosp_crosshatch-userdebug。Pixel 3 XL 的代号是 crosshatch;使用名称比记住历史菜单编号更可靠:

1
lunch aosp_crosshatch-userdebug

原菜单把该目标列为25,编号随源码内容变化:

lunch 选项

下面的配置图保留为 master 分支历史记录。它显示 PLATFORM_VERSION=Tiramisu、BUILD_ID=AOSP.MASTER,不能当作固定 r3 的预期输出。复现 r3 应核对目标、版本及 Build ID,而不只是看到 userdebug 就继续。

3.4 全部编译

第一次全编译,接下来就是漫长的等待了,尤其考验 CPU 和内存。运行 m 构建所选产品的默认目标。并行度可以用 -jN 调整,未指定时由构建系统选择;更高并发不保证更快,内存压力可能导致 swap 抖动或进程被杀。

1
m

常用命令按 Android 12 envsetup.sh 理解:

命令 范围
m / m droid 所选产品的常规构建,不是同时构建所有产品
m <module> 指定存在的模块目标;不代表完整可刷机镜像已更新
mma / mmma <dir> 当前目录/指定目录模块及其依赖
croot 回源码树顶部
m help / hmm 查看构建目标/环境命令帮助
m clean 清理配置的输出目录内容;执行前确认 OUT_DIR,不是固定等价于删除当前目录的 out/

m all 的范围由该分支的目标定义决定,不能把它解释成逐个构建仓库里所有 Android.mk。Android 12 Soong 的 clean 实现 清理实际配置的输出目录,并保留目录本身;正常增量构建不用每次 clean。

下面仍是原 master 构建截图,包含当时的弃用警告,不是 r3 的新验证结果:

历史成功输出记录了 03:40:47,不能作为不同硬件、分支或缓存条件下的耗时保证。实际应确认本次命令成功退出、产物属于所选目标,再进入刷机步骤。

4. 刷机

刷机前确认这是专用测试机、源码/二进制/产物均匹配 Pixel 3 XL,且 bootloader 允许解锁。解锁 bootloader 和下面的 -w 都会清除用户数据,先备份。 开启 OEM unlocking 不等于已经解锁;未解锁设备需按官方步骤在 bootloader 模式执行 fastboot flashing unlock 并在设备上确认。不要在未确认可信、可启动镜像的自编译系统上随手重新锁定。

先确认 adb/fastboot 版本和目标设备。保留运行 envsetup/lunch 的 shell,使 ANDROID_PRODUCT_OUT 指向本次 crosshatch 产物;有多台设备时通过 -s 指定对应序列号。下面从 bootloader 模式进入刷机流程:

1
2
3
4
5
6
7
8
# In the successfully built Android 12 source tree and configured shell:
printf '%s\n' "$TARGET_PRODUCT" "$ANDROID_PRODUCT_OUT"
adb reboot bootloader
fastboot devices
fastboot getvar product

# Only after confirming crosshatch, unlock state, matching firmware and backup:
fastboot flashall -w

原文的 adb reboot fastboot 在支持设备上进入的是用户态 fastbootd,与 adb reboot bootloader 不同。动态分区刷写可能由工具继续切换模式,详见官方 fastbootd 说明;不要靠 --force 绕过分区或兼容性检查。

Android 12 的 fastboot 实现 从 ANDROID_PRODUCT_OUT 查找 flashall 镜像,默认完成后会重启;无需把第二次 fastboot reboot 当作必需步骤。flashall -w 也不是完整替换任意 bootloader/radio 的万能命令,固件不匹配要先按该机型的官方流程处理。

刷机

原图顶部有前一次命令的错误,后面的 flashall 显示 OKAY/Finished;这只记录当次工具输出,不证明本轮 r3 设备验证。成功进入系统后,还需核对 ro.build.id、ro.product.device、ro.build.type 和本次产物,并检查所需的 USB、显示、网络等功能;看到桌面不等于全部硬件通过。

下面保留当时的外观比较和主观评价;它们不能证明固件版本或这些组件当前的维护状态。

自己编译的 AOSP 的 Launcher 比较丑,因为没有 Google 闭源的那些套件的加持,看上去还是很简陋的,自带的 App 非常少,而且基本上没怎么维护,给到手机厂商的就是这么一个东西

还是官方的 Pixel 带的 Launcher 好看(Google 开发和维护)

恢复官方系统时,按机型选择 Google Factory Images 或页面给出的恢复方式,并遵守版本/防回滚限制。刷官方包可能清数据,不能保证修复所有刷机或硬件故障。

5. End

本文主要是讲如何下载、编译、刷机,后续的代码导入、修改和编译模块、代码 Debug 等,会另起一篇文章来介绍

关于我 && 博客

下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!

  1. 博主个人介绍 :里面有个人的微信和微信群链接。
  2. 本博客内容导航 :个人博客内容的一个导航。
  3. 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
  4. Android性能优化知识星球:付费社群已于 2026 年停止运营,不再招收新成员;此处保留历史介绍。

一个人可以走的更快 , 一群人可以走的更远

微信扫一扫

CATALOG
  1. 1. 1. 代码下载
    1. 1.1. 1.1 步骤1:Repo 工具下载
    2. 1.2. 1.2 步骤2:配置个人信息
    3. 1.3. 1.3 步骤3:创建工程目录
    4. 1.4. 1.4 步骤4:初始化仓库
      1. 1.4.1. 1.4.1 原来的默认分支方式(历史记录)
      2. 1.4.2. 1.4.2 下载特定的 Tag
    5. 1.5. 1.5 步骤5 :同步代码
  2. 2. 2. 驱动下载
    1. 2.1. 2.1 直接下载方式所对应的驱动
    2. 2.2. 2.2 下载特定 Tag 的代码所对应的驱动
    3. 2.3. 2.3 驱动提取
  3. 3. 3. 代码编译
    1. 3.1. 3.1 设置编译环境
    2. 3.2. 3.2 设置代码编译环境
    3. 3.3. 3.3 选择编译目标
    4. 3.4. 3.4 全部编译
  4. 4. 4. 刷机
  5. 5. 5. End
  6. 6. 关于我 && 博客