准备
做了这么久android开发 渐渐明白作为一个系统需要整体的去看设计结构 仅仅停留在FWK是不行的 性能相关的调度方法 上层也只是简单去调用接口 完全不熟悉底层逻辑 所以在有一套AOSP源码的情况下 基于设备的内核编译的想法就有了
版本:AOSP14(android-14.0.0_r1)
设备:pixel5 O版 已解锁
首先需要编译一遍AOSP并成功刷入pixel5 这里教程很多不再赘述
注:要获取到谷歌和高通的内核镜像 AOSP是不带内核代码的 通过驱动程序二进制文件 在AOSP源码根目录下解压出来生成vendor文件夹 里面的文件不参与编译 只是打包到boot.img等镜像中
内核代码获取
如果你已经编译过AOSP并刷入设备后正常启动的话 可以接着往下看
手机连接adb
#adb root&&adb shell
#cat /proc/version
可以看到这套AOSP的内核信息
linux版本4.19.278 提交节点是g后面的1f0f7f323824 (提交点很重要 需要checkout 否则编译出来的镜像肯定不匹配)
获取对应的内核代码
mkdir kernel-redbull(redbull是pixel5的代号)
这里有用git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git 然后checkout到commit节点 我试了 这个命令没法拉全编译工具 如果自己再去拉取gcc工具很麻烦 具体从AOSP10往后开始prebuilts/gcc/linux-x86/下不再提供arm的交叉编译工具了 自己去搞编译工具很麻烦
所以在这里 建议按repo去拉取对应分支
设备 | AOSP 树中的二进制文件路径 | Repo 分支 |
---|---|---|
Pixel 7 (panther)Pixel 7 Pro (cheetah) | device/google/pantah-kernel | android-gs-pantah-5.10-android13-qpr2 |
Pixel 6a (bluejay) | device/google/bluejay-kernel | android-gs-bluejay-5.10-android13-qpr2 |
Pixel 6 (oriole)Pixel 6 Pro (raven) | device/google/raviole-kernel | android-gs-raviole-5.10-android13-qpr2 |
Pixel 5a (barbet)Pixel 5 (redfin)Pixel 4a (5G) (bramble) | device/google/redbull-kernel | android-msm-redbull-4.19-android13-qpr2 |
Pixel 4a (sunfish) | device/google/sunfish-kernel | android-msm-sunfish-4.14-android13-qpr2 |
Pixel 4 (flame)Pixel 4 XL (coral) | device/google/coral-kernel | android-msm-coral-4.14-android13 |
Pixel 3a (sargo)Pixel 3a XL (bonito) | device/google/bonito-kernel | android-msm-bonito-4.9-android12L |
Pixel 3 (blueline)Pixel 3 XL (crosshatch) | device/google/crosshatch-kernel | android-msm-crosshatch-4.9-android12 |
Pixel 2 (walleye)Pixel 2 XL (taimen) | device/google/wahoo-kernel | android-msm-wahoo-4.4-android10-qpr3 |
Pixel (sailfish)Pixel XL (marlin) | device/google/marlin-kernel | android-msm-marlin-3.18-pie-qpr2 |
Hikey960 | device/linaro/hikey-kernel | hikey-linaro-android-4.14 |
参考这个表
repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-redbull-4.19-android13-qpr2
如果没有条件 把镜像换成中科大或者清华源
https://mirrors.ustc.edu.cn/aosp/kernel/manifest.git/ 中科大
repo sync 等待拉取成功
内核代码编译
想必这时你已经获取对应的内核代码了
不要着急 让我们先切换到对应commit
cd private/msm-google
git checkout 1f0f7f323824
这时已经checkout到对应提交点 代码已经完全对应AOSP版本的内核
退出kernel-redbull
在AOSP目录下 cd out/target/product/redfin 将里面的boot.img文件复制出来
从https://forum.xda-developers.com/attachments/android-image-kitchen-v3-8-win32-zip.5300919/
获取解压工具
解压boot.img(windows操作更便捷)
这就是boot.img对应的信息 通过这些信息 我们制作编译命令
直接在kernel-redbull下执行这个命令
BUILD_CONFIG=private/msm-google/build.config.redbull BUILD_BOOT_IMG=1 MKBOOTIMG_PATH=mkbootimg.py KERNEL_BINARY=Image.lz4 BOOT_IMAGE_HEADER_VERSION=3 KERNEL_CMDLINE="" BASE_ADDRESS=0x00000000 PAGE_SIZE=4096 build/build.sh
(BUILD_CONFIG 编译规则文件 BUILD_BOOT_IMG 生成boot镜像)
最后生成的boot镜像在out/android-msm-pixel-4.19/dist下
我们打开控制台
adb reboot bootloader
fastboot flash boot &boot.img(生成的boot镜像路径)
fastboot reboot
不出意外 出意外了
无法开机 一直循环
不明所以
......
问题结局
不明白为什么 代码正确 编译无报错 编译命令正确 就是不开机
经过长时间探索
终于从一位大佬的博客得到灵感......
从解包出来的ramdisk可以看到 这个东西是需要我们提供的
因为从编译规则文件private/msm-google/build.config.redbull.common来看
GKI_RAMDISK_PREBUILT_BINARY=${ROOT_DIR}/prebuilts/boot-artifacts/ramdisks/ramdisk-aosp_arm64.img
这里有一个ramdisk-aosp_arm64.img 并不知道是什么东西
什么是ramdisk 请参考内核与ramdisk到底是什么关系?_ramdisk是什么-CSDN博客
于是抱着试一试的心态 将从AOSP bootimg解压出来的boot.img-ramdisk.cpio.lz4替换这个路径
GKI_RAMDISK_PREBUILT_BINARY=${ROOT_DIR}/boot.img-ramdisk.cpio.lz4
重新编译
......
成功开机!
并且内核版本从4.19.278-g1f0f7f323824-ab10638992 变成了4.19.278-dirty
为什么会变成dirty 是因为我们修改了仓内的代码 但是没有commit
但正是变成了dirty 说明我们的内核已经替换为我们自己编译的了
到此 结束 开始内核设计逻辑之旅!
特别感谢
https://blog.lleavesg.top/article/pixel5-kernel-build
为我拨开云雾
对于其它手机 同样的道理 一样的编译 希望大家能多交流