Android OTA升级机制详解:从传统到现代的演进之路
Android OTA升级机制详解:从传统到现代的演进之路
OTA(Over-the-Air Technology)升级是一种无需刷机的在线升级方式,可以通过Wi-Fi或移动网络完成系统更新。随着Android系统的不断发展,OTA升级机制也在不断演进,从传统的非A/B系统更新到A/B系统更新,再到虚拟A/B和动态分区技术,为用户带来了更加便捷和安全的升级体验。本文将详细介绍Android系统的OTA升级机制,帮助读者更好地理解这一重要技术。
非A/B系统更新
在传统的Android系统中,分区结构主要包括以下几个部分:
- bootloader:设备启动后,会先进入bootloader程序,通过判断开机时的按键组合选择启动模式,包括Android系统、recovery模式、fastboot模式等。
- boot:包含Android系统的kernel和ramdisk,负责内核启动。
- misc:用于Android系统和bootloader通信,使Android系统能够重启进入recovery系统并执行相应操作。
- system:包含Android系统的可执行程序、库、系统服务和app等,是系统组件的主要存储位置。
- vendor:包含厂商私有的可执行程序、库、系统服务和app等,可以看作是system分区的补充。
- userdata:用户存储空间,用于存放用户安装的app和数据。
- recovery:包含recovery系统的kernel和ramdisk,用于执行OTA升级、双清等操作。
- cache:主要用于缓存系统升级OTA包等。
升级过程
- Android系统收到服务端下发的OTA推送,将OTA包下载至cache分区。
- OTA包下载完成后,向misc分区写入指令,表明下次启动时进入recovery模式并使用该OTA包进行升级。
- 重启手机。
- bootloader读取misc分区的内容并解析,引导启动recovery系统。
- recovery读取cache分区中的OTA包,按照升级脚本对系统各个分区进行升级。
- 清除misc分区。
- 重启手机,进入OTA升级后的新版本系统。
缺点
- 升级下载的OTA包占用cache分区空间
- 升级失败无法恢复回旧系统
A/B系统更新
为了解决传统OTA升级的缺点,Android O引入了A/B分区结构。这种结构将系统分区分成了A和B两个槽(slot),手机启动时会选择A槽或B槽启动,运行过程中仅使用当前槽位的分区。
采用A/B分区结构,能够实现无缝升级。例如用户正在运行A槽,此时收到OTA推送,则系统会一边从服务端获取OTA数据,一边直接写入待升级的槽,不需要临时存储OTA包的空间,因此不再需要在cache或userdata分区预留足够空间。当B槽系统升级完成,用户会收到重启提示,此时重启手机将自动切换到B槽的新版本系统。
bootloader通过以下标识判断系统槽的状态:
- bootable:标识该槽的系统是否可以启动。
- successful:标识该槽的系统是否成功启动过。
- active:标识该槽是否是当前运行的系统。
缺点
- 系统所需的存储空间比非A/B OTA所需的更多,因为A/B系统的分区boot. system, vendor等都作了两套分区
虚拟A/B
为了解决A/B分区存储空间的问题,Android引入了虚拟A/B系统更新。与传统的AB分区备份不同,虚拟A/B使用写时复制快照技术,动态调整分区大小,节省存储空间。
动态分区
动态分区解决了各个分区映像不再需要预留空间的问题。借助动态分区,供应商无需担心各个分区(例如system、vendor和product)的大小。取而代之的是,设备会分配一个super分区,其中的子分区可动态调整大小。动态分区是使用Linux内核中的dm-linear device-mapper模块实现的。
Snapshot
快照技术通过记录数据的修改时间点和改动的数据,而不是完整备份所有数据,从而节省存储空间。写时复制是快照技术的一种实现方式,当数据需要修改时,先读取原始数据,然后将修改后的数据写入快照设备,最后将修改后的数据写回到原始位置。
流程
- 创建system_b_base,对应映射到system_a。
- 创建system_cow(写时复制)设备。
- base和cow统一组成一个快照。
- 设备重新引导时,从快照上进行挂载,直到成功引导。从快照挂载成功后,将base和快照的内容合并,删除快照设备。
小结
Android系统的OTA升级机制经历了从传统非A/B系统更新到A/B系统更新,再到虚拟A/B和动态分区技术的演进。这些技术的引入,不仅提高了升级的便利性和安全性,还优化了存储空间的使用效率。对于Android开发者和对系统底层原理感兴趣的读者来说,理解这些技术细节有助于更好地掌握Android系统的运行机制。