在非 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
中。