非A/B系统更新,OTA实现机制的变化!

2024-03-28
来源:网络整理

OTA的全称是Over-the-Air。 这种无需刷机的在线升级称为OTA升级。 OTA升级可以借助Wifi无线网络或者手机网络完成,相当于借助空中无线网络完成升级; 项目功能中需要OTA,所以结合本文,参考下面的OTA实现机制。 可以看到,随着版本升级,OTA机制也发生了变化。 对此进行了总结如下。 非A/B系统更新

我们先看一下传统的分区结构

:设备启动后,首先进入程序。 这里,它会通过判断开机时的组合键来选择启动哪种模式(还会有一些其他的判断条件,这里不再详细描述)。 这里主要有系统、模式、方式等。

boot:包含系统和。 如果选择启动系统,则会引导并加载该分区,完成内核启动。

Misc:主要用于系统和通信,使系统能够重新启动进入系统并执行相应的操作。

:包含系统可执行程序、库、系统服务、应用程序等。内核启动后,会运行第一个用户态进程init,它会根据init.rc文件中的规则启动系统组件。 这些系统组件都在分区中。 系统组件启动后,最终会启动系统应用-桌面,系统启动完成。 init进程启动

:包含厂商私有的可执行程序、库、系统服务、应用程序等。该分区可以看作是该分区的补充。 厂家定制ROM的一些功能可以放置在这个分区中。

:用户存储空间。 一般新买的手机这个分区几乎是空的。 用户安装的应用程序和用户数据都存储在该分区中。用户通过系统文件管理器访问的手机存储()是该分区的一部分

:包含系统的总和。 如果选择启动方式,则会启动并加载该分区,启动init,然后启动程序。 此时,您可以对模式功能进行操作(主要包括OTA升级、双清等)。

:主要用于缓存系统升级OTA包等。双清是指分区和分区的清理。

升级流程

缺点 A/B 系统更新

为了解决以上两个问题,O之后,引入了一种新的分区结构,称为A/B分区。 相应地,传统的分区结构称为非A/B分区。

A/B分区结构,顾名思义,就是将系统分区分为两个槽位(slot)A和B。手机启动时,会选择槽位A或槽位B启动。 操作期间仅使用当前槽中的分区。

采用A/B分区结构,实现无缝升级。 例如,用户运行A槽位,收到OTA推送,系统会从服务器获取OTA数据,直接写入要升级的槽位。 不需要临时存储OTA包空间,因此不需要在or分区中存储OTA数据。 留出足够的空间。 当B槽系统升级完成后,用户将收到重启提示。 此时重启手机会自动切换到新版本的B槽系统。

为了判断系统(插槽)是否处于可启动状态,定义了A/B插槽的几种标识:

虚拟 A/B 的缺点

为了解决上述问题,后来增加了虚拟A/B系统更新;

动态分区

动态分区解决了每个分区映像不再需要保留空间的问题。 通过动态分区,提供程序无需担心各个分区的大小(例如 、 和 )。 相反,设备会分配一个带有可动态调整大小的子分区的分区。

动态分区是使用内核中的dm--模块实现的。 在Q上,对分区的访问被驱动程序拦截并作为对分区的某个区域的访问进行转发。 类似于建立映射关系。

比如我有一串数据“”,存储的地址是从0x0到0x5。 为了备份,我找到了从0x7到0x12的一个空间,并将数据完全复制到这个空间。 从这里,备份的缺点就很明显了。 如果数据比较大,但是变化不多或者集中在某个区域,就会占用很大的空间。 而且,比如我有1000位数据,我经常改变50位数据。 如果备份所有数据,就会浪费 950 位数据。 空间。 快照技术并不备份所有数据。 我只记录这部分数据和变化的数据(不是全部数据)最后一次写操作的时间点。 这样,我要记录的数据比我备份所有数据要少得多。 。

快照中的一种实现方法是copy-on-; 比如我要把一串数据“”(存储的地址从0x0到0x5)改成“”,并且只把D改成M,也就是我先改读取元数据(从0x3读取D) ),然后将D更改为M,然后将更改的数据写入另一个位置(快照),然后将更改的数据写入元数据(0x3)

过程

概括

参考链接

分享