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