Android中的A/B分区系统是在Android 7.0(Nougat)中首次引入的,目的是为了实现无缝更新。A/B分区意味着设备上有两套可以工作的系统分区,通常称为slot A和slot B。一个分区用于当前正在运行的系统(活动分区),而另一个分区则可用于后台更新而不干扰用户的使用。
升级步骤
以下是使用A/B分区进行系统升级的大致步骤:
下载更新包:当有新的系统更新时,设备会自动在后台下载更新包。
安装到非活动分区:更新包会被安装到当前非活动的分区(例如,如果slot A是活动分区,则更新会被安装到slot B)。这个过程不会影响用户当前的操作,因为它是发生在非活动分区上。
验证更新:一旦更新完成,系统会对新安装的分区进行验证以确保没有错误。
重启到新系统:如果一切正常,下一次设备重启时,bootloader将切换到更新过的分区(在这个例子中是从slot A切换到slot B)。这通常被称为无缝更新,因为它最小化了用户等待系统更新的时间,并减少了更新失败导致设备不可用的风险。
标记旧分区为可更新:如果新的系统版本工作正常,旧的分区(原来的活动分区)将被标记为可用于未来的更新。这意味着它可以在下一次更新周期中接收更新。
清理:如果经过一段时间确认新系统稳定,旧分区的数据可能会被清理,为未来的更新腾出空间。
值得注意的是,尽管A/B分区系统提供了很多优点,但并非所有制造商都立即采用了这一机制。一些厂商可能由于硬件限制或者其他考虑而选择不启用A/B分区。然而,随着Google对Android 13的要求,更多设备开始强制支持基于虚拟A/B分区的无缝更新体验,从而进一步推广了这种更新机制。
验证
在Android设备中,当新的系统映像被安装到非活动的A/B分区(例如slot B)后,系统会进行一系列验证步骤以确保新分区可以正常工作。以下是验证过程的主要步骤:
完整性检查:在安装过程中,OTA(Over-The-Air)更新包会被解压并写入到非活动的分区。在这个阶段,通常会对每个文件进行哈希校验,以确保文件未损坏且与服务器端提供的哈希值匹配。
dm-verity 验证:Android使用了一种名为dm-verity的技术来确保系统的完整性和真实性。这是一种内核级别的特性,它通过在启动时验证每个数据块的哈希值来保证分区没有被篡改。如果发现任何不匹配的数据块,系统将拒绝加载该分区。
Slot Marking:在尝试启动新分区之前,系统会将目标槽位标记为“正在尝试”(
unbootable
或trying
)。这意味着如果启动失败,系统可以安全地回退到之前的分区(即另一个槽位),因为当前尝试启动的分区尚未被标记为成功。Bootloader Verification:引导加载程序(bootloader)会在尝试启动新分区前执行最后一次检查,确保所有必要的条件都满足,包括但不限于正确的签名和dm-verity树的有效性。
Post-boot Verification:一旦新分区成功启动,并且设备进入了操作系统,系统可能会进一步执行一些自检操作,以确认一切运行正常。如果用户正常使用一段时间而没有出现问题,系统会将新分区标记为“成功”(
successful
),这意味着它可以作为未来的默认启动槽位。Revert Mechanism:如果新分区未能成功启动,Android的A/B更新机制设计了一个回退策略,允许设备自动切换回旧分区(通常是slot A),从而避免了因更新失败导致的设备无法使用的风险。
这些步骤共同作用,确保只有经过验证的新系统映像才能真正成为设备的活跃系统,同时提供了一种机制来恢复到已知良好的状态以防万一。