安卓设备 OTA 升级:A/B 分区、差分升级与回滚

设备一旦出到现场,改一个 bug 就要派人上门,成本高得离谱。OTA 不是「以后再加」的功能,而是立项时就要定的架构决策——因为它直接决定存储配置和分区表,后期改不动。
A/B 双分区与单分区:先定这个
安卓的升级方案分两大类。
A/B 双分区(无缝升级):系统有两套完整分区。升级时把新版本写入备用分区,写完后切换启动标志,重启即生效。整个下载和写入过程设备可以正常使用,只有重启那一下中断服务。更关键的是,如果新版本启动失败,引导程序会自动回退到上一个可用分区——升级失败不会变砖。代价是系统分区占用大约翻倍。
单分区(恢复模式升级):只有一个系统分区,升级时要进入恢复模式,期间设备不可用。存储占用小,但升级过程中一旦断电或者新版本有问题,回滚很困难,严重时设备直接变砖。
对工业设备、数字标牌、无人值守终端这类「现场维修成本极高」的产品,A/B 多花的那点存储成本几乎总是值得的。反过来,对成本极度敏感、且用户自己可以刷机的消费类机顶盒,单分区仍有存在空间。
差分升级还是整包升级
差分升级只传输新旧版本之间的差异,包体积可能只有整包的几分之一,对走蜂窝网络或者流量成本敏感的场景很有价值。但它有一个硬性前提:设备上的当前版本必须与差分包的基准版本完全一致。只要构建号差一点,或者用户曾经刷过第三方固件,差分就会失败。
整包升级体积大但鲁棒,不依赖当前版本状态。实践中常见的做法是两者结合:优先下发差分,失败时自动回退到整包。这样既省流量又保成功率。
回滚是怎么发生的
A/B 的回滚依赖引导程序与系统的配合:引导程序维护一个「已尝试启动次数」计数,如果新分区连续若干次都没能成功启动,就把该分区标记为不可用并切回旧分区。系统启动成功后需要主动向引导程序确认「本次启动成功」,这个确认信号是回滚机制成立的关键——没有它,引导程序无法区分「启动成功」和「启动到一半卡住」。
工程上要特别测试这个路径:故意做一个会启动失败的新版本,验证设备能不能自动回退。这是唯一能证明回滚真的有效的方法。
签名与安全启动
升级包必须签名,设备侧校验签名后才允许安装,防止被替换成恶意固件。配合安全启动链,可以保证设备只运行签过名的镜像。对于出口产品,这不仅是安全要求,也越来越多地成为渠道和客户的合规期望。
签名体系要在项目早期就规划:密钥怎么生成、怎么保管、怎么轮换。等到量产前才做,往往会因为密钥管理没到位而卡住。
几个实操要点
第一是存储预算。A/B 会让系统分区占用接近翻倍,在存储容量本来就紧的方案上要提前算好。第二是分批灰度。不要一次推给全部设备,先推一小批观察,确认没问题再扩大范围。第三是升级中断电。A/B 方案下断电只是重试,单分区方案下断电可能变砖——这也是前面提到的掉电保护与 OTA 必须一起设计的原因。第四是版本回传。设备要上报当前版本,服务端才能知道升级覆盖率,否则推完了也不知道成没成。
X88 PRO 14 机顶盒、HS89 PRO 15 机顶盒 都是安卓 14 平台,05A IPA-RK3588 工业控制主板 面向工业场景。做整机项目时,建议在选型阶段就向供应商确认四件事:BSP 是否支持 A/B 分区、是否启用了安全启动、有没有现成的差分包生成工具、升级失败时的恢复路径是什么。
结论
OTA 方案的设计顺序是:先按现场维护成本决定 A/B 还是单分区,再确定差分加整包回退的组合策略,然后规划签名与密钥管理,最后一定要实测一次「故意失败并自动回滚」的完整路径。这四件事都在立项阶段定,后期改动代价极大。


