技术复核(2026-10-13):这是一篇 Nexus 5 / Android Lollipop 的历史教程,设备与工具链已过期。文中的 LRX22C 二进制对应 **Android 5.0.1 / AOSP
android-5.0.1_r1**,下文据此明确源码、驱动和刷机条件。新学习环境另补 Android 16 Cuttlefish 示例;不要把新版本的构建命令与旧真机固件混用。
接前一篇文章使用Android Studio查看Android Lollipop源码, 我们知道,仅仅看代码,提高是比较有限的,而且理解起来也比较肤浅,往往过目就忘. 而自己写过的代码,往往会印象比较深刻,在写的时候也会比较容易理解流程. 所以我们在看代码的同时, 如果能修改代码, 在手机上跑起来并看到修改的效果,这无疑会加快看代码的效率和积极性. 所以这篇文章,就讲解一下如何自己编译AndroidL的源码,并且在Nexus5上跑起来. 至于为何需要自己编译固件,而不是直接安装 Google 给出的工厂固件?这里的目的是获得便于平台调试的 userdebug 构建。user 版本限制 ADB root 等调试能力;userdebug 支持更多调试操作,但并不等于任意分区都能不受限制地写入。
本文假设你已准备好版本一致的 Lollipop 源码和一台 Nexus 5。环境可参考 旧版本 AOSP 构建说明和源码下载说明。Android 5.x 在 Linux 上使用 OpenJDK 7;旧系统与依赖应放在专门的历史构建环境中,不能直接作为当前开发机的安装建议。如果访问官方文档或下载源码不顺畅,需要先处理网络与源码获取环境。
AOSP 是 Android Open Source Project,即 Android 开源项目。它包含平台和开源应用,不包含 Google Mobile Services(GMS)这组专有应用与服务。厂商二进制、GMS 授权和 Android 兼容性是不同问题:满足 CDD 并通过 CTS 是兼容性要求,不等于自动获得 GMS。具体要求可以参见 Android 兼容性说明。
现在从哪里开始:Android 16 Cuttlefish
如果目的是修改系统代码并观察效果,可以先使用 Cuttlefish 虚拟设备。下面把源码固定到 android-16.0.0_r1,与本文旧 Nexus 5 工作区分开,在已满足 Linux 构建条件的新目录中执行:
1 | repo init --partial-clone -b android-16.0.0_r1 -u https://android.googlesource.com/platform/manifest |
这个产品存在于该标签的 Cuttlefish 配置,aosp_current 在该版本映射到 bp2a。构建完还需要按 Cuttlefish 启动说明配置宿主包、KVM 和用户组;m 成功并不代表虚拟机已经启动。
官方入门文档中的 android-latest-release 是滚动分支,重现实验时应记录实际 manifest。要做真机开发,则逐版本确认设备源码、厂商二进制、bootloader 和基带的配套关系;下载页中存在某个 Pixel 或 Nexus 的旧条目,不代表它受所有新版本支持。
1. 初始化编译环境(Android 5.0.1)
下面回到旧 Nexus 5 工作区。根据 AOSP 版本表,LRX22C 对应 android-5.0.1_r1。确认整个源码树使用这一版本,再在源码根目录执行:
1 | source build/envsetup.sh |
2. 加载机型
旧分支可运行 lunch 查看菜单,也可以直接选择目标,避免依赖菜单编号:
1 | lunch aosp_hammerhead-userdebug |
3. 确认设备和构建类型
3.1 本文使用的机型
| 设备 | 设备代号 | Android 5.0.1 构建目标 |
|---|---|---|
| Nexus 5(GSM/LTE) | hammerhead | aosp_hammerhead-userdebug |
原机型列表混合了不同年代的产品名与目标名,不能用来判断某个源码标签的支持范围。其他设备应以所选源码树中的产品配置为准,不能只把 hammerhead 换成另一个代号。
3.2 三种构建变体
| 构建变体 | 用途 |
|---|---|
user |
面向生产,调试访问受限 |
userdebug |
接近 user 的配置,增加 root 调试等能力,适合平台开发 |
eng |
工程开发配置,调试行为更多,不宜直接代表生产性能 |
这里应确认的配置值是:
1 | PLATFORM_VERSION=5.0.1 |
版本号以所选源码标签为准。日志中的 TARGET_BUILD_TYPE=release 与 TARGET_BUILD_VARIANT=userdebug 可以同时出现,二者不是同一个配置项。
4. 准备厂商二进制
在 Google 二进制下载页的 hammerhead / LRX22C 项取得对应包。它们补充开源树里没有的硬件支持文件,不是 PC 上的 USB 驱动。下面列出了官网公布的 SHA-256。
| 硬件组件 | 供应商 | 下载 |
|---|---|---|
| NFC, Bluetooth, Wi-Fi | Broadcom | LRX22C |
| Camera, Sensors, Audio | LG | LRX22C |
| Graphics, GSM, Camera, GPS, Sensors, Media, DSP, USB | Qualcomm | LRX22C |
官网 SHA-256:
1 | broadcom-hammerhead-lrx22c-964d941e.tgz |
下载后先按官网校验值核对文件,再解压并阅读各包的许可与说明。在源码根目录运行其提取脚本、按提示完成许可步骤,文件会写入 vendor/。三个供应商的包各有用途,不能重复装 LG 包来替代 Qualcomm 包,也不要混用别的构建编号。
5. 执行编译命令
1 | make -j8 |
-j8 是原环境的并发示例,需要结合 CPU、内存和实际构建情况调整。完整构建应正常退出,并在 out/target/product/hammerhead/ 下得到刷机所需的产物。只看到 system.img 生成,不等于整个构建已经成功。
编译要等上一阵子。下面是当时留下的一段日志,记录的是 system 镜像生成阶段:
1 | Installed file list: out/target/product/hammerhead/installed-files.txt |
6. 刷机命令
解锁 bootloader 和带 -w 的刷机都会清除用户数据。 先备份,再确认设备是 Nexus 5 / hammerhead、固件产物与设备匹配,且 bootloader 与基带满足该构建要求。
手机正常开机且 ADB 已授权时,可以运行 adb reboot bootloader 进入 bootloader / fastboot 模式。关机按键组合以 官方设备表为准;它为 Nexus 5 列出音量上、音量下与电源键的组合。这里进入的是 fastboot 模式,和 recovery 不同。
先检查连接和产品名:
1 | fastboot devices |
若 bootloader 仍锁定,Nexus 5 这类 2015 年之前的设备使用 fastboot oem unlock,并在设备上确认清除数据与解锁;不要套用后来设备的 fastboot flashing unlock。细节见 官方 Fastboot 流程。
在已执行 envsetup 和 lunch aosp_hammerhead-userdebug 的同一个终端中,确认 ANDROID_PRODUCT_OUT 指向本次 hammerhead 产物,再执行原刷机命令:
1 | echo "$ANDROID_PRODUCT_OUT" |
旧 fastboot 源码 会从产物目录读取 android-info.txt 与镜像;仅仅 cd 到源码根目录并不能代替正确的构建环境。连接多个设备时,所有 fastboot 操作都应通过 -s 设备序列号 指定同一台目标设备。
下面是当时成功刷写的日志:
1 | ~/Android-SourceCode fastboot -w flashall |
刷写流程完成后还要确认能正常启动,并检查 Wi-Fi、相机、声音等所需功能。不要仅凭 fastboot 返回成功或出现桌面,就认定所有厂商二进制都匹配。
7. 秀桌面
最后秀一下当时的桌面:

关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球:付费社群已于 2026 年停止运营,不再招收新成员;此处保留历史介绍。
一个人可以走的更快 , 一群人可以走的更远
