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
注意,解锁会清空所有用户数据。嗯,这个操作不可逆,每次解锁都会触发一次数据擦除。我曾经手滑在没备份的情况下解锁了一台测试机,照片全没了,从那以后我养成了刷机前先备份的习惯。
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
核心流程一览
我把整个流程画了张图,方便你理解:
常见问题与避坑
编译和刷写过程中,有几个坑我替你们踩过了,直接说结论:
- 编译报错:多半是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系统吧。