手动将一加13 升级到 16.0.8.301 版本同时保留 EDL (9008)权限
之前通过刷写旧版本的abl_a、xbl_a、xbl_config_a、xbl_ramdump_a保9008失效了,因为新版本内核代码中加入了防回滚,现在除了刷这几个分区,你还得在刷入新包前解包,自己删除这部分代码,重新编译内核,打包线刷包。
如图,近期更新的源码:
在源码中搜索update_arb可以看到:





看看内容:qcom_scm.c中的:int qcom_scm_update_rollback_version(void)
qcom-dload-mode.c中的 static ssize_t update_arb_store(struct kobject *kobj
所以我有一个想法:fork 内核源代码,移除 update_arb 代码,然后使用自动化编译工具构建一个修改过的 AnyKernel3 内核,去除回滚保护。理论上,在解锁的设备上,更新到新版本后重启前立即刷入这个 AnyKernel3 内核应该是安全的。但是,如果系统在更新后重启,那么应该没用。
内核源代码:https://github.com/OnePlusOSS/android_kernel_oneplus_sm8750
由于重新编译内核对于大多数人可能比较困难,所以我想到了另一种方法。众所周知,Android 在启动时会加载一系列硬件驱动程序。我在vendor.img 中发现包含一个名为 android.hardware.boot-service.qti 的文件。
使用 WinHex 打开该文件并搜索“arb”,我发现它会在启动时加载 /sys/kernel/dload/update_arb。因此,我们可以将其替换为一个不包含此代码的旧版本 android.hardware.boot-service.qti,然后重新打包 vendor.img,并在系统更新后、重启前刷入修改后的 vendor.img。
也许使用winhex将android.hardware.boot-service.qti中的/sys/kernel/dload/update_arb的16进制代码填充成00也可行,不过我没测试。

已知版本 16.0.7.201 和 16.0.8.301 都包含 /sys/kernel/dload/update_arb,所以必须使用版本 16.0.5.703 或更早版本的 android.hardware.boot-service.qti 作为替换。
如图,版本 16.0.5.703 不包含 /sys/kernel/dload/update_arb

接下来我会提供重新打包vender.img的教程,而不是直接提供vender.img,方便不同版本使用
你可以使用ubuntu或者wsl,因为op13的系统镜像是erofs格式,所以我们需要先安装erofs-utils
使用命令sudo apt-get install erofs-utils即可安装
这里我使用wsl做演示。
在宿主机上使用payload_dumper-master将刷机包中的payload.bin解包后会得到一堆分区,将16.0.5.703的vender.img和16.0.8.301的vender.img提取备用。

我的16.0.8.301的vender.img位于/Desktop/payload_dumper-master/output/vendor.img,16.0.5.703的vender.img位于Desktop/payload_dumper-master1/output/vendor.img
在wsl中使用sudo mount /mnt/c/Users/dezhao/Desktop/payload_dumper-master1/output/vendor.img /home/dezhao/op13/vendor_org1命令
和
sudo mount /mnt/c/Users/dezhao/Desktop/payload_dumper-master/output/vendor.img /home/dezhao/op13/vendor_org命令将其分别挂载。
然后使用cd到/home/dezhao/op13文件夹,使用sudo cp -rf --preserve=all vendor_org vendor命令将16.0.8.301的vendor_org复制到vendor文件夹,然后使用sudo rm /home/dezhao/op13/vendor/bin/hw/android.hardware.boot-service.qti删除 vendor文件夹中的android.hardware.boot-service.qti,然后使用sudo cp /home/dezhao/op13/vendor_org1/bin/hw/android.hardware.boot-service.qti /home/dezhao/op13/vendor/bin/hw/android.hardware.boot-service.qti将旧版本的android.hardware.boot-service.qti复制到hw目录下。
然后umount所有目录:sudo umount /home/dezhao/op13/vendor_org
sudo umount /home/dezhao/op13/vendor_org1
最后在/home/dezhao/op13目录下使用sudo mkfs.erofs -zlz4hc vendor.img vendor/打包即可


注意在升级后重启设备之前将vendor.img、abl.img、xbl.img、xbl_config.img、xbl_ramdump.img通通刷入。
abl.img, xbl.img, xbl_config.img, and xbl_ramdump.img这几个分区可以从安全的旧版本中提取arb0的版本,比如我是从403版本中提取的。
16.0.8.301可用,我不确定后续版本是否有效,测试前请备份好数据
刷入分区:
首先将所有分区复制到手机根目录,
adb shell 连接到手机
su
使用getprop ro.boot.slot_suffix获取当前slot
比如我运行后输出_b
那么我的更新是安装到_a
所以我的刷入命令是:
blockdev --setrw /dev/block/bootdevice/by-name/abl_a
blockdev --setrw /dev/block/bootdevice/by-name/xbl_a
blockdev --setrw /dev/block/bootdevice/by-name/xbl_config_a
blockdev --setrw /dev/block/bootdevice/by-name/xbl_ramdump_a
blockdev --setrw /dev/block/bootdevice/by-name/vendor_a
这5条命令是将上面各分区置于可写状态。
dd if=/sdcard/abl.img of=/dev/block/bootdevice/by-name/abl_a
dd if=/sdcard/xbl.img of=/dev/block/bootdevice/by-name/xbl_a
dd if=/sdcard/xbl_config.img of=/dev/block/bootdevice/by-name/xbl_config_a
dd if=/sdcard/xbl_ramdump.img of=/dev/block/bootdevice/by-name/xbl_ramdump_a
dd if=/sdcard/vendor.img of=/dev/block/bootdevice/by-name/vendor_a
这5条是刷入命令。
如果getprop ro.boot.slot_suffix输出_a,那么就都刷入slot b,上面的各分区后缀改成_b即可。
如果需要16.0.8.301的vendor和其余几个文件打包可以留言,文件太大上传比较慢。

最后测试9008

我已经把系统更新冻结,防止在不知不觉间被更新。
0
暂无评论