恢復圖像

在非 A/B 裝置上,恢復映像應包含來自裝置樹 blob (DTB)進階配置和電源介面 (ACPI)覆蓋映像的資訊。當此類裝置啟動進入復原模式時,引導程式可以載入與復原映像相容的覆蓋映像。支援A/B(無縫)更新的設備應使用恢復作為引導,而不是單獨的恢復分區(有關詳細信息,請參閱實施 A/B 更新)。

將恢復 DTBO/ACPIO 作為啟動/恢復映像的一部分包含的選項因 Android 版本而異。

發布更新方案GKI 合規性啟動標頭版本(啟動設備)啟動頭版本(升級設備)需要專用恢復映像
11 A/B,
虛擬A/B
是的3 *不適用
A/B,
虛擬A/B
2, 3 0, 1, 2, 3
非A/B是的3不適用是的
非A/B2, 3 0, 1, 2, 3是的
10(問) A/B不適用2 0, 1, 2
非A/B不適用2 0, 1, 2是的
9(頁) A/B不適用1 0, 1
非A/B不適用1 0, 1是的
8(奧) 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_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變數指定的 DTBO。

實施 ACPIO

運行 Android 9 或更高版本的非 A/B 裝置可以使用 ACPIO 覆蓋映像(而不是 DTBO 映像),並且可以填入恢復映像的recovery_acpio部分(而不是recovery_dtbo部分)。若要將recovery_acpio映像包含在recovery.img中,請在裝置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 建置系統將包含由recovery.img中的BOARD_RECOVERY_ACPIO變數指定的 ACPIO。