22、Google Pixel与AOSP:Pixel设备的Fastboot特性、AOSP源码编译与刷写

聊到Android底层开发,Google Pixel系列设备是绕不开的标杆。说实话,我最早接触Android源码编译那会儿,用的还是Nexus 5X。那时候踩坑踩得我头皮发麻,但回过头来看,正是这些经历让我对Bootloader和Fastboot有了真正的理解。

今天我们就来聊聊Pixel设备的Fastboot特性,以及如何从AOSP源码编译出能跑在Pixel上的镜像,最后把它刷进去。

为什么是Pixel?

你可能会问:市面上那么多Android手机,为什么偏偏选Pixel?

原因很简单——Pixel是Google的亲儿子。它用的Bootloader和Fastboot实现,就是AOSP里最标准的那个版本。其他厂商或多或少都魔改过,有的甚至把Fastboot给阉割了。我在项目里遇到过某厂商的设备,fastboot devices死活认不到,最后发现是厂商把USB VID/PID改了,还得手动加配置。

Pixel就不一样。你拿一台Pixel,插上USB线,进入Bootloader模式,fastboot devices立马就能认出来。这种开箱即用的体验,对学习来说太重要了。

Pixel设备的Fastboot特性

Pixel的Fastboot有几个关键特性,我挑重点说。

1. 解锁Bootloader

这是第一步。Pixel的Bootloader默认是锁着的,你得先解锁才能刷写自定义镜像。

# 进入Bootloader模式
adb reboot bootloader

# 解锁Bootloader
fastboot flashing unlock

注意,解锁会清空所有用户数据。嗯,这个操作不可逆,每次解锁都会触发一次数据擦除。我曾经手滑在没备份的情况下解锁了一台测试机,照片全没了,从那以后我养成了刷机前先备份的习惯。

警告:解锁Bootloader会触发AVB(Android Verified Boot)的熔断机制。某些Pixel设备解锁后,部分功能(如Google Pay)会永久失效,即使重新上锁也无法恢复。

2. 分区布局

Pixel的分区布局和AOSP标准布局高度一致。常用的分区有:

分区名 用途 说明
boot 内核+ramdisk 启动镜像,包含Linux内核和initramfs
system 系统镜像 Android系统文件
vendor 厂商定制 硬件相关驱动和库
userdata 用户数据 应用、设置、文件等
vbmeta 验证元数据 AVB校验信息

我个人习惯在刷机前先用 fastboot getvar all 看一眼当前分区状态,确认设备信息无误再动手。

3. 槽位(Slot)机制

从Pixel 2开始,Google引入了A/B槽位机制。说白了就是系统有两套分区,一套是当前运行的,另一套是备用的。OTA更新时,新系统会写到备用槽位,下次重启切换过去。

这个机制对Fastboot刷写也有影响。你刷镜像的时候,得指定刷到哪个槽位:

# 刷到当前槽位
fastboot flash boot boot.img

# 刷到指定槽位
fastboot flash boot_a boot.img
fastboot flash boot_b boot.img

我记得有一次,我只刷了boot_a,忘了刷boot_b,结果系统在槽位切换时直接变砖。从那以后,我刷机都习惯两个槽位一起刷,省心。

AOSP源码编译与刷写

好,理论说完了,我们来点实际的。怎么从AOSP源码编译出Pixel能用的镜像?

1. 环境准备

编译AOSP对机器要求不低。我建议至少16GB内存,200GB以上磁盘空间。Ubuntu 20.04 LTS是我用得最顺手的版本。

# 安装依赖
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

2. 下载源码

用repo工具同步AOSP源码。这里要注意,指定Pixel设备的branch:

# 初始化repo
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41

# 同步源码(这一步很慢,建议用代理)
repo sync -j8

同步时间取决于网络。我第一次同步花了整整一个下午,后来换了国内镜像源,速度快了不少。

3. 选择设备配置

Pixel 6 Pro的代号是raven。编译前需要加载对应的设备配置:

# 加载环境变量
source build/envsetup.sh

# 选择目标设备
lunch aosp_raven-userdebug

这里我选的是userdebug版本。它既有user版本的稳定性,又保留了root权限和调试功能,适合开发测试用。

4. 开始编译

# 编译系统镜像
make -j$(nproc)

编译时间取决于机器性能。我的工作站大概40分钟能编完,笔记本的话可能要2小时。编译过程中如果报错,多半是依赖问题或者磁盘空间不足。

提示:编译时加上 ANDROID_COMPILE_WITH_JACK=false 可以避免一些老版本Jack编译器的兼容性问题。我遇到过好几次Jack内存溢出,换成默认的D8/R8就没事了。

5. 刷写镜像

编译完成后,镜像文件在 out/target/product/raven/ 目录下。刷写命令如下:

# 进入Bootloader
adb reboot bootloader

# 刷写所有分区
fastboot flashall -w

-w 参数会清空userdata分区。如果你不想清数据,去掉这个参数就行。不过我个人建议第一次刷机时带上,避免旧数据干扰新系统。

如果你只想刷某个分区,比如只更新内核:

fastboot flash boot out/target/product/raven/boot.img
fastboot reboot

核心流程一览

我把整个流程画了张图,方便你理解:

Pixel设备AOSP编译与刷写流程 1. 环境准备 Ubuntu + 依赖安装 2. 下载源码 repo init + repo sync 3. 选择设备 lunch aosp_raven 4. 编译镜像 make -j$(nproc) 5. 进入Bootloader adb reboot bootloader 6. 刷写镜像 fastboot flashall -w 7. 重启验证 fastboot reboot 关键注意事项 • 解锁Bootloader会清空数据,提前备份 • 编译时间较长,建议用高配机器 • 刷写时注意A/B槽位,两个槽位都刷 • 遇到问题先看 fastboot getvar all

常见问题与避坑

编译和刷写过程中,有几个坑我替你们踩过了,直接说结论:

  • 编译报错:多半是Java版本不对。AOSP 13要求OpenJDK 11,别用更高版本。
  • 刷写失败:检查USB线。我遇到过劣质USB线导致刷写到一半断连,设备直接变砖。建议用原装线。
  • 设备不识别:确认驱动装好了。Linux下要配置udev规则,Windows下要装Google USB驱动。
  • 开机卡在Google Logo:多半是vbmeta没刷或者AVB校验失败。重新刷一下vbmeta分区,加上 --disable-verification 参数。

核心要点:Pixel设备是学习Android底层开发的最佳平台。它的Fastboot实现标准、分区布局清晰、AOSP支持完善。掌握了Pixel的编译和刷写流程,其他设备基本就是换汤不换药。

好了,关于Pixel和AOSP的内容就聊到这里。记住,理论看再多,不如自己动手编译一次。找个周末,准备好机器和耐心,从源码编译一个属于你自己的Android系统吧。

公众号:蓝海资料掘金营,微信deep3321