恢復圖像

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