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
即可对源码进行编译,最后会生成Image
,Image.lz4
和Image.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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】