A/B system OTA

与传统OTA方式相比,A/B系统的变化主要有:

  • 系统的分区设置
    传统方式只有一套分区
    A/B系统有两套分区,称为slot A和slot B
  • 跟bootloader沟通的方式
    传统方式bootloader通过读取misc分区信息来决定是进入Android主系统还是Recovery系统
    A/B系统的bootloader通过特定的分区信息来决定从slot A还是slot B启动
  • 系统的编译过程
    传统方式在编译时会生成boot.img和recovery.img分别用于Android主系统和Recovery系统的ramdisk
    A/B系统只有boot.img,而不再生成单独的recovery.img
  • OTA更新包的生成方式
    A/B系统生成OTA包的工具和命令跟传统方式一样,但是生成内容的格式不一样了

传统分区和A/B系统分区的比较:

在这里插入图片描述

A/B系统分区属性

对于A/B系统的slot A和slot B分区,其都存在以下三个属性:

属性 名称 功能
active 系统的活动分区标识 这是一个排他属性,系统只能有一个分区设置为active属性,启动时bootloader选取设置为active的分区进行启动
bootable 分区可启动标识 表明该分区包含了一个完整的可以启动的系统
successful 分区成功运行标识 表明该分区在上一次启动或当前启动中可以正确运行

A/B系统典型场景

典型的应用场景有以下4个(假定当前从B分区启动):
在这里插入图片描述
图中:

当前运行的系统(current)用绿色方框表示,当前没有用的系统(unused)用灰色方框表示。
属性标识为红色,表示该状态下相应属性被设置,标识为灰色标识该状态下属性没有设置或设置为相反属性,如:

”active” 表示已经设置active属性,当前为活动分区;”active” 表示没有设置active属性
“bootable” 表示已经设置bootable属性;”bootable” 表示设置为unbootable或没有设置bootable属性
“successful” 表示已经设置successful属性,”successful” 表示没有设置successful属性

每个场景详细说明如下:

  • 普通场景(Normal cases)

最常见的情形,例如设备出厂时,A分区和B分区都可以成功启动并正确运行,所以两个分区都设置为bootable和successful,但由于是从B分区启动,所以只有B分区设置为active。

  • 升级中(Update in progress)

B分区检测到升级数据,在A分区进行升级,此时将A分区标识为unbootable,另外清除successful标识;B分区仍然为active,bootable和successful。

  • 更新完成,等待重启(Update applied, reboot pending)

B分区将A分区成功更新后,将A分区标识为bootable。另外,由于重启后需要从A分区启动,所以也需要将A分区设置为active,但是由于还没有验证过A分区是否能成功运行,所以不设置successful;B分区的状态变为bootable和successful,但没有active。

  • 从新系统成功启动(System rebooted into new update)

设备重启后,bootloader检测到A分区为active,所以加载A分区系统。进入A系统后如果能正确运行,需要将A分区标识为successful。对比第1个普通场景,A和B系统都设置为bootable和successful,但active从B分区切换到A分区。至此,B分区成功更新并切换到A分区,设备重新进入普通场景。

A/B系统相关的Makefile变量

这些变量主要有三类:

  • A/B系统必须定义的变量
AB_OTA_UPDATER := true
AB_OTA_PARTITIONS := boot system vendor
BOARD_BUILD_SYSTEM_ROOT_IMAGE := true
TARGET_NO_RECOVERY := true
BOARD_USES_RECOVERY_AS_BOOT := true
PRODUCT_PACKAGES += update_engine update_verifier
  • A/B系统可选定义的变量
PRODUCT_PACKAGES_DEBUG += update_engine_client
  • A/B系统不能定义的变量
BOARD_RECOVERYIMAGE_PARTITION_SIZE
BOARD_CACHEIMAGE_PARTITION_SIZE
BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE

以下详细说明这些变量。

扫描二维码关注公众号,回复: 12350908 查看本文章
1.必须定义的变量

AB_OTA_UPDATER := true

A/B系统的主要开关变量,设置后:

recovery系统内不再具有操作cache分区的功能,bootable\recovery\device.cpp;
recovery系统使用不同的方式来解析升级文件,bootable\recovery\install.cpp

生成A/B系统相关的META文件

AB_OTA_PARTITIONS := boot system vendor

将A/B系统可升级的分区写入文件$(zip_root)/META/ab_partitions.txt

BOARD_BUILD_SYSTEM_ROOT_IMAGE := true

将boot ramdisk放到system分区内

TARGET_NO_RECOVERY := true

不再生成recovery.img镜像

BOARD_USES_RECOVERY_AS_BOOT := true

将recovery ramdisk放到boot.img文件内

PRODUCT_PACKAGES += update_engine update_verifier

编译update_engine和update_verifier模块,并安装相应的应用

2.可选的变量

PRODUCT_PACKAGES_DEBUG += update_engine_client

系统自带了一个update_engine_client应用,可以根据需要选择是否编译并安装

3.不能定义的变量

BOARD_RECOVERYIMAGE_PARTITION_SIZE

系统没有recovery分区,不需要设置recovery分区的SIZE

BOARD_CACHEIMAGE_PARTITION_SIZE

系统没有cache分区,不需要设置cache分区的SIZE

BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE

系统没有cache分区,不需要设置cache分区的TYPE

猜你喜欢

转载自blog.csdn.net/weixin_44991625/article/details/105736896
OTA
今日推荐