EN

为 Nexus 5 编译 Android Lollipop 固件

字数统计: 2.4k阅读时长: 9 min
2015/02/04
loading

技术复核(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
2
3
4
5
repo init --partial-clone -b android-16.0.0_r1 -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 配置,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
2
3
PLATFORM_VERSION=5.0.1
TARGET_PRODUCT=aosp_hammerhead
TARGET_BUILD_VARIANT=userdebug

版本号以所选源码标签为准。日志中的 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
2
3
4
5
6
7
8
broadcom-hammerhead-lrx22c-964d941e.tgz
fa1ba5bbb304940fd9b852f184f37e2c6ce8c8b97e83fa8dea7c125778d3d63a

lge-hammerhead-lrx22c-95a9d465.tgz
84b1c5b8f16b61ae8faeed7fe0593cb882212b05f872dc2d423681d6fe9b964d

qcom-hammerhead-lrx22c-e1a10593.tgz
b5598e88d069b82c8e6db0dc992090baf1d5d1e0a76ed76aeccad0ed65c2d766

下载后先按官网校验值核对文件,再解压并阅读各包的许可与说明。在源码根目录运行其提取脚本、按提示完成许可步骤,文件会写入 vendor/。三个供应商的包各有用途,不能重复装 LG 包来替代 Qualcomm 包,也不要混用别的构建编号。

5. 执行编译命令

1
make -j8

-j8 是原环境的并发示例,需要结合 CPU、内存和实际构建情况调整。完整构建应正常退出,并在 out/target/product/hammerhead/ 下得到刷机所需的产物。只看到 system.img 生成,不等于整个构建已经成功。

编译要等上一阵子。下面是当时留下的一段日志,记录的是 system 镜像生成阶段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Installed file list: out/target/product/hammerhead/installed-files.txt
Target system fs image: out/target/product/hammerhead/obj/PACKAGING/systemimage_intermediates/system.img
Running: mkuserimg.sh -s out/target/product/hammerhead/system out/target/product/hammerhead/obj/PACKAGING/systemimage_intermediates/system.img ext4 system 1073741824 -L system out/target/product/hammerhead/root/file_contexts
make_ext4fs -s -T -1 -S out/target/product/hammerhead/root/file_contexts -L system -l 1073741824 -a system out/target/product/hammerhead/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/hammerhead/system
Creating filesystem with parameters:
Size: 1073741824
Block size: 4096
Blocks per group: 32768
Inodes per group: 8192
Inode size: 256
Journal blocks: 4096
Label: system
Blocks: 262144
Block groups: 8
Reserved block group size: 63
Created filesystem with 1445/65536 inodes and 85879/262144 blocks
Install system fs image: out/target/product/hammerhead/system.img
out/target/product/hammerhead/system.img+out/target/product/hammerhead/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=1096212480 blocksize=135168 total=336629666 reserve=11083776

6. 刷机命令

解锁 bootloader 和带 -w 的刷机都会清除用户数据。 先备份,再确认设备是 Nexus 5 / hammerhead、固件产物与设备匹配,且 bootloader 与基带满足该构建要求。

手机正常开机且 ADB 已授权时,可以运行 adb reboot bootloader 进入 bootloader / fastboot 模式。关机按键组合以 官方设备表为准;它为 Nexus 5 列出音量上、音量下与电源键的组合。这里进入的是 fastboot 模式,和 recovery 不同。

先检查连接和产品名:

1
2
fastboot devices
fastboot getvar product

若 bootloader 仍锁定,Nexus 5 这类 2015 年之前的设备使用 fastboot oem unlock,并在设备上确认清除数据与解锁;不要套用后来设备的 fastboot flashing unlock。细节见 官方 Fastboot 流程。

在已执行 envsetup 和 lunch aosp_hammerhead-userdebug 的同一个终端中,确认 ANDROID_PRODUCT_OUT 指向本次 hammerhead 产物,再执行原刷机命令:

1
2
echo "$ANDROID_PRODUCT_OUT"
fastboot -w flashall

旧 fastboot 源码 会从产物目录读取 android-info.txt 与镜像;仅仅 cd 到源码根目录并不能代替正确的构建环境。连接多个设备时,所有 fastboot 操作都应通过 -s 设备序列号 指定同一台目标设备。

下面是当时成功刷写的日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
~/Android-SourceCode fastboot -w flashall
target reported max download size of 1073741824 bytes
Creating filesystem with parameters:
Size: 13725835264
Block size: 4096
Blocks per group: 32768
Inodes per group: 8144
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 3351034
Block groups: 103
Reserved block group size: 823
Created filesystem with 11/838832 inodes and 93654/3351034 blocks
Creating filesystem with parameters:
Size: 734003200
Block size: 4096
Blocks per group: 32768
Inodes per group: 7472
Inode size: 256
Journal blocks: 2800
Label:
Blocks: 179200
Block groups: 6
Reserved block group size: 47
Created filesystem with 11/44832 inodes and 5813/179200 blocks
--------------------------------------------
Bootloader Version...: HHZ12d
Baseband Version.....: M8974A-2.0.50.2.22
Serial Number........: 08ade1a513dc087b
--------------------------------------------
checking product...
OKAY [ 0.100s]
sending 'boot' (8950 KB)...
OKAY [ 0.500s]
writing 'boot'...
OKAY [ 0.784s]
sending 'recovery' (9672 KB)...
OKAY [ 0.556s]
writing 'recovery'...
OKAY [ 0.814s]
erasing 'system'...
OKAY [ 1.166s]
sending 'system' (328187 KB)...
OKAY [ 10.501s]
writing 'system'...
OKAY [ 23.623s]
erasing 'userdata'...
OKAY [ 14.657s]
sending 'userdata' (137318 KB)...
OKAY [ 4.520s]
writing 'userdata'...
OKAY [ 9.776s]
erasing 'cache'...
OKAY [ 0.618s]
sending 'cache' (13348 KB)...
OKAY [ 0.630s]
writing 'cache'...
OKAY [ 1.070s]
rebooting...

finished. total time: 70.095s

刷写流程完成后还要确认能正常启动,并检查 Wi-Fi、相机、声音等所需功能。不要仅凭 fastboot 返回成功或出现桌面,就认定所有厂商二进制都匹配。

7. 秀桌面

最后秀一下当时的桌面:

Nexus 5 历史桌面截图

关于我 && 博客

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

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

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

微信扫一扫

CATALOG
  1. 1. 现在从哪里开始:Android 16 Cuttlefish
  2. 2. 1. 初始化编译环境(Android 5.0.1)
  3. 3. 2. 加载机型
  4. 4. 3. 确认设备和构建类型
    1. 4.1. 3.1 本文使用的机型
    2. 4.2. 3.2 三种构建变体
  5. 5. 4. 准备厂商二进制
  6. 6. 5. 执行编译命令
  7. 7. 6. 刷机命令
  8. 8. 7. 秀桌面
  • 关于我 && 博客