Android 12 源码于 2021 年发布,我当时用来折腾的测试机是 Pixel 3 XL。本文保留那次实操记录,并将可复现的发布版示例固定为 android-12.0.0_r3。版本对应关系以 AOSP tags/build numbers 为准。
本文介绍这条历史分支的下载、编译和刷机。本地编译便于查看/修改系统源码、增加调试信息,主要用途如下:
- 可以刷真机,方便开发者进行本地 Debug,同时代码可以导入 Android Studio 进行 Debug
- 可以编译 userdebug 版本以使用更多调试能力。adb root/remount 是否可用还取决于 adbd、AVB/verity、分区和构建配置;userdebug 不等于所有目录直接可写,也不代替应用自身的调试权限。
- 可以更方便地进行 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 | # Current AOSP example: use a separate working directory, not the Android 12 tree. |
这是当前文档中的 Cuttlefish 虚拟设备示例,不是 Pixel 3 XL 刷机目标。新格式是 product-release_config-variant;本文 Android 12 仍用 product-variant。分支和目标可用性以实际 checkout 为准,保存 repo manifest -r 的结果便于定位版本;不要在不同版本间混用 vendor 文件。科大镜像有自己的并发限制,下文使用不超过 4 路,不能照搬上面的官方源 -j8。
如果只看源码,可以使用 cs.android.com。复现本文需:
- 与目标匹配、允许解锁 bootloader 的 Pixel 3 XL(crosshatch)。Pixel 3 是 blueline,不可混刷;SIM 解锁也不等于 bootloader 可解锁。“Pixel 3及以上”不是所有后续机型都能刷 Android 12 的保证。
- 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 | sudo apt-get update |
若发行版没有 repo 包,使用官方手动下载并验证签名的流程。不要直接把网络错误页写成可执行启动器;也不需要手改启动器内部的 REPO_URL。Repo 启动器和稍后下载的 Repo 工具版本可不同,记录 repo version 的实际结果。
1.2 步骤2:配置个人信息
如果没有安装 git,先自己安装一下 git,然后执行下面的命令,填上自己的 Name 和 Email
1 | git config --global user.name "Your Name" |
比如我填的
1 | git config --global user.name "Gracker" |
1.3 步骤3:创建工程目录
在本地建立一个工作目录(名字任意,这里以 Android_12_AOSP 为例子)
1 | mkdir 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 | ➜ Android12 repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest |
复现 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 | repo init -u https://mirrors.ustc.edu.cn/aosp/platform/manifest \ |
使用官方源时,把 -u 换成 https://android.googlesource.com/platform/manifest,保留同一 tag。版本更新应重新核对 manifest、设备配置和二进制,不把另一个 tag 的 vendor 目录直接混进来。
1.5 步骤5 :同步代码
repo init 配置 Repo 客户端和 manifest;具体项目还需要同步。科大文档限制并发不超过 4 路,因此这里使用:
1 | repo sync -c -j4 |
-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 可在本机直接构建。

3.1 设置编译环境
按官方环境说明安装主机依赖,下面是其 Ubuntu 通用包列表。原文额外列出的 libncurses5 等旧包在不同发行版上不一定有同名包,不能把“18.04以上”理解成任何新版本都可原样执行旧列表。
1 | sudo apt-get update |
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,编号随源码内容变化:

下面的配置图保留为 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 | # In the successfully built Android 12 source tree and configured shell: |
原文的 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 等,会另起一篇文章来介绍
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球:付费社群已于 2026 年停止运营,不再招收新成员;此处保留历史介绍。
一个人可以走的更快 , 一群人可以走的更远
