wsl编译android内核并刷入pixel4

由于vmware虚拟机经常死机,所以尝试使用wsl去编译android相关源码

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

不使用共享目录

因为跨文件系统进行读写速度很慢,所以可以直接在wsl系统的目录中进行源码下载。这需要事先扩大wsl的磁盘空间。

PowerShell:
# 关闭所有wsl
wsl --shutdown
# 找到vhdx目录
Get-AppxPackage -Name "*Ubuntu*"| Select PackageFamilyName

diskpart
Select vdisk file=<vhdx file path>
expand vdisk maximum=<size in MB>

WSL:
sudo mount -t devtmpfs none /dev
# 找到磁盘路径名,如/dev/sdc
mount | grep ext4
# 扩容
sudo resize2fs /dev/sdc <size in MB>M

内核源码下载和编译

查看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到当前手机的指定分支。

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

export HTTP_PROXY=
export HTTPS_PROXY=
export REPO_URL='https://gerrit-googlesource.lug.ustc.edu.cn/git-repo'
repo init -u git://mirrors.ustc.edu.cn/aosp/kernel/manifest -b android-msm-coral-4.14-android10
# 需要设置代理 :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,这样再重新编译的时候就不会将之前生成的文件默认全部删除重新生成,编译速度会更快。

解决internal problem问题

因为系统分区中 build.prop 文件中提到的生成指纹与供应商映像中的 build.prop 文件(特别是密钥)之间的不匹配,导致每次开机的时候都会出现internal problem弹窗提示的问题,这是由于供应商分区与系统分区分开构建导致的。

有两种方法解决此问题,第一种就是直接替换/vendor/build.prop/system/build.prop文件使二者内容相同。第二种就是修改/frameworks/base/core/java/android/os/Build.java中的isBuildConsistent函数,直接返回true。

解决所有的问题后进行刷机,查看对应的内核版本发现已经成功。成功解决了触屏,wifi,已经开机弹框的问题。

参考链接:

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
https://android.stackexchange.com/questions/157217/there-is-an-internal-problem-with-your-device-and-it-might-be-unstable-until-y

posted @ 2023-03-24 03:06  怎么可以吃突突  阅读(1708)  评论(0编辑  收藏  举报