恢复图像

在非 A/B 设备上,恢复映像应包含来自设备树 blob (DTB)高级配置和电源接口 (ACPI)覆盖映像的信息。当此类设备启动恢复时,引导加载程序可以加载与恢复映像兼容的覆盖映像。支持A/B(无缝)更新的设备应使用恢复作为引导,而不是单独的恢复分区(有关详细信息,请参阅实施 A/B 更新)。

将恢复 DTBO/ACPIO 作为启动/恢复映像的一部分的选项因 Android 版本而异。

发布更新方案GKI 合规性引导头版本(启动设备)引导头版本(升级设备)需要专用的恢复映像
11甲/乙,
虚拟 A/B
是的3 *不适用
甲/乙,
虚拟 A/B
2、3 0, 1, 2, 3
非 A/B是的3不适用是的
非 A/B2、3 0, 1, 2, 3是的
10(问)甲/乙不适用2 0, 1, 2
非 A/B不适用2 0, 1, 2是的
9 (P)甲/乙不适用1 0, 1
非 A/B不适用1 0, 1是的
8 (O)甲/乙不适用不适用(视为 0)不适用(视为 0)
非 A/B不适用不适用(视为 0)不适用(视为 0)是的

*运行 Android 11 或更高版本并使用通用内核映像 (GKI)的 A/B 设备必须使用主引导标头版本 3才能与供应商引导分区兼容。

关键点:

  • A/B 设备不需要指定恢复映像,因为 A/B 更新使用两组分区(包括bootdtbo )并在更新期间在它们之间切换,从而无需恢复映像。如果需要,A/B 设备仍然可以使用专用的恢复映像。

  • 搭载 Android 11 或更高版本并使用启动标头版本 3 的非 A/B 设备必须单独为恢复映像明确指定启动标头版本 2 。例如:

    BOARD_RECOVERY_MKBOOTIMG_ARGS := --header_version 2
    
  • 对于不支持设备树的体系结构,恢复映像可以包含 ACPIO 映像而不是 DTBO 映像。

关于 OTA 故障和恢复映像

为了防止非 A/B 设备上的无线 (OTA) 故障,恢复映像应该是自给自足的并且独立于其他映像。在 OTA 更新期间,如果在覆盖图像更新后(但在完成完整更新之前)出现问题,设备会尝试启动进入恢复模式以完成 OTA 更新。但是,由于覆盖分区已更新,因此恢复映像(尚未更新)可能会出现不匹配。

为防止在更新期间恢复依赖于 DTBO/ACPIO 分区,运行 Android 9 或更高版本的非 A/B 设备可以将包含来自覆盖图像的信息的恢复 DTBO/ACPIO 映像指定为引导映像格式中的单独部分(必须使用 1 或 2 的引导头版本)。

引导映像更改

要在运行 Android 9 或更高版本的非 A/B 设备上允许恢复映像包含恢复 DTBO 或 ACPIO,请按如下方式更新启动映像结构。

引导映像部分页数
引导标题(1 页) 1
内核(l 页) l = ( kernel_size + page_size - 1) / page_size
Ramdisk (m 页) m = ( ramdisk_size + page_size - 1) / page_size
第二阶段引导加载程序(n 页) n = ( second_size + page_size - 1) / page_size
恢复 DTBO 或 ACPIO(o 页) o = ( recovery_[dtbo|acpio]_size + page_size - 1) / page_size

有关用于指定引导映像标头版本和覆盖映像路径的mkbootimg工具参数的详细信息,请参阅引导映像标头版本控制

实施 DTBO

运行 9 或更高版本的非 A/B 设备可以填充恢复映像的recovery_dtbo部分。要将recovery_dtbo映像包含在recovery.img中,请在设备BoardConfig.mk

  • 将配置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 构建系统会在recovery.img中包含BOARD_PREBUILT_DTBOIMAGE

实施 ACPIO

运行 Android 9 或更高版本的非 A/B 设备可以使用 ACPIO 覆盖图像(而不是 DTBO 图像),并且可以填充恢复图像的recovery_acpio部分(而不是recovery_dtbo部分)。要在recovery.img中包含recovery_acpio映像,请在设备BoardConfig.mk

  • 将配置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中。