pixel 5 编译自定义内核全过程

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

然后同步代码, 这可能需要花一些时间,喝杯咖啡,等待。

1
repo sync

同步完代码之后你会获取到如下所示的结构

进入到 private 的目录中,这里存放着内核所需的所有代码,并且将当前分支checkout到当前手机内核的CommitID,否则运行 redbull_build.sh会报错。

commitID 可以执行 uname -a 查看

1
cd /private/msm-google/ ; git checkout 9ceb3bf92e0a

编译内核,如果你的编译环境资源有限,那么编译的过程需要很长一段时间。

1
./build_redbull.sh


编译完成后,在 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# repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r34
root@:~/aosp/pixel5_android-11.0.0_r34# repo sync

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

获取到vendor 驱动镜像zip 后,解开会获取到extract-google_devices-redfin.sh 文件。

  1. 赋予文件执行的权限,然后执行sh 脚本
  2. 执行脚本后,会新建vendor 文件夹,给 vendor 文件夹权限
    1
    2
    3
    root@:~/aosp/pixel5_android-11.0.0_r34# chmod 777 extract-google_devices-redfin.sh
    root@:~/aosp/pixel5_android-11.0.0_r34# ./extract-google_devices-redfin.sh
    root@:~/aosp/pixel5_android-11.0.0_r34# chmod -R 777 vendor/

开始编译

1
2
3
root@4:~/aosp/pixel5_android-11.0.0_r34# source build/envsetup.sh
root@4:~/aosp/pixel5_android-11.0.0_r34# lunch // select aosp_redfin-userdebug
root@4:~/aosp/pixel5_android-11.0.0_r34# make

编译的时间会要很久

现在可以将编译好的镜像刷入到手机中

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# source build/envsetup.sh
root@4:~/aosp/pixel5_android-11.0.0_r34# lunch // select aosp_redfin-userdebug
root@4:~/aosp/pixel5_android-11.0.0_r34# make

由于第一次AOSP编译成功了,所以第二次再编译只需要很短的时间。

接下来,刷入custom kernel 需要两个文件 boot.img 和 vendor_boot.img 。

  1. boot.img 使用的是 AOSP /out 目录中的boot.img
  2. 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就可以解决。


pixel 5 编译自定义内核全过程
https://tig3rhu.github.io/2024/07/28/5__pixel5_build_custom_kernel/
Author
Tig3rHu
Posted on
July 28, 2024
Licensed under