技术 252 阅读 评论

    利用github workflow自动编译一加13防熔断内核

    之前我在另外一个帖子(https://xdaforums.com/t/manual-upgrade-of-oneplus-13-to-16-0-8-301-while-preserving-edl-9008-access.4793082/),(博客链接:https://yuanfangblog.xyz/technology/931.html)介绍了如何修改vendor分区并重新打包镜像实现防熔断,但该方法由于rom太大,故无法实现自动化,我之前也说过,除了修改分区还可以通过修改内核实现防熔断,感谢WildKernels的内核补丁,让我们用一种简单的方式实现防熔断:https://github.com/WildKernels/kernel_patches

    11111.jpg

    222222.jpg

    我修改了下cctv18开发的自动化编译脚本,在编译内核的过程中,把WildKernels的0001-module-Add-module-intercept-and-overlay-mechanism-android15-6.6.patch和qcom-scm_sm8750_A16_android15-6.6.89.ko嵌入内核。
    原项目地址https://github.com/cctv18/oppo_oplus_realme_sm8750

    我的防熔断项目地址:https://github.com/uparrows/oppo_oplus_realme_sm8750

    使用方法,fork我的项目,然后在action中启用workflow,选择如图选项,点击Run workflow,勾选:启用模块覆盖机制(将qcom-scm模块嵌入内核,防止内核静默熔断),编译即可。

    333333.jpg

    44444444.jpg

    编译完成后下载AnyKernel3镜像zip包,在系统更新后,重启前使用kernelsu、sukisu等刷写anykrrnel3到另一个槽位,注意一定要在重启手机前刷入内核和403固件的abl_a、xbl_a、xbl_config_a、xbl_ramdump_a四个分区,并且手机解锁了bootloader和禁用vbmeta。

    555555.jpg

    由于我已经降级到15.0.0.861,故无法继续测试后续版本内核补丁有效性,测试时注意备份数据

    如果你的设备已经熔断,该方法对你无效,请不要刷入旧版本的abl_a、xbl_a、xbl_config_a、xbl_ramdump_a,否则会黑砖,只有找售后解决!!

    解释下为什么该方式可以防熔断呢,我们分析下vendor_boot.img的内容

    这里我们先将16.0.8.301的vendor_boot.img提取出来,克隆下git clone https://android.googlesource.com/platform/system/tools/mkbootimg 的源码

    然后进入mkbootimg文件夹中,运行python unpack_bootimg.py --boot_img vendor_boot.img将vendor_boot.img解包,如图

    15.png
    解包后在out目录会得到bootconfig 、dtb、vender_ramdisk00几个文件,如图

    16.png
    使用file命令查看vender_ramdisk00文件发现,这是一个lz4格式的压缩文件,如果你的电脑没有安装lz4,得先使用sudo apt-get install lz4安装。

    然后使用lz4 -dc vender_ramdisk00 | cpio -i 命令将vender_ramdisk00解包,如图:

    17.png

    18.png

    在lib/modules中可以找到有熔断代码的qcom-scm.ko

    19.png

    使用winhex分析搜索arb,可以看到一堆arb_update相关内容。

    20.png

    搜索WildKernels的补丁的qcom-scm_sm8750_A16_android15-6.6.89.ko则搜索不到arb相关内容:

    21.png

    所有我们重新编译内核的目的是使用WildKernels的内核补丁,使用无arb代码的qcom-scm.ko覆盖掉有arb代码的qcom-scm.ko。

    重新编译内核会生成一个anykernel的包,刷入后替换掉原有内核,即可实现防熔断,由于需要替换内核,故必须解锁bootloader。

    不过目前WildKernels的内核补丁适用于6.6.89内核,我不清楚后续新内核能否使用,尝试请谨慎。

    我总想起那天光影的聚合,好像一起一落之间,还看得到光阴的来去。

    0

      暂无评论