A/B 分区与槽位切换原理 — 为什么 OTA 刷的是另一个槽位
什么是 A/B 分区
Android 7(Nougat)引入了 A/B 分区方案,目前绝大多数现代设备都在使用。核心思路是:
- 设备有两套完全独立的分区组,叫 slot A 和 slot B
- 每套分区组里包含 boot、system、vendor、product 等所有分区
- 同一时刻只有一个 slot 在运行(活动槽位),另一个是空闲的(非活动槽位)
当前运行 → Slot A(boot + system + vendor + ...)
Slot B(boot + system + vendor + ...)← 空闲
OTA 更新怎么利用 A/B
当你执行系统 OTA 更新时:
- Android 下载增量更新包
- 更新包被应用到非活动槽位(比如 slot B)——完全不影响正在运行的 slot A
- 更新完成后,系统标记 slot B 为"下次启动使用"
- 重启,切换到 slot B
因为更新发生在非活动槽位,正在运行的 slot A 不会被打断——所以 OTA 更新可以在后台静默进行,更新完才重启切换。
Root 为什么会丢
APatch 的内核补丁是刷在 boot 分区上的。假设你把修补后的 boot 刷到了 slot A:
- Slot A 的 boot → 有 KernelPatch → root 正常
- Slot B 的 boot → 原厂,没修补 → 没 root
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 功能在这些设备上不适用。但这种设备现在已经很少见了。
快速记忆
- 当前运行哪个槽位的 boot → root 在哪个槽位
- OTA 刷到哪个槽位 → 就要把修补 boot 刷到哪个槽位
- 切换槽位前 → 确认两个槽位的 boot 都刷好了修补产物