在非 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/B | 不 | 2、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 更新使用两组分区(包括
boot
和dtbo
)并在更新期间在它们之间切换,从而无需恢复映像。如果需要,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_DTBO
、 BOARD_MKBOOTIMG_ARGS
和BOARD_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_ACPIO
、 BOARD_MKBOOTIMG_ARGS
和BOARD_RECOVERY_ACPIO
变量设置正确,Android 构建系统会将BOARD_RECOVERY_ACPIO
变量指定的 ACPIO 包含在recovery.img
中。