2、AB分区布局详解:系统分区(A/B)、数据分区、缓存分区、misc分区、bootloader分区

上一章我们聊了AB系统的整体思路,说白了就是「双份保险」。但保险箱里到底放了哪些东西?每个分区又扮演什么角色?这章我带你逐个拆解。

先看一张整体布局图,心里有个全局印象。

AB分区布局总览 AB分区布局总览 存储设备(eMMC / UFS) 系统分区 A (system_a) 内核 + 系统镜像 + vendor 系统分区 B (system_b) 内核 + 系统镜像 + vendor 切换 数据分区 (userdata) 用户数据、应用、设置(A/B 共享) 缓存分区 (cache) OTA 临时文件 / 日志 misc 分区 启动控制 / 恢复模式标记 bootloader 分区 (bootloader / aboot) 引导加载程序(A/B 共用或独立) 关键特点 • 系统分区双份,数据分区共享 • 缓存分区可大可小 • misc 分区是「指挥中心」 • bootloader 是「守门员」

2.1 系统分区(A/B)—— 双保险的核心

系统分区是AB机制的主角。它包含操作系统内核、系统镜像、vendor分区(硬件驱动相关)等。A和B两套完全独立,大小通常一致。

分区命名规则:常见的有 system_a / system_b,或者 system / system_other。不同厂商略有差异,但本质一样。

我的经验:在项目中,我见过有人把A和B分区大小设成不一样,结果升级时空间不够。我建议你始终让A和B分区大小完全一致,省得后面踩坑。

关键点:

  • 当前运行的槽位叫 active slot,另一个叫 inactive slot。
  • 升级时只写 inactive slot,不影响当前系统。
  • 重启后如果新系统起不来,自动回滚到 active slot。

2.2 数据分区(userdata)—— 用户的家

数据分区存放用户数据:应用、照片、设置、账号信息等。它由A和B共享,不会因为切换槽位而丢失。

为什么数据分区不搞双份?因为没必要。用户数据是持续增长的,双份会浪费大量存储空间。而且数据分区的内容与系统版本无关,升级后直接复用。

注意:虽然数据分区共享,但升级后如果系统版本差异太大(比如Android 12升到Android 14),数据格式可能不兼容。我曾经遇到过升级后应用闪退,就是因为数据库schema变了。所以OTA前一定要做兼容性检查。

2.3 缓存分区(cache)—— 临时工

缓存分区在AB系统中地位比较微妙。传统非AB系统里,缓存分区用来存放OTA升级包、恢复模式日志等。但在AB系统中,OTA包通常直接下载到数据分区或缓存分区,然后由update_engine处理。

缓存分区的作用:

  • 存放OTA下载的临时文件(如果策略配置为使用cache)。
  • 恢复模式(recovery)下的日志存储。
  • 某些厂商用它做启动优化缓存。

说实话,缓存分区在AB系统中越来越「鸡肋」。很多新设备直接把它砍掉,或者只留一个很小的分区。我个人习惯是保留256MB,够用就行。

2.4 misc分区 —— 指挥中心

misc分区虽然小(通常只有几MB),但作用非常关键。它存储着系统启动的控制信息,比如:

字段 说明
bootloader_message 包含当前槽位、回滚计数、恢复模式标记等
slot_suffix 标记当前启动的是 _a 还是 _b
retry_count 当前槽位启动失败的重试次数
successful_boot 标记当前槽位是否成功启动过

你想想看,如果misc分区损坏了,系统就不知道应该从哪个槽位启动。我遇到过一台设备,misc分区被误擦除,结果每次启动都随机选槽位,用户一脸懵。修复方法是用fastboot重新写入misc分区内容。

避坑指南:我曾经在调试时用 dd 命令直接写misc分区,结果写错了偏移量,导致系统一直进恢复模式。后来我学乖了,操作misc分区前一定先备份,用 hexdump 确认内容再动手。

2.5 bootloader分区 —— 守门员

bootloader分区存放引导加载程序,它是系统启动的第一段代码。在AB系统中,bootloader负责:

  • 读取misc分区,确定启动哪个槽位。
  • 验证系统分区的签名(如果启用了verified boot)。
  • 加载内核并跳转。

bootloader在AB系统中的特殊性:

  • 有些设备bootloader本身也是A/B双份(比如 bootloader_a / bootloader_b),升级bootloader时可以回滚。
  • 更多设备bootloader只有一份,升级bootloader有风险——一旦写坏,设备变砖。

我个人强烈建议:如果硬件支持,尽量把bootloader也做成A/B双份。虽然多占一点空间,但安全性提升一个档次。

2.6 分区布局总结

下面这张表把各分区的核心属性列出来,方便你对照:

分区 是否A/B双份 典型大小 主要作用 升级时是否受影响
system 是 1~4 GB 操作系统内核、系统镜像 只写 inactive slot
userdata 否(共享) 剩余空间 用户数据、应用 不受影响
cache 否 256 MB ~ 1 GB OTA临时文件、日志 可能被清空
misc 否 2~8 MB 启动控制信息 升级时更新
bootloader 视设备而定 4~32 MB 引导加载程序 通常不升级