一、OTA概述:Android系统升级的演进历史

做Android系统开发这些年,我亲眼见证了OTA升级从“原始社会”一步步走到今天。说实话,早期做系统升级那会儿,真叫一个提心吊胆。我记得2012年左右,我第一次负责一款平板的OTA升级,用户升级失败后直接变砖,那场面……嗯,至今难忘。

1.1 从刷机到OTA:升级方式的演变

早期Android设备升级,基本靠刷机。用户需要下载完整固件包,通过Recovery模式手动刷入。这种方式有几个硬伤:

  • 门槛高:普通用户根本不会操作
  • 风险大:刷到一半断电,设备就废了
  • 体验差:每次升级都要清数据,相当于恢复出厂设置

后来Google推出了OTA(Over-The-Air)升级机制。说白了,就是通过网络把升级包推送到设备上,用户点一下“立即更新”就行。我当年第一次看到OTA升级成功时,心里那个激动——终于不用教用户怎么进Recovery模式了。

核心变化:OTA升级的核心是“增量更新”。它只传输变化的部分,而不是整个系统镜像。这就像你修改了一篇文章,只需要把修改的段落发给别人,而不是整篇文章重发一遍。

1.2 OTA升级的基本概念与原理

OTA升级到底是怎么工作的?我尽量用大白话讲清楚。

Android系统通常分为几个分区:boot(内核)、system(系统)、vendor(厂商定制)、data(用户数据)等。OTA升级包本质上是一个差分文件,它记录了从旧版本到新版本的所有二进制差异。

升级流程大致是这样的:

  1. 生成差分包:在服务器端,用旧版本镜像和新版本镜像做对比,生成一个patch文件
  2. 下载升级包:设备通过网络下载这个patch文件
  3. 校验签名:验证升级包的完整性,防止被篡改
  4. 应用补丁:在Recovery模式下,把patch应用到当前系统分区上
  5. 重启生效:应用成功后,重启进入新系统

我个人的经验:差分包的大小通常只有完整镜像的10%-30%。但要注意,如果用户跳版本太多(比如从Android 9直接升到11),差分包反而可能比完整包还大。这时候我建议直接推送完整包。

这里有个关键点——升级包是经过签名的。Android系统在应用升级包之前,会校验签名是否合法。我曾经遇到过客户自己签名的升级包刷不进设备,折腾了两天才发现是签名证书不匹配。嗯,这个坑你们别踩。

1.3 A/B系统与Non-A/B系统对比

说到A/B系统,我得先讲一个血泪史。早期Non-A/B系统升级时,用户最怕什么?升级失败变砖。我有个朋友,手机升级到一半没电了,直接黑屏,最后只能返厂维修。

A/B系统(也叫无缝升级)就是为了解决这个问题而生的。它把系统分区做成两套:A槽和B槽。平时运行在A槽,升级时把新系统写到B槽,下次重启直接切到B槽运行。

来,我画个图帮你理解:

Non-A/B 系统(传统方式) 当前系统 (A) 下载升级包 覆盖写入 (A) 重启生效 ⚠ 升级失败 = 设备变砖 A/B 系统(无缝升级) 当前系统 (A槽) 后台下载升级包 写入B槽 (不干扰A) 重启切到B槽 ✅ 升级失败自动回滚到A槽,设备永远可用 Non-A/B: 升级时设备不可用,失败变砖 A/B: 升级时设备正常使用,失败自动回滚

你看,A/B系统的核心优势就是“安全”。升级过程中,当前系统还在正常运行,用户该干嘛干嘛。就算写入B槽时断电了,重启后还是从A槽启动,设备完全不受影响。

下面这个表格,我把两者的关键差异列出来:

对比维度 Non-A/B 系统 A/B 系统
升级方式 覆盖当前系统分区 写入备用分区,下次切换
升级期间可用性 设备不可用(需进入Recovery) 设备正常使用
失败恢复 变砖,需刷机救砖 自动回滚到旧系统
存储空间占用 一套系统分区 两套系统分区(多占约1-2GB)
升级包大小 可做增量包,较小 通常为完整包,较大
实现复杂度 简单,成熟 复杂,需bootloader支持

注意:A/B系统虽然好,但不是所有设备都适合。低端设备存储空间本来就紧张,再分一套分区出来,用户能用的空间就更少了。我建议存储空间低于16GB的设备,还是用Non-A/B方案更实际。

1.4 我的一些体会

做了这么多年OTA,我最大的感受是:升级这件事,安全第一。你想想看,用户把设备交给你升级,结果升完变砖了,这信任感瞬间就没了。

A/B系统确实解决了“升级失败变砖”这个痛点,但它也不是银弹。比如,A/B系统要求bootloader支持槽位切换,这需要芯片厂商配合。我记得有个项目,芯片厂商的bootloader有bug,导致切换槽位时概率性失败,排查了整整一周才找到根因。

另外,A/B系统的升级包通常是完整包,因为增量包在A/B系统上实现起来更复杂。这就意味着用户每次升级都要下载1-2GB的数据。对于流量敏感的用户来说,体验并不好。

总结一下:Non-A/B系统适合低端设备、存储空间紧张的场景;A/B系统适合中高端设备、对用户体验要求高的场景。选哪个方案,取决于你的产品定位和目标用户。

好了,这一章就讲到这里。OTA升级的基本概念和原理,说白了就是“怎么安全地把新系统送到用户设备上”。下一章我们会深入代码层面,看看OTA升级包到底是怎么生成的。


公众号:蓝海资料掘金营,微信deep3321