为了防止非 A/B 设备上出现无线下载 (OTA) 失败的情况,恢复分区必须“自给自足”,不得依赖于其他分区。设备制造商可以使用设备树或高级配置与电源接口 (ACPI) 描述所有无法检测到的设备。
启动到恢复模式时,引导加载程序必须加载与恢复映像兼容的设备树 Blob 叠加层 (DTBO) 或高级配置与电源接口叠加层 (ACPIO) 映像(叠加层映像)。在 OTA 更新期间,如果在叠加层映像更新后(但在完成全部更新之前)出现问题,则设备会尝试启动到恢复模式,以完成 OTA 更新。不过,由于叠加层分区已更新,恢复映像(尚未更新)可能会出现不匹配的情况。
为防止出现这种情况,在 Android 9 及更高版本中,恢复映像也必须包含来自叠加层映像的信息。非 A/B 设备的恢复映像还必须包含附加到内核的设备叠加层 Blob,以便在更新期间不依赖于叠加层分区。
Android 10 及更高版本支持使用 ACPI(而非 DTBO)的架构。
启动映像更改
要允许恢复映像包含恢复 DTBO 或 ACPIO,Android 9 及更高版本中启动映像的格式应如下所示:
启动头文件(1 页) |
内核(l 页) |
Ramdisk(m 页) |
第二阶段(n 页) |
恢复 DTBO(o 页) |
此外,用于创建启动映像的 mkbootimg
工具包含下列参数,以支持这些叠加层。
参数 | 说明 |
---|---|
header_version
|
设置启动映像头文件版本。头文件版本高于或等于 1 的启动映像支持恢复 DTBO 部分。 |
recovery_dtbo
|
恢复 DTBO 映像的路径。 |
recovery_acpio
|
恢复 ACPIO 映像的路径。 |
如需详细了解对旧版启动映像头文件的改动,请参阅启动映像头文件版本编号。
DTBO 实现
虽然搭载 Android 9 及更高版本的所有设备都必须使用新的启动映像头文件(版本 1),但只有非 A/B 设备才必须填充恢复映像的 recovery_dtbo
部分。要在 BoardConfig.mk
设备的 recovery.img
中添加 recovery_dtbo
映像,请执行以下操作:
- 将
BOARD_INCLUDE_RECOVERY_DTBO
配置设置为true
:BOARD_INCLUDE_RECOVERY_DTBO := true
- 扩展
BOARD_MKBOOTIMG_ARGS
变量以指定启动映像头文件版本:BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
- 确保将
BOARD_PREBUILT_DTBOIMAGE
变量设置为 DTBO 映像的路径。Android 编译系统使用该变量在创建恢复映像期间设置mkbootimg
工具的recovery_dtbo
参数。
- 如果变量
BOARD_INCLUDE_RECOVERY_DTBO
、BOARD_MKBOOTIMG_ARGS
和BOARD_PREBUILT_DTBOIMAGE
均正确设置,Android 编译系统会将变量BOARD_PREBUILT_DTBOIMAGE
指定的 DTBO 添加到recovery.img
中。
ACPIO 实现
虽然搭载 Android 10 及更高版本的所有设备都必须使用新的启动映像头文件(版本 1),但只有非 A/B 设备才必须填充恢复映像的 recovery_acpio
部分。要在 BoardConfig.mk
设备的 recovery.img
中添加 recovery_acpio
映像,请执行以下操作:
- 将
BOARD_INCLUDE_RECOVERY_ACPIO
配置设置为true
:BOARD_INCLUDE_RECOVERY_ACPIO := true
- 扩展
BOARD_MKBOOTIMG_ARGS
变量以指定启动映像头文件版本。变量必须大于或等于 1,才能支持恢复 ACPIO。BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
- 确保将
BOARD_RECOVERY_ACPIO
变量设置为 ACPIO 映像的路径。Android 编译系统使用该变量在创建恢复映像期间设置mkbootimg
工具的recovery_acpio
参数。
- 如果变量
BOARD_INCLUDE_RECOVERY_ACPIO
、BOARD_MKBOOTIMG_ARGS
和BOARD_RECOVERY_ACPIO
均正确设置,Android 编译系统会将变量BOARD_RECOVERY_ACPIO
指定的 ACPIO 添加到recovery.img
中。
验证
对于搭载 Android 9 及更高版本的所有设备,供应商测试套件 (VTS) 会检查启动/恢复映像的格式,以确保启动映像头文件使用版本 1。