保留 用户数据 和 Root 权限进行系统增量更新
WARNING
此为进阶玩法,不建议没有命令行基础的用户进行操作。推荐先阅读 dd 命令教程。
本玩法需要的文件应当都可以在群文件中找到,但是强烈建议自己在更新每个版本后都保留自己的 boot 镜像
感谢群友@T_T的读写块设备方式!
IMPORTANT
为了正确应用增量更新,必须还原所有修改过的分区。
例如刷入了第三方 Recovery ,就需要还原当前活动插槽的 recovery ;刷入了 vendor_boot 进行降压,就需要还原 vendor_boot 和 vbmeta 。
关于上面提及的 vbmeta ,请参考 AVB 入门 。
GKI 模式
一个时代结束了...
1.5.04.445 修复了免解锁漏洞,如果可能,请解锁刷机。
GKI 弃用提示
KernelSU 官方维护的 GKI 内核已经停止更新。
小新 Pad Pro GT 刷入 GKI 内核进行 Root 后,在恢复出厂时可能会出现卡第一屏 / 第二屏的问题。要解决这个问题,请将活动插槽的 boot 镜像替换为原厂镜像。
基于以上考虑,我们不再推荐使用 GKI 作为设备获取 Root 的方式。建议您尽快参考还原原厂 boot 镜像的 教程 还原镜像,如有需要,再使用 LKM 获取 Root 。
Step 1:
关闭所有模块,重启设备。
Step 2:
重启后在内置存储根目录放置原始 boot 镜像 original.img 和拥有 Root 的镜像(以 KernelSU 为例) ksu.img 。确认自己设备的槽位:
su -c getprop ro.boot.slot_suffix如果返回 _a ,说明现在在 A 槽,如果返回 _b ,说明当前在 B 槽。 现在在拥有 Root 权限的终端模拟器输入下面的命令: 如果当前在 A 槽位:
su -c dd if=/sdcard/original.img of=/dev/block/by-name/boot_a如果当前在 B 槽位:
su -c dd if=/sdcard/original.img of=/dev/block/by-name/boot_b现在不要重启设备!
Step 3:
正常更新系统。如成功,转到 步骤5 ,如失败,转到 步骤4。
Step 4:
如果更新进度条没走完就提示 当前已是最新版本 并收到 安装更新失败 的通知,说明本方法不适合,用 dd 命令刷回你原来的镜像:
如果当前在
A槽位:bashsu -c dd if=/sdcard/ksu.img of=/dev/block/by-name/boot_a如果当前在
B槽位:bashsu -c dd if=/sdcard/ksu.img of=/dev/block/by-name/boot_b
Step 5:
在提示 重启设备以完成更新 时,回到终端模拟器 依次键入 下面的命令:
- 如果当前在
A槽位,重启后会处于B槽位:
su
blockdev --setrw /dev/block/by-name/boot_b
dd if=/dev/block/by-name/boot_b of=/sdcard/next_version_boot.img
dd if=/sdcard/ksu.img of=/dev/block/by-name/boot_b
blockdev --setro /dev/block/by-name/boot_b- 如果当前在
B槽位,重启后会处于A槽位:
su
blockdev --setrw /dev/block/by-name/boot_a
dd if=/dev/block/by-name/boot_a of=/sdcard/next_version_boot.img
dd if=/sdcard/ksu.img of=/dev/block/by-name/boot_a
blockdev --setro /dev/block/by-name/boot_aStep 6:
重启设备,完成系统更新。现在应当仍旧拥有 Root 权限。
LKM 模式
一个时代结束了...
1.5.04.445 修复了免解锁漏洞,如果可能,请解锁刷机。
不推荐保 Root 更新
操作更加复杂且签名步骤容易出错。推荐系统更新时使用 9008 还原原厂镜像,更新后重新提取当前系统的 init_boot 和 vbmeta 签名后刷入以重新获取 Root 权限。
关闭所有模块并重启。
放置当前版本的原厂镜像到内置存储的根目录,
init_boot镜像命名为original_init_boot.img,vbmeta镜像命名为original_vbmeta.img。还原当前版本系统的原厂镜像到目前活动的插槽,包括
init_boot和vbmeta:先查看当前插槽:
su -c getprop ro.boot.slot_suffix。_a::A 插槽;_b:B 插槽。刷写镜像:
shell# 当前为 A 插槽 su dd if=/sdcard/original_init_boot.img of=/dev/block/by-name/init_boot_a dd if=/sdcard/original_vbmeta.img of=/dev/block/by-name/vbmeta_a exitshell# 当前为 B 插槽 su dd if=/sdcard/original_init_boot.img of=/dev/block/by-name/init_boot_b dd if=/sdcard/original_vbmeta.img of=/dev/block/by-name/vbmeta_b exit
进行系统更新。
完成系统更新后使用 Termux 版 / MT 版一键签名工具提取新系统的
init_boot和vbmeta镜像并备份。shell# 当前为 A 插槽,重启后为 B 插槽 su dd if=/dev/block/by-name/init_boot_a of=/sdcard/next_version_init_boot.img dd if=/dev/block/by-name/vbmeta_a of=/sdcard/next_version_vbmeta.img exitshell# 当前为 B 插槽,重启后为 A 插槽 su dd if=/dev/block/by-name/init_boot_b of=/sdcard/next_version_init_boot.img dd if=/dev/block/by-name/vbmeta_b of=/sdcard/next_version_vbmeta.img exit复制一份上述两个镜像到签名工具的目录,使用工具的
非链式.sh签名上面提取的两个镜像;IMPORTANT
始终确保自己留有镜像的一份备份,否则将无法接受增量更新。
工具需要 Python 3 环境。且由于 Android 严格的权限管理,工具很可能因为各种原因找不到 Python 而报错。
如果无法运行,请考虑使用 Root 权限。
对于终端模拟器用户,
cd到/data/media/0后找到工具目录输入./非链式.sh。对于 GUI 用户,使用文件管理器访问
/data/media/0后找到工具目录,运行非链式.sh。将签好名的镜像命名为
signed_init_boot.img和signed_vbmeta.img放置到内置存储的根目录。刷入镜像到更新后的活动插槽:
shell# 当前为 A 插槽,重启后为 B 插槽 su blockdev --setrw /dev/block/by-name/init_boot_b blockdev --setrw /dev/block/by-name/vbmeta_b dd if=/sdcard/signed_init_boot.img of=/dev/block/by-name/init_boot_b dd if=/sdcard/signed_vbmeta.img of=/dev/block/by-name/vbmeta_b blockdev --setro /dev/block/by-name/init_boot_b blockdev --setro /dev/block/by-name/vbmeta_b exitshell# 当前为 B 插槽,重启后为 A 插槽 su blockdev --setrw /dev/block/by-name/init_boot_a blockdev --setrw /dev/block/by-name/vbmeta_a dd if=/sdcard/signed_init_boot.img of=/dev/block/by-name/init_boot_a dd if=/sdcard/signed_vbmeta.img of=/dev/block/by-name/vbmeta_a blockdev --setro /dev/block/by-name/init_boot_a blockdev --setro /dev/block/by-name/vbmeta_a exit重启设备完成系统更新。