在非 A/B 设备的恢复映像中添加 DTBO

为防止非 A/B 设备上出现 OTA 失败的情况,恢复分区必须“自给自足”,不得依赖于其他分区。

启动到恢复模式时,引导加载程序必须加载与恢复映像兼容的 DTBO 映像。在执行 OTA 期间,如果在 DTBO 映像更新后(但在完成全部更新之前)出现问题,设备将尝试启动到恢复模式,以完成 OTA。不过,由于 DTBO 分区已更新,恢复映像(尚未更新)可能会出现不匹配的情况。

为防止出现这种情况,在 Android 9 中,恢复映像也必须包含来自 DTBO 映像的信息。非 A/B 设备的恢复映像还必须包含附加到内核的设备 DTB,以便在更新期间不依赖于 DTB 分区。

启动映像更改

要允许恢复映像包含恢复 DTBO,Android 9 中启动映像的格式应如下所示:

启动标头(1 页)
内核(l 页)
Ramdisk(m 页)
第二阶段(n 页)
恢复 DTBO(o 页)

此外,用于创建启动映像的 mkbootimg 工具包含下列新参数:

参数 说明
header_version 设置启动映像标头版本。标头版本高于或等于 1 的启动映像支持恢复 DTBO 部分。
recovery_dtbo 恢复 DTBO 映像的路径。

要详细了解对旧版启动映像标头的改动,请参阅 Android 9 中的启动映像标头版本控制

实现

虽然搭载 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 中。

验证

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