APatch 中文文档 下载 App

A/B 分区与槽位切换原理 — 为什么 OTA 刷的是另一个槽位

什么是 A/B 分区

Android 7(Nougat)引入了 A/B 分区方案,目前绝大多数现代设备都在使用。核心思路是:

当前运行 → Slot A(boot + system + vendor + ...)
          Slot B(boot + system + vendor + ...)← 空闲

OTA 更新怎么利用 A/B

当你执行系统 OTA 更新时:

  1. Android 下载增量更新包
  2. 更新包被应用到非活动槽位(比如 slot B)——完全不影响正在运行的 slot A
  3. 更新完成后,系统标记 slot B 为"下次启动使用"
  4. 重启,切换到 slot B

因为更新发生在非活动槽位,正在运行的 slot A 不会被打断——所以 OTA 更新可以在后台静默进行,更新完才重启切换。

Root 为什么会丢

APatch 的内核补丁是刷在 boot 分区上的。假设你把修补后的 boot 刷到了 slot A:

OTA 把新系统刷到 slot B 后,重启切换到 slot B——slot B 的 boot 还是原厂的,root 就丢了。

这就是为什么 OTA 保 root 的关键是"把修补好的 boot 刷到 OTA 刷的那个槽位上"。

fastboot 下看槽位

在 fastboot 模式下可以查看和切换槽位:

# 查看当前活动槽位
fastboot getvar current-slot
# 输出类似 current-slot: a

# 查看所有槽位
fastboot getvar all
# 里面会有 slot-successful:a slot-successful:b active_slot:a

# 指定活动槽位
fastboot set_active b
# 下次重启会从 slot b 启动

# 刷到特定槽位的 boot
fastboot flash boot_b patched-boot.img   # 刷到 slot b 的 boot
fastboot flash boot patched-boot.img     # 刷到当前活动槽位的 boot

非 A/B 设备

极少数老旧设备(Android 6 或更早)没有 A/B 分区——只有一套 boot/system 分区。这些设备的 OTA 会覆盖正在使用的分区,root 也会被覆盖掉,APatch 的 OTA 功能在这些设备上不适用。但这种设备现在已经很少见了。

快速记忆