一加13T进行OTA更新后丢失ROOT的补救
前言
前天晚上收到一个ColorOS16的系统更新通知,我没当回事,在我印象中我已经将所有的自动更新的设置都关了,我原本计划后续有空了保ROOT更新一下。
然而不知道是我此前的遗漏,还是某次更新又更改了设置,我的“开启夜间自动更新”是打开的,于是昨天早上一睁眼手机重启了,ROOT也掉了。
于是又翻了翻教程,重新ROOT了一遍。其实也很简单,这里做一个记录。
设备和环境
我的设备是一加 13T,系统已经 OTA 到 ColorOS 16。此前使用的是 KernelSU,所以这次并不是重新解锁 Bootloader,也不是重新走一遍完整 Root 流程,而是重新刷入当前系统版本对应的 KernelSU patched 镜像。
电脑环境是 Windows,使用 Android platform-tools 里的 `adb` 和 `fastboot`:
D:\codedata\Android\platform-tools\adb.exe
D:\codedata\Android\platform-tools\fastboot.exe需要准备:
已解锁 Bootloader 的手机
当前系统版本对应的原厂
init_boot.imgKernelSU Manager
电脑上的
adb/fastboot一根稳定的数据线
这里最重要的一点是:一定要使用当前 OTA 后系统版本对应的 init_boot.img。
OTA 后不要拿旧版本系统的镜像来修补和刷入,否则轻则无法启动,重则增加救砖成本。
获取当前版本的 init_boot.img
这次我用的是这个网站:
这个网站是一个 OnePlus / OPPO / Realme 固件和 OTA 查询站,页面里可以选择设备、地区和系统版本。它比较方便的一点是,不仅能找到 OTA 包,还可以直接在线下载各个子镜像,比如 init_boot.img,不必先下载完整 OTA 包再手动解包。
我的使用方式大概是:
打开网站。
在
Device里选择OP 13T。在
Region里选择对应地区,我这里是国行,所以选择CN。在
Version里找到 OTA 后手机当前系统版本。解析 OTA。
在结果里找到并单独下载
init_boot.img。
这一步非常关键,因为 KernelSU 修补的必须是当前系统版本对应的原厂 init_boot.img。
为什么是 init_boot,不是 boot
一开始我也有点犹豫,因为网上不少旧 Root 教程还在讲刷 boot.img。但现在的新机,尤其是 Android 13 之后出厂的设备,情况已经不太一样。
KernelSU 的 LKM 模式主要修改 ramdisk。对于 Android 13+ 出厂的设备,ramdisk 通常在 init_boot 里,而不是传统的 boot 里。因此这类机器应该修补并刷入 init_boot.img。
我这次先用 KernelSU Manager 修补当前系统版本的原厂 init_boot.img,生成了类似这样的文件:
kernelsu_patched_20260629_130255.img为了确认没搞错,我还检查了一下镜像结构。这个文件大小是 8 MiB,kernel_size=0,只有 ramdisk,符合 init_boot 镜像的特征。
此前我也误生成过一个 96 MiB 左右的 patched boot.img,那个就不是这次应该刷的目标。
连接手机
一开始 ADB 一直显示 offline,后来发现把 USB 行为改成“仅充电”反而正常了。这个问题可能和 ColorOS 的 USB 模式、ADB 授权握手有关。
如果遇到类似情况,可以尝试:
adb kill-server
adb start-server
adb devices -l也可以在手机开发者选项里撤销 USB 调试授权,然后重新插拔数据线,重新允许 RSA 指纹授权。
不过实际刷入 init_boot 并不依赖 ADB,只要能进入 fastboot 即可。
进入 fastboot 并确认状态
手机进入 fastboot 后,先不要急着刷,先做几项只读检查:
& 'D:\codedata\Android\platform-tools\fastboot.exe' devices
& 'D:\codedata\Android\platform-tools\fastboot.exe' getvar unlocked
& 'D:\codedata\Android\platform-tools\fastboot.exe' getvar current-slot
& 'D:\codedata\Android\platform-tools\fastboot.exe' getvar partition-size:init_boot_a
& 'D:\codedata\Android\platform-tools\fastboot.exe' getvar partition-type:init_boot_a我这里的结果大概是:
caa4284e fastboot
unlocked: yes
current-slot: a
partition-size:init_boot_a: 0x800000
partition-type:init_boot_a: raw这几个信息说明:
设备已经在 fastboot 模式
Bootloader 是解锁状态
当前启动槽位是
ainit_boot_a分区存在分区大小是 8 MiB,和 patched 镜像大小一致
因此这次应该刷的是当前槽位的 init_boot_a。
刷入 patched init_boot
确认无误后执行:
& 'D:\codedata\Android\platform-tools\fastboot.exe' flash init_boot_a .\kernelsu_patched_20260629_130255.img刷入成功后重启:
& 'D:\codedata\Android\platform-tools\fastboot.exe' reboot注意几点:
不要刷
boot_a不要刷
init_boot_b不要加
--slot=all不要用旧版本系统的
init_boot.img不要重新锁 Bootloader
如果当前槽位是 b,那就对应刷:
fastboot flash init_boot_b kernelsu_patched_xxx.img总之原则就是:刷当前槽位对应的 init_boot。
救援方案
刷机前最好保留当前版本的原厂 init_boot.img。如果刷完之后卡开机,可以重新进 fastboot,把原厂镜像刷回当前槽位。
比如我当前槽位是 a,救援命令就是:
& 'D:\codedata\Android\platform-tools\fastboot.exe' flash init_boot_a .\init_boot.img
& 'D:\codedata\Android\platform-tools\fastboot.exe' reboot如果当前槽位是 b,就改成 init_boot_b。
结果
重启之后系统正常进入,打开 KernelSU Manager,可以看到 KernelSU 已经重新工作,Root 权限恢复。
这次踩坑主要有两个:
第一,ColorOS 的夜间自动更新真的要仔细检查,尤其是系统更新之后,相关设置可能和自己记忆中的状态不一致。
第二,新设备不要盲目照搬旧教程刷 boot.img。对于一加 13T 这类 Android 13+ 之后出厂、使用 KernelSU LKM 的设备,重点是当前版本的 init_boot.img。只要镜像版本匹配、槽位确认清楚,整个过程其实很快。
最后,roms.danielspringer.at 这个 OTA 查询站这次确实省了不少事。能直接找到当前 OTA 版本,并单独下载 init_boot.img,不用完整下载 OTA 后再解包,对这种 OTA 后补 Root 的场景非常方便。