wsl编译android内核并刷入pixel4

发布时间 2023-03-24 03:12:29作者: 怎么可以吃突突

使用wsl编译而不是通过vmware虚拟机的原因是因为我想将源码放在虚拟机与宿主机的共享目录中,这样在windows宿主机中方便查看和修改源码,而且不用增加使用虚拟机并为其增加磁盘空间。那为什么不放在vmware虚拟机的共享目录中呢,原因是因为vmware虚拟机的共享目录中不能创建文件链接,在源码编译的过程中会出错,wsl的共享目录并不会有此问题。

wsl编译环境

环境依赖参考编译android的aosp源码时设置的环境 https://www.cnblogs.com/revercc/p/16826591.html,这里注意wsl使用的ext4文件系统,此文件系统区分大小写,而windows由于历史原因使用的是NTFS文件系统,此文件系统默认是不区分大小写的。所以在wsl的共享目录中需要开启区分大小写,通过windows的fsutil.exe工具进行设置。

// 开启share_path共享目录区分大小写
fsutil.exe file setCaseSensitiveInfo <share_path> enable
// 查询是否开启成功
fsutil.exe file queryCaseSensitiveInfo <share_path>

同时需要注意需要在下载源码前就为共享目录开启区分大小写,原因是区分大小的设置只会对当前目录已有的文件生效,对其子目录以及子目录中的文件并不会生效,只有新创建的文件才会继承此设置。具体原因请参考https://learn.microsoft.com/zh-cn/windows/wsl/case-sensitivity

内核源码下载和编译

查看pixel4的内核版本为4.14.111,对应的分支就是b7713fd5d6ed。这里可以使用git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git拉取内核源码并checkout到b7713fd5d6ed分支获取源码,但是这样需要自己去配置源码编译环境,下载对应的编译工具链。

还有一种简单的方法就是google提供了使用repo下载源代码,工具链和编译脚本。根据提示对于pixel4的话最新版本的repo分支为android-msm-coral-4.14-android13,因为我机子使用的是android10,所以对应的repo分支自然就是android-msm-coral-4.14-android10。其他机型请参考链接https://source.android.google.cn/docs/setup/build/building-kernels?hl=zh-cn#customize-config

wsl需要设置代理保证网络通畅,repo sync下载对应的内核源码后进入到源码根目录下即可checkout到当前手机的指定分支。

repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-coral-4.14-android10
repo sync
cd private\msm-google\
//切换到对应的分支
git checkout b7713fd5d6ed

执行build/build.sh即可对源码进行编译,最后会生成ImageImage.lz4Image.lz4-dtb

打包boot.img并刷入

接下来就需要生成boot.img文件并刷入手机,生成boot.img的方法有两种,第一种是利用内核编译生成的Image.lz4-dtb去重新编译aosp源码生成对应的boot.img,重编译aosp源码前设置环境变量TARGET_PREBUILT_KERNEL

export TARGET_PREBUILT_KERNEL=/mnt/e/android-msm-coral-4.14-android10/out/android-msm-floral-4.14/private/msm-google/arch/arm64/boot/Image.lz4-dtb

第二种就是将原始的boot.img进行解包,将内核编译生成的Image.lz4-dtb替换kernel文件后再进行重打包,使用unmkbootimg将原始boot.img进行解包,将Image.lz4-dtb重命名后替换kernel文件,然后根据unmkbootimg给出的重打包命名重新生成新的boot.img

最后将新打包的boot.img刷入手机即可

解决触屏失效等问题

因为新编译内核的version magic 和 原始手机中的一些驱动模块(触屏驱动等)的version magic不匹配,导致再开机时内核代码校验失败后无法insmod。解决方法有两个,第一种就是通过将内核编译时新生成的触屏驱动等内核模块push到/vendor/lib/modules中,第二种就是修改内核代码中检查version magic是否匹配的代码并将触屏驱动编译进内核。

替换新的驱动模块

第一种解决触屏失效等问题的方法就是替换驱动模块,内核编译新生成的触屏驱动等驱动模块在\out\android-msm-floral-4.14\dist目录下。

将所有的ko文件放在一个独立的目录中,adb push到/verdor/lib/modules

adb push E:\ko/.  /vendor/lib/modules

修改内核中的检查代码

第二种解决触屏失效等问题的方法就是修改内核中的检查代码,首先修改/kernel/module.c中的check_modinfo函数,将失败返回的代码注释掉。

同时还需要将触屏驱动编译到内核中,而不是作为驱动模块生成。这需要修改内核编译配置文件,而默认情况下配置文件有检查,需要先去除检查,检查脚本在build/build.config文件中,将检查脚本注释即可。(如果不去除配置文件检查脚本命令的话,想要修改配置文件需要按照标准的方法修改,通过可视化菜单,具体请参考:https://blog.seeflower.dev/archives/174/#title-3

默认的配置文件由/build.config.common文件指定,可以看到此时默认的内核配置文件为floral_defconfig,对应的路径就在/arch/arm64/configs/floral_defconfig

修改配置文件floral_defconfig,去除CONFIG_MODVERSIONS=y表示不检查驱动模块和内核的version magic是否一致,增加CONFIG_TOUCHSCREEN_FTS=y表示将触屏驱动编译进内核。

然后重新编译内核,这里可以使用环境变量export SKIP_MRPROPER=1 SKIP_EXT_MODULES=1,这样再重新编译的时候就不会将之前生成的文件默认全部删除重新生成,编译速度会更快。刷入boot.img后查看对应的内核版本发现已经成功。

参考链接:

https://bbs.kanxue.com/thread-264295.htm
https://blog.seeflower.dev/archives/174/#title-3
https://learn.microsoft.com/zh-cn/windows/wsl/case-sensitivity
https://source.android.google.cn/docs/setup/build/building-kernels?hl=zh-cn#customize-config