非 A/B 设备的恢复映像

为了防止非 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_DTBOBOARD_MKBOOTIMG_ARGSBOARD_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_ACPIOBOARD_MKBOOTIMG_ARGSBOARD_RECOVERY_ACPIO 均正确设置,Android 编译系统会将变量 BOARD_RECOVERY_ACPIO 指定的 ACPIO 添加到 recovery.img 中。

验证

对于搭载 Android 9 及更高版本的所有设备,供应商测试套件 (VTS) 会检查启动/恢复映像的格式,以确保启动映像头文件使用版本 1。