復原映像檔

在非 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/B 版本 不可以 2、3 0、1、2、3
10 (Q) A 到 B 罩杯 2 0、1、2 不可以
非 A/B 2 0、1、2
9 (P) A/B 1 0、1 不可以
非 A/B 1 0、1
8 (O) A/B 不適用 (視為 0) 不適用 (視為 0) 不可以
非 A/B 不適用 (視為 0) 不適用 (視為 0)

* 如果 A/B 裝置搭載 Android 11 以上版本,並使用通用核心映像檔 (GKI),則必須使用主要 3 版的啟動序列標頭,才能與供應商啟動區相容。

重點:

  • A/B 裝置不需要指定復原映像檔,因為 A/B 更新會使用兩組更新 部分分區 (包括 bootdtbo) 並在維護期間切換 移除需要還原映像檔的需求A/B 裝置 仍會使用專屬的復原映像檔

  • 搭載 Android 11 以上版本的非 A/B 裝置 並使用 3 的開機標頭版本明確指定 boot 標頭 版本 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
Recovery DTBO 或 ACPIO (o 頁面) o = (recovery_[dtbo|acpio]_size + page_size - 1) / page_size

進一步瞭解用於指定開機映像檔的 mkbootimg 工具引數 標頭版本和重疊圖片路徑,請參閱啟動映像檔標頭 版本管理

實作 DTBO

搭載 Android 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.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 建構系統就會納入 recovery.imgBOARD_RECOVERY_ACPIO 變數指定的 ACPIO。