2. Android系统升级基础

Android系统升级并不是简单地把一个新镜像“拷贝进去”再重启,而是一套围绕升级包分发、校验、写入、切换与回滚构建的工程体系。理解OTA、A/B无缝升级、Recovery升级、增量升级与全量升级这几个基本概念,是后续学习升级失败恢复、回滚策略和故障定位的前提。本节从升级路径、分区模型、包形态和适用场景四个角度建立整体认知。

一、核心概念:OTA是通道,升级方式是策略

OTA(Over-The-Air)指通过无线网络下发系统升级包并完成安装的机制。它描述的是“升级包如何到达设备”,而不是“升级包如何写入设备”。真正决定升级行为的是设备采用的分区与启动模型:

  • Recovery升级:设备重启进入独立的Recovery分区,由Recovery程序解压并写入system、vendor、boot等分区,完成后重启进入新系统。传统A-only设备多采用此方式。
  • A/B无缝升级:设备存在两套完整分区槽位(slot A与slot B)。当前运行A槽时,升级包写入B槽;写入完成后仅需一次重启切换到B槽,用户几乎无感知。
  • 全量升级:升级包包含目标版本所有分区的完整镜像,不依赖设备当前版本,兼容性最好但体积最大。
  • 增量升级:升级包只包含“从旧版本到新版本”的差异数据,体积小、下载快,但必须严格匹配源版本与目标版本。
OTA是“传输与触发方式”,Recovery与A/B是“安装与切换方式”,全量与增量是“包内容形态”。三者是正交维度,可以组合,例如“A/B + 增量OTA”或“Recovery + 全量OTA”。

二、两条升级路径的流程对比

Recovery升级与A/B无缝升级在流程上的差异,直接决定了升级耗时、可用性和回滚能力。下图给出两条路径的关键阶段与状态切换关系。

Recovery 升级路径(A-only) A/B 无缝升级路径 运行中系统(slot A) 下载 OTA 包 → 校验签名与版本 重启进入 Recovery 分区 系统不可用,用户等待升级完成 擦除并写入 system / vendor / boot 写入期间断电或校验失败 → 设备可能变砖 重启进入新系统 无自动回滚,失败需依赖 Recovery 恢复 特点:单槽位、停机时间长 适合存储紧张、成本敏感设备 运行中系统(slot A) 后台下载 OTA 包 → 校验签名与版本 写入空闲槽位 slot B 系统继续运行,用户可正常使用 更新 Bootloader 槽位元数据 标记 slot B 为 active,设置重试计数 一次重启切换到 slot B 启动失败自动回退 slot A 特点:双槽位、停机时间极短 支持自动回滚,适合中高端设备

三、全量与增量:包形态与适用场景

全量包与增量包的选择,本质是下载体积、生成复杂度与失败风险之间的权衡。增量包通过二进制差分算法(如bsdiff)生成,安装时在设备端做patch合并,因此对源版本一致性要求极高。

对比维度 全量升级 增量升级
包体积 大,通常1~3GB 小,通常几十MB~几百MB
源版本依赖 无,任意版本可升级 强依赖,必须精确匹配旧版本
生成与校验 直接打包镜像,校验简单 需差分计算,校验源分区哈希
失败风险 较低 较高,源分区被改动即失败
典型场景 跨大版本、救砖、首次升级 同版本线小版本迭代、灰度推送

四、典型场景与工程案例

某中端机型从Android 12升级到Android 13,采用A/B + 增量OTA方案。升级包约180MB,后台下载完成后写入slot B,用户点击“立即重启”后约20秒进入新系统。若新系统连续启动失败3次,Bootloader会将active槽位切回slot A,用户回到旧版本并收到升级失败提示。这一机制正是后续“回滚与故障恢复”章节的核心基础。

而在一些低内存、单槽位的入门设备上,只能采用Recovery + 全量OTA。升级期间设备需重启进入Recovery,写入时间可能长达数分钟,且一旦写入中断,往往需要借助外部工具重新刷机。因此这类设备在推送策略上更保守,通常选择夜间或Wi-Fi环境下执行。

判断设备采用哪种升级方式,可查看分区表与系统属性。A/B设备通常存在slot_a、slot_b分区,并可通过getprop ro.boot.slot_suffix查看当前槽位后缀。
# 查看当前槽位与A/B支持情况
adb shell getprop ro.boot.slot_suffix
adb shell getprop ro.build.ab_update

# 查看OTA包元数据(payload_properties.txt)
adb shell cat /data/ota_package/payload_properties.txt

# Recovery升级日志关键行
[    3.214] Verifying update package...
[    3.560] Update package verification took 0.3s
[    4.102] Installing update...
[   18.775] Write 4096 blocks to system...
[   22.310] script succeeded: result was [0.0]

五、常见误区与复盘要点

  • 误区一:把OTA等同于A/B升级。OTA只是分发方式,A/B是安装模型,二者不能混为一谈。
  • 误区二:认为增量包一定更快。增量包下载快,但设备端patch合并可能耗时更长,且失败率更高。
  • 误区三:忽略槽位元数据。A/B升级失败常源于boot_control元数据未正确更新,而非镜像本身损坏。
  • 复盘要点:升级前确认源版本、分区哈希、剩余空间与电量;升级后验证槽位状态、启动计数与系统版本号。