一、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升级包本质上是一个差分文件,它记录了从旧版本到新版本的所有二进制差异。
升级流程大致是这样的:
- 生成差分包:在服务器端,用旧版本镜像和新版本镜像做对比,生成一个patch文件
- 下载升级包:设备通过网络下载这个patch文件
- 校验签名:验证升级包的完整性,防止被篡改
- 应用补丁:在Recovery模式下,把patch应用到当前系统分区上
- 重启生效:应用成功后,重启进入新系统
我个人的经验:差分包的大小通常只有完整镜像的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槽运行。
来,我画个图帮你理解:
你看,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升级包到底是怎么生成的。