0x01 编译背景
本片文章讲描述如何编译pixel 5 内核,pixel 5 内核编译的过程和pixel 6的有很大的不同。
接来跟着我一起了解如何编译出pixel 5内核,我会给出详细的步骤说明,我遇到的问题以及pixel5 是非GKI,是如何编译出内核的。
首先有关 内核编译的基础知识参考: https://source.android.google.cn/docs/setup/build/building-pixel-kernels?hl=zh-cn#restore_the_factory_images
旧版Pixel 内核: https://source.android.google.cn/docs/setup/build/building-pixel-kernels?hl=zh-cn#restore_the_factory_images
为了防止手机刷入失败,无法正常开始,可以下载原有的固件包: https://developers.google.com/android/images?hl=zh-cn
编译环境: Ubuntu18.04 (300G + 32G内存 )
当前手机的内核信息
1 2 3
| Linux localhost 4.19.110-g9ceb3bf92e0a-ab6790968 #2 SMP PREEMPT Wed Aug 26 04:14:37 UTC 2020 aarch64
版本号: RD1A.200810.021.B3
|
0x02 下载内核 & 编译内核
首先拉取 android-msm-redbull-4.19-android11-qpr2 分支的代码
1
| repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-redbull-4.19-android11-qpr2
|
然后同步代码, 这可能需要花一些时间,喝杯咖啡,等待。
同步完代码之后你会获取到如下所示的结构

进入到 private 的目录中,这里存放着内核所需的所有代码,并且将当前分支checkout到当前手机内核的CommitID,否则运行 redbull_build.sh
会报错。
commitID 可以执行 uname -a 查看
1
| cd /private/msm-google/ ; git checkout 9ceb3bf92e0a
|
编译内核,如果你的编译环境资源有限,那么编译的过程需要很长一段时间。

编译完成后,在 out
目录中可以看到 boot.img
, vendor_boot.img
,还有很多的驱动模块文件。

这个时候,你以为你已经顺利的将内核镜像编译出来,然后迫不及待的刷入到手机中,很不幸,我尝试了很多遍,手机会开不了机,手机会一直在 bootloader页面,仿佛少了很多必要的文件。
其实这是因为Google Android 推行GKI 机制之后,部分设备的内核和Android 源码库可以分离,单独编译内核和AOSP,因此pixel 5 的内核不能单独编译。
因此需要和AOSP 一起进行编译。
0x03 AOSP编译
拉取AOSP 的 android-11.0.0_r34 分支的代码并同步代码
1 2
| root@:~/aosp/pixel5_android-11.0.0_r34 root@:~/aosp/pixel5_android-11.0.0_r34
|

下载vendor 对应的驱动镜像: https://developers.google.com/android/drivers#bramblerd1a.200810.021.b3

获取到vendor 驱动镜像zip 后,解开会获取到extract-google_devices-redfin.sh
文件。
- 赋予文件执行的权限,然后执行sh 脚本
- 执行脚本后,会新建vendor 文件夹,给 vendor 文件夹权限
1 2 3
| root@:~/aosp/pixel5_android-11.0.0_r34 root@:~/aosp/pixel5_android-11.0.0_r34 root@:~/aosp/pixel5_android-11.0.0_r34
|
开始编译
1 2 3
| root@4:~/aosp/pixel5_android-11.0.0_r34 root@4:~/aosp/pixel5_android-11.0.0_r34 root@4:~/aosp/pixel5_android-11.0.0_r34
|
编译的时间会要很久

