恢复映像

在非 A/B 设备上,恢复映像应包含来自设备树 blob (DTB)高级配置和电源接口 (ACPI) 叠加层映像的信息。当此类设备启动进入恢复模式时,引导加载程序随后可以加载与恢复映像兼容的叠加层映像。支持 A/B(无缝)更新的设备应使用恢复即启动,而不是单独的恢复分区(如需了解详情,请参阅实施 A/B 更新)。

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

版本 更新方案 GKI 合规性 启动标头版本(启动设备) 启动标头版本(升级设备) 是否需要专用恢复映像
11 A/B,
Virtual A/B
3* 不适用
A/B,
Virtual A/B
2, 3 0, 1, 2, 3
非 A/B 3 不适用
非 A/B 2, 3 0, 1, 2, 3
10 (Q) A/B 不适用 2 0, 1, 2
非 A/B 不适用 2 0, 1, 2
9 (P) A/B 不适用 1 0, 1
非 A/B 不适用 1 0, 1
8 (O) A/B 不适用 不适用(视为 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.img 中包含 recovery_dtbo 映像,请在设备 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 构建系统会将 BOARD_PREBUILT_DTBOIMAGE 变量指定的 DTBO 包含在 recovery.img 中。

实现 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 中。