Android Kernel Build

Android Kernel Build

整个kernel的编译过程还是踩了许多坑的,前一周搞得,再不写估计就忘了怎么编译的了

环境说明

因为其实没找到对应的taimen PIXEL2XL的linux kernel版本,然后第一次刷把手机刷坏了(只能卡在fastboot界面了),然后所有的fastboot的命令全部失败

image-20220906091100060

问了原来买手机的老板,说

8.0的我也是 用win7系统的电脑才能刷 搞不懂原因

所以抽时间把手机发给老板重刷吧,我觉得一开始应该是好的,只是后来我kernel版本刷崩了

具体环境,linuxkernel我用的是ubuntu20,AOSP还是沿用r0env,直接按照原先编译AOSP的方法编译即可

image-20220906092531067

AOSP自带有编译好的kernel image,再整个AOSP编译完成之后会被打包到boot.img中,所以我们把自编译的内核能重打包替换到boot.img里面就可以刷入我们的内核

下载源码

Android : 修改内核源码 and 编译、打包成新的boot.img - sheldon_blogs - 博客园 (cnblogs.com)

先下载kernel的源码,现在Google提供了分支的下载了

1
git clone https://android.googlesource.com/kernel/msm.git

几个分支,我们主流用Google系的产品,就下载msm就行了

1
2
3
4
5
6
7
8
goldfish 项目包含适用于所模拟的平台的内核源代码。
msm 项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作使用 Qualcomm MSM 芯片组的起点。
omap 项目用于 PandaBoard 和 Galaxy Nexus,可用作使用 TI OMAP 芯片组的起点。
samsung 项目用于 Nexus S,可用作使用 Samsung Hummingbird 芯片组的起点。
tegra 项目用于 Xoom、Nexus 7 (2012)、Nexus 9,可用作使用 NVIDIA Tegra 芯片组的起点。
exynos 项目包含适用于 Nexus 10 的内核源代码,可用作使用 Samsung Exynos 芯片组的起点。
x86_64 项目包含适用于 Nexus Player 的内核源代码,可用作使用 Intel x86_64 芯片组的起点。
hikey-linaro 项目用于 HiKey 参考板,可用作使用 HiSilicon 620 芯片组的起点。

msm下面还有很多具体型号的分支

image-20220906095032251

grep一下bullhead的分支

image-20220906095822557

我们编译的AOSP是8.0的oreo,所以切换到这个版本

remotes/origin/android-msm-bullhead-3.10-oreo-m2

编译源码

先切换到bullhead上面

git checkout remotes/origin/android-msm-bullhead-3.10-oreo-m2

编译之前也得先clone一下aarch64的gcc

1
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/

这个clone下来之后也包含大量的分支,我们配套的是oreo Android8.0,因此就将其切换到8.0的分支

1
origin/oreo-m2-release

编译的时候出现forbidden的错

(38条消息) android编译error, forbidden warning出错问题解决_loongembedded的博客-CSDN博客

1
2
3
4
5
6
7
8
9
3.gcc-wrapper.py中注释掉interpret_warning(line)即可

kernel\msm-4.9\scripts\gcc-wrapper.py

try:
proc = subprocess.Popen(args, stderr=subprocess.PIPE)
for line in proc.stderr:
print >> sys.stderr, line,
#interpret_warning(line) #注释掉这行

Android 驱动开发—Android Linux 内核编译 Nexus 5x (daimajiaoliu.com)

1
2
3
4
5
6
export PATH=$PATH:/mnt/android/android-e-7.1.1-r31/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
export ARCH=arm64
export SUBARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
make bullhead_defconfig
make

声明几个环境变量之后,直接make就行,make -j4这种多核编译好像有莫名其妙的错误

如果想自己修改内核选项,就先运行完make bullhead_defconfig,执行make menuconfig,修改.config文件

最后编译完成的kernel image在这个下面

image-20220906114033714

重打包Kernel

两种方式

一种是替换AOSP编译时的kernel文件,这样编译完ASOP自动就打包到boot.img里面了

image-20220906110114679

bullhead的就在这个目录下面

第二种方式是直接对boot.img进行操作

用到的工具是AIK

Kernel Hack实战:修改并编译手机内核源码对抗反调试 - FreeBuf网络安全行业门户

osm0sis/Android-Image-Kitchen at AIK-Linux (github.com)

直接把boot.img放到同级目录下,然后执行unpackimg.sh

image-20220906110806099

我们的目标就是替换这个boot.img-kernel,之后再调用repackimg.sh,就可以重打包成新的image-new.image

之后为了防止损坏原有的系统,可以采用临时刷入boot的方法,

image-20220906111207295

总结

内核编译虽然有成熟的工具链,但是相对来讲还是比较复杂,在我自己编译的实践的过程中也是会遇到各种各样的错误,只能说按照上面的步骤,确实是编译成功了,如果突然遇到什么问题,可以重置一下环境,

在编译的过程中,最关键的还是gcc和kernel的版本要对