现在可以将编译好的镜像刷入到手机中
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
| E:\android-11.0.0_r34>set ANDROID_PRODUCT_OUT=./ E:\android-11.0.0_r34>fastboot flashall -w E:\android-11.0.0_r34 DIR: 2024/06/19 15:57 <DIR> . 2024/06/19 15:57 <DIR> .. 2024/06/19 15:57 22 android-info.txt 2024/06/19 15:52 26,533,888 boot-debug.img 2024/06/19 15:52 100,663,296 boot.img 2024/06/19 15:51 9,103,752 bootloader.img 2024/06/19 15:51 335,787 dtb.img 2024/06/19 15:51 16,777,216 dtbo.img 2024/06/19 15:51 239,603,860 product.img 2024/06/19 15:50 137,891,980 radio.img 2024/06/19 15:50 14,426,115 ramdisk-debug.img 2024/06/19 15:50 14,252,291 ramdisk-recovery.img 2024/06/19 15:50 940,919 ramdisk.img 2024/06/19 15:50 4,976 super_empty.img 2024/06/19 15:50 880,324,888 system.img 2024/06/19 15:47 107,098,236 system_ext.img 2024/06/19 15:47 24,416,368 system_other.img 2024/06/19 15:47 2,785,604 userdata.img 2024/06/19 15:47 8,192 vbmeta.img 2024/06/19 15:47 4,096 vbmeta_system.img 2024/06/19 15:47 8,566,493 vendor-ramdisk-debug.cpio.lz4 2024/06/19 15:47 706,507,008 vendor.img 2024/06/19 15:45 8,908,800 vendor_boot-debug.img 2024/06/19 15:45 100,663,296 vendor_boot.img
|
fastboot flashall -w 完整日志
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
| E:\2__file\pixel5\2__aosp编译\android-11.0.0_r34>fastboot flashall -w -------------------------------------------- Bootloader Version...: r3-0.6-10489834 Baseband Version.....: g7250-00264-230619-B-10346159 Serial Number........: 12231FDD400260 -------------------------------------------- android-info.txt syntax error: require board=redfin Setting current slot to 'b' OKAY [ 0.082s] Sending 'boot_b' (98304 KB) OKAY [ 3.254s] Writing 'boot_b' OKAY [ 0.309s] Sending 'dtbo_b' (16384 KB) OKAY [ 0.635s] Writing 'dtbo_b' OKAY [ 0.105s] Sending 'vbmeta_b' (8 KB) OKAY [ 0.136s] Writing 'vbmeta_b' OKAY [ 0.074s] Sending 'vbmeta_system_b' (4 KB) OKAY [ 0.135s] Writing 'vbmeta_system_b' OKAY [ 0.072s] Sending 'vendor_boot_b' (17896 KB) OKAY [ 0.698s] Writing 'vendor_boot_b' OKAY [ 0.127s] Rebooting into fastboot OKAY [ 0.065s] < waiting for any device > Sending 'super' (4 KB) OKAY [ 0.004s] Updating super partition OKAY [ 0.012s] Resizing 'product_b' OKAY [ 0.005s] Resizing 'system_b' OKAY [ 0.006s] Resizing 'system_ext_b' OKAY [ 0.005s] Resizing 'system_a' OKAY [ 0.006s] Resizing 'vendor_b' OKAY [ 0.005s] Resizing 'vendor_a' OKAY [ 0.006s] Resizing 'product_b' OKAY [ 0.007s] Sending 'product_b' (233988 KB) OKAY [ 7.788s] Writing 'product_b' OKAY [ 0.861s] Resizing 'system_b' OKAY [ 0.005s] Sending sparse 'system_b' 1/4 (262140 KB) OKAY [ 8.849s] Writing 'system_b' OKAY [ 1.042s] Sending sparse 'system_b' 2/4 (262140 KB) OKAY [ 8.685s] Writing 'system_b' OKAY [ 1.039s] Sending sparse 'system_b' 3/4 (262140 KB) OKAY [ 8.734s] Writing 'system_b' OKAY [ 1.025s] Sending sparse 'system_b' 4/4 (73272 KB) OKAY [ 2.440s] Writing 'system_b' OKAY [ 0.316s] Resizing 'system_ext_b' OKAY [ 0.004s] Sending 'system_ext_b' (104588 KB) OKAY [ 3.458s] Writing 'system_ext_b' OKAY [ 0.420s] Resizing 'system_a' OKAY [ 0.005s] Sending 'system_a' (23844 KB) OKAY [ 0.780s] Writing 'system_a' OKAY [ 0.118s] Resizing 'vendor_b' OKAY [ 0.006s] Sending sparse 'vendor_b' 1/3 (262140 KB) OKAY [ 8.755s] Writing 'vendor_b' OKAY [ 1.046s] Sending sparse 'vendor_b' 2/3 (262140 KB) OKAY [ 8.828s] Writing 'vendor_b' OKAY [ 1.011s] Sending sparse 'vendor_b' 3/3 (165668 KB) OKAY [ 5.501s] Writing 'vendor_b' OKAY [ 0.655s] Erasing 'userdata' OKAY [ 11.329s] Erase successful, but not automatically formatting. File system type raw not supported. Erasing 'metadata' OKAY [ 0.012s] Erase successful, but not automatically formatting. File system type raw not supported. Rebooting OKAY [ 0.000s] Finished. Total time: 507.074s
|

刷入成功后,可以开机了。
0x04 AOSP整合custom Kernel
其实AOSP中的内核并不是自定义的,而是本身就预编译好的镜像文件。如果需要自定义的内核,那么就需要将之前编译好的custom kernel 生成的各种文件拷贝到 AOSP 中的device 文件夹内,具体的步骤如下:
1 2 3 4 5 6 7 8 9 10 11
| cd /root/aosp/android-msm-redbull-4.19-android11-qpr2/out/android-msm-pixel-4.19/dist
cp /root/aosp/android-msm-redbull-4.19-android11-qpr2/out/android-msm-pixel-4.19/dist/*.ko /root/aosp/pixel5_android-11.0.0_r34/device/google/redbull-kernel/
cp /root/aosp/android-msm-redbull-4.19-android11-qpr2/out/android-msm-pixel-4.19/dist/Image.lz4 /root/aosp/pixel5_android-11.0.0_r34/device/google/redbull-kernel/
cp /root/aosp/android-msm-redbull-4.19-android11-qpr2/out/android-msm-pixel-4.19/dist/Image.lz4-dtb /root/aosp/pixel5_android-11.0.0_r34/device/google/redbull-kernel/
cp /root/aosp/android-msm-redbull-4.19-android11-qpr2/out/android-msm-pixel-4.19/dist/kernel-uapi-headers.tar.gz /root/aosp/pixel5_android-11.0.0_r34/device/google/redbull-kernel/
cp /root/aosp/android-msm-redbull-4.19-android11-qpr2/out/android-msm-pixel-4.19/dist/kernel-headers.tar.gz /root/aosp/pixel5_android-11.0.0_r34/device/google/redbull-kernel/
|
重新编译AOSP
1 2 3
| root@4:~/aosp/pixel5_android-11.0.0_r34 root@4:~/aosp/pixel5_android-11.0.0_r34 root@4:~/aosp/pixel5_android-11.0.0_r34
|
由于第一次AOSP编译成功了,所以第二次再编译只需要很短的时间。

接下来,刷入custom kernel 需要两个文件 boot.img 和 vendor_boot.img 。
- boot.img 使用的是 AOSP /out 目录中的boot.img
- vendor_boot.img 使用的是 kernel /out 目录内的 vendor_boot.img

刷入1 2 3 4
| adb reboot bootloader fastboot flash boot boot.img fastboot flash vendor_boot vendor_boot.img fastboot reboot
|
为了测试内核是否真的刷入,可以在内核代码中添加一些调试输出

刷入内核后

并且可以看到内核的版本已经更换了。

另外内核版本中有 _dirty
, 这是因为修改了内核的代码,内核已经和分支不一样了,只需git commit
就可以解决。