一般啟動分區

在 Android 12 中,一般的 boot 映像檔,稱為 通用核心映像檔 (GKI)、 包含一般 ramdisk 和 GKI 核心。

針對搭載 Android 13 的裝置, ramdisk 會從 boot 映像檔中移除,並放置在另外的 init_boot 中 圖片。這項變更會保留 boot 圖片,只有 GKI 核心。

適用於升級仍使用 Android 12 的裝置 或更舊版本的核心版本 一般的 RAM 仍會保留在原處 不必使用新的 init_boot 映像檔。

如要建構一般 ramdisk,請將供應商專屬資源移出 ramdisk 中 讓一般 ramdisk 只包含第一階段 init 和屬性 該檔案含有時間戳記資訊。

使用以下裝置的裝置:

  • 請勿使用專屬的 recovery 分區,那麼所有復原位元都會從 一般 ramdisk 到 vendor_boot ramdisk。

  • 請使用專屬的 recovery 分區,不要變更 recovery ramdisk recovery ramdisk 本身是獨立項目,因此必須使用。

建築

下圖說明搭載 Android 的裝置架構 12 以及更高版本。 搭載 Android 13 的裝置推出全新 init_boot 映像檔,包含一般 ramdisk。 從 Android 12 升級至 Android 的裝置 13 層採用的架構和 Android 12。

推出時搭載 Android 13,無專屬救援方式

啟動/升級裝置、GKI、無專用復原程序

圖 1. 搭載 Android 13 或升級至 Android 13 的裝置未具備專屬復原機制。

啟動後搭載 Android 13,專屬和 A/B 復原功能 (專屬 ramdisk)

啟動/升級裝置、GKI、專屬和 A/B 復原程序

圖 2. 推出或升級至 Android 13 的裝置,搭載 GKI 和專屬 A/B 復原功能。

請參考此圖表,瞭解裝置是否有 recovery_arecovery_b 分區。

啟動時搭載 Android 13,專用和非 A/B 復原功能 (專屬 ramdisk)

啟動/升級裝置、GKI、專用和非 A/B 復原

圖 3. 推出或升級至 Android 13 的裝置,搭載 GKI 和非 A/B 復原功能。

如果裝置有名為 recovery 的分區,但沒有 字尾。

推出或升級至 Android 12,不需專用復原程序

啟動/升級裝置、GKI、無專用復原程序

圖 4. 搭載 Android 12 或升級至 Android 12 的裝置 (GKI 無專用復原機制)。

啟動或升級至 Android 12,專屬的 A/B 復原功能 (專屬 ramdisk)

啟動/升級裝置、GKI、專屬和 A/B 復原程序

圖 5. 搭載 Android 12 或升級至 Android 12 的裝置,搭載 GKI 和專屬 A/B 復原功能。

請參考此圖表,瞭解裝置是否有 recovery_arecovery_b 分區。

啟動或升級至 Android 12,專屬的非 A/B 復原功能 (專屬 ramdisk)

啟動/升級裝置、GKI、專用和非 A/B 復原

圖 6. 推出或升級至 Android 12 的裝置,搭載 GKI 和非 A/B 復原功能。

如果裝置有名為 recovery 的分區,但沒有 字尾。

升級至 Android 12 (復原即啟動 (recovery-as-ramdisk)

啟動/升級裝置、不使用 GKI、復原即啟動

圖 7. 升級至 Android 12、無 GKI、復原即啟動的裝置。

升級至 Android 12,專屬復原功能 (專屬 ramdisk)

啟動/升級裝置、無 GKI、專屬救援

圖 8. 升級至 Android 12 、無 GKI、專屬復原裝置。

開機映像檔內容

Android 開機映像檔包含下列內容。

  • 為搭載 Android 13 的裝置新增 init_boot 圖片

    • 標頭版本 V4
    • 一般 ramdisk 映像檔
  • 通用 boot 圖片

    • 標頭版本 V3V4
      • GKI boot.img 認證的 boot_signature (僅限 v4)。 認證的 GKI boot.img 未簽署驗證開機程序。原始設備製造商 (OEM) 使用裝置專屬的簽署 boot.img AVB 鍵。
      • 一般 cmdline (GENERIC_KERNEL_CMDLINE)
      • GKI 核心
    • 一般 ramdisk 映像檔
      • 僅包含在 Android 12 的 boot 映像檔中 以及先前版本
  • vendor_boot 映像檔 (詳情請參閱廠商啟動程序) 分區)

    • vendor_boot 個標題
      • 裝置專屬 cmdline (BOARD_KERNEL_CMDLINE)
    • vendor_boot 個 ramdisk 映像檔
      • lib/modules
      • 復原資源 (如果沒有專屬復原作業)
    • dtb的圖片
  • recovery的圖片

    • 標頭版本 V2
      • 用於復原的裝置專屬cmdline (如有需要)
      • 如為非 A/B 復原分區,標頭內容必須 獨立的內容看 復原映像檔。 例如:
      • cmdline 未串連至 bootvendor_boot cmdline
      • 標頭會視需要指定復原 DTBO。
      • 如果是 A/B 復原分區,可串連或推論內容 來自bootvendor_boot。例如:
      • cmdline 會串連為 bootvendor_boot cmdline
      • DTBO 可從 vendor_boot 標頭推斷。
    • recovery 個 ramdisk 映像檔
      • 復原資源
      • 針對非 A/B 復原分區,ramdisk 的內容必須是 獨立的內容看 復原映像檔。 例如:
      • lib/modules 必須包含啟動所需的所有核心模組 復原模式
      • 復原 ramdisk 必須包含 init
      • 如果是 A/B 復原分區,復原 ramdisk 會在 泛型和 vendor_boot ramdisk,因此可以 例如:
      • lib/modules 可能只包含 啟動復原模式 (vendor_boot ramdisk 中的核心模組除外)。
      • /init 的符號連結可能存在,但受其保護 啟動映像檔的第一階段 /init 二進位檔

一般 ramdisk 映像檔內容

一般 ramdisk 包含以下元件。

  • init
  • system/etc/ramdisk/build.prop
  • ro.PRODUCT.bootimg.* build 個道具
  • 掛接點的目錄為空白:debug_ramdisk/mnt/dev/sys/proc/metadata/
  • first_stage_ramdisk/
    • 與掛接點的空白目錄重複:debug_ramdisk/mnt/dev/sys/proc/metadata/

開機映像檔整合

建構旗標可控管 init_bootbootrecoveryvendor_boot 的方式 建構映像檔布林板變數的值必須是字串 true 或空白 (預設值)。

  • TARGET_NO_KERNEL。這個變數指出建構作業是否使用預先建構的開機程序 圖片。如果此變數設為 true,請設定 BOARD_PREBUILT_BOOTIMAGE 預先建構的開機映像檔位置 (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img)。

  • BOARD_USES_RECOVERY_AS_BOOT。這個變數可指出裝置是否使用 recovery 圖片做為 boot 圖片。使用 GKI 時,這個變數是 空白和復原資源應移至 vendor_boot

  • BOARD_USES_GENERIC_KERNEL_IMAGE。這個變數表示主機板採用 你好,這個變數不會影響 sysprops 或 PRODUCT_PACKAGES

    這是董事會層級的 GKI 開關;以下所有的變數 受此變數限制

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT。這個變數可控制 ramdisk 復原資源是以 vendor_boot 為基礎。

    • 設為 true 時,復原資源只會建構於 vendor-ramdisk/ 且不是以 recovery/root/ 為基礎。

    • 如果為空白,復原資源只會建構於 recovery/root/,不會 建立於 vendor-ramdisk/

  • BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT。這個變數可控制 GSI AVB 金鑰建構於 vendor_boot

    • 設為 true 時,如果 BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT

      • 已設定,GSI AVB 金鑰的建構基礎 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb

      • 未設定,GSI AVB 金鑰的建構條件是 $ANDROID_PRODUCT_OUT/vendor-ramdisk/avb

    • 如果 BOARD_RECOVERY_AS_ROOT 為空白:

      • 已設定,GSI AVB 金鑰的建構基礎 $ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb

      • 未設定,GSI AVB 金鑰的建構條件是 $ANDROID_PRODUCT_OUT/ramdisk/avb

  • BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE。這個變數可控制 recovery 映像檔包含或未包含核心。啟動 Android 的裝置 12 且使用 A/B recovery 分區必須設定這個值 變更為 true。搭載 Android 12 的裝置 如果使用非 A/B 版本,必須將這個變數設為 false,以保留復原映像檔 獨立作業

  • BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES。這個變數可控制 已將 $OUT/boot*.img 複製到目標檔案的 IMAGES/ 中。

    • aosp_arm64 必須將這個變數設為 true

    • 其他裝置必須將這個變數留空。

  • BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE。這個變數可控制 系統隨即會產生 init_boot.img 並設定大小。設定後,一般 ramdisk 伺服器 會新增至 init_boot.img (而不是 boot.img),而且需要 要設定 BOARD_AVB_INIT_BOOT* 個變數 鏈結 vbmeta

允許的組合

元件或變數 升級沒有復原分區的裝置 升級含有復原分區的裝置 在沒有復原分區的情況下啟動裝置 啟動具備 A/B 復原分區的裝置 使用非 A/B 復原分區啟動裝置 aosp_arm64
boot
包含「init_boot」(Android 13)
vendor_boot 選用 選用
recovery
BOARD_USES_RECOVERY_AS_BOOT true 未連接裝置 未連接裝置 未連接裝置 未連接裝置 未連接裝置
BOARD_USES_GENERIC_KERNEL_IMAGE 未連接裝置 未連接裝置 true true true true
PRODUCT_BUILD_RECOVERY_IMAGE 未連接裝置 true 或空白 未連接裝置 true 或空白 true 或空白 未連接裝置
BOARD_RECOVERYIMAGE_PARTITION_SIZE 未連接裝置 >0 分 未連接裝置 >0 分 >0 分 未連接裝置
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT 未連接裝置 未連接裝置 true 未連接裝置 未連接裝置 未連接裝置
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT 未連接裝置 未連接裝置 true true true 未連接裝置
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE 未連接裝置 未連接裝置 未連接裝置 true 未連接裝置 未連接裝置
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES 未連接裝置 未連接裝置 未連接裝置 未連接裝置 未連接裝置 true

具有專屬 recovery 分區的裝置可以設定 PRODUCT_BUILD_RECOVERY_IMAGEtrue 或空白。對於這些裝置 已設定 BOARD_RECOVERYIMAGE_PARTITION_SIZE,建構 recovery 映像檔。

為開機程序啟用鏈結 vbmeta

必須為 bootinit_boot 映像檔啟用鏈結 vbmeta。請說明 包括:

BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2

BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3

如需範例,請參閱 變更

系統即根層級

「系統式根層級」不支援使用 GKI 的裝置。啟用 此類裝置,BOARD_BUILD_SYSTEM_ROOT_IMAGE 必須空白。系統即根層級 也不適用於使用動態分區的裝置

產品設定

使用一般 ramdisk 的裝置時,必須安裝 即可安裝至 ramdisk。方法是在容器中指定以下項目: device.mk:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)

generic_ramdisk.mk 檔案也會防止其他 make 檔案意外 正在將其他檔案安裝至 ramdisk (將這類檔案移至 vendor_ramdisk) )。

設定裝置

設定操作說明會因推出 Android 的裝置而異 13,升級至 Android 12,並以 Android 12 啟動。 Android 13 的設定與 Android 12 類似

  • 升級至 Android 12 的裝置:

    • 可以保留 BOARD_USES_RECOVERY_AS_BOOT 的值。如果有的話 他們使用的是舊版設定,且新的建構變數必須留空。如果有 裝置:

      • BOARD_USES_RECOVERY_AS_BOOT 設為 true,架構即為 如圖 3 所示。

      • BOARD_USES_RECOVERY_AS_BOOT 設為空白,架構會如下所示 圖 4.

    • 可將 BOARD_USES_RECOVERY_AS_BOOT 設為空白。然後採用 新的設定如果這類裝置:

      • 請勿使用專屬的 recovery 分區,架構如圖所示 在圖 1 中,裝置設定選項為「Option」 1

      • 使用專屬的 recovery 分區,架構如圖所示 圖 2a圖 2b 以及裝置設定 選項是指選項 2a選項 2b

  • 搭載 Android 12 的裝置必須設定 BOARD_USES_RECOVERY_AS_BOOT 設為空白並使用新設定。如果有 裝置:

    • 請勿使用專屬的 recovery 分區,這個架構如圖所示 圖 1,裝置設定選項為「選項 1」

    • 使用專屬的 recovery 分區,架構如圖所示 圖 2a圖 2b 以及裝置設定 選項是指選項 2a選項 2b

因為 aosp_arm64 只會建構 GKI (而非 vendor_boot 或復原), 瀏覽體驗也不是完整的目標如要瞭解 aosp_arm64 建構設定,請參閱 generic_arm64

選項 1:沒有專用復原分區

沒有 recovery 分區的裝置會包含一般 boot 映像檔 boot 個分區。vendor_boot ramdisk 包含所有復原資源, 包括 lib/modules (含廠商核心模組)。在這些裝置上, 產品設定沿用generic_ramdisk.mk

設定 BOARD 值

設定下列值:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

vendor_boot ramdisk 包含 /init/system/bin/init 的符號連結, 和init_second_stage.recovery (/system/bin/init)。不過,由於 一般 ramdisk 連結 vendor_bootramdisk,/init 符號連結。當裝置開機的修復程序時, 需要 /system/bin/init 二進位檔才能支援第二階段初始化。內容 vendor_boot + 一般 RAM 磁碟如下:

  • /init (從 init_first_stage 建立的一般 ramdisk)
  • /system/bin/init (透過 vendor_ramdisk,建構自 init_second_stage.recovery)

移動 fstab 檔案

將安裝到一般 ramdisk 的所有 fstab 檔案移至 vendor_ramdisk。如需範例,請參閱 變更

安裝模組

您可以將裝置專屬模組安裝至「vendor_ramdisk」(略過) 。

  • 當模組安裝目標時,請使用該模組的 vendor_ramdisk 變化版本 /first_stage_ramdisk。這個模組應於 init後使用 把根切換至 /first_stage_ramdisk,但在 init 之前 /system。如需範例,請參閱「中繼資料檢查碼」和 虛擬 A/B 壓縮

  • 當模組安裝至 / 時,請使用模組的 recovery 變化版本。 這個模組應可在 init 切換至 Root 權限之前使用 /first_stage_ramdisk。如要進一步瞭解如何將模組安裝至 /,請參閱第一 階段控制台

第一階段控制台

因為第一個階段控制台是在 init 將根層級切換至 之前啟動 /first_stage_ramdisk,您需要安裝 recovery 的模組變化版本。 根據預設,兩個模組變化版本都會安裝至 build/make/target/product/base_vendor.mk,因此如果裝置 makefile 沿用 不必明確安裝 recovery 變化版本。

如要明確安裝復原模組,請使用下列指令。

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \

這能確保 linkershtoybox 能夠安裝到 $ANDROID_PRODUCT_OUT/recovery/root/system/bin,之後會安裝至 /system/binvendor_ramdisk

如要新增第一個階段主控台所需的模組 (例如 ADB),請使用 追蹤。

PRODUCT_PACKAGES += adbd.recovery

這可確保將指定的模組安裝到 $ANDROID_PRODUCT_OUT/recovery/root/system/bin,然後安裝到 /system/bin (位於 vendor_ramdisk 下)。

中繼資料核對和

支援中繼資料 核對和 進行這項操作時,不支援 GKI 的裝置就會安裝 ramdisk 包含下列模組的變化版本。如要新增 GKI 支援功能,請將模組移至 $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

如需範例,請參閱 變更清單

虛擬 A/B 壓縮

如要支援虛擬 A/B 壓縮功能,必須在以下位置安裝 snapuserdvendor_ramdisk。裝置應繼承自 virtual_ab_ota/compression.mk、 這個指令會安裝 snapuserdvendor_ramdisk 變化版本。

對啟動程序所做的變更

啟動還原程序或 Android 裝置的程序並未改變。 例外狀況:

  • RAM build.prop 會移至 /second_stage_resources,因此第二個階段 init 可以讀取啟動的建構時間戳記。

由於資源會從一般 ramdisk 移至 vendor_boot ramdisk,因此結果 將一般 ramdisk 串連至 vendor_boot ramdisk 不受影響。

提供 e2fsck

裝置 Makefile 可沿用自:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk (如果裝置支援虛擬服務專員) A/B,但未壓縮。

  • virtual_ab_ota/compression.mk (如果裝置支援虛擬 A/B) 。

安裝產品 makefile $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck。在 執行階段,第一個階段 init 會將根層級切換為 /first_stage_ramdisk,然後 執行 /system/bin/e2fsck

選項 2a:專屬和 A/B 復原分區

這個選項適用於含有 A/B recovery 分區的裝置;也就是 裝置有 recovery_arecovery_b partition。這類裝置包括 復原分區可更新的 A/B 和虛擬 A/B 裝置, 下列設定:

AB_OTA_PARTITIONS += recovery

vendor_boot ramdisk 包含 ramdisk 和供應商的供應商位元 核心模組,包括:

  • 裝置專屬的 fstab 檔案

  • lib/modules (包含供應商核心模組)

recovery ramdisk 包含所有復原資源。在這些裝置上, 產品設定沿用generic_ramdisk.mk

設定 BOARD 值

針對使用 A/B recovery 分區的裝置設定下列值:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

recovery ramdisk 包含 /init -> /system/bin/init 符號連結,且 init_second_stage.recovery/system/bin/init。不過,因為啟動程序 ramdisk 連結了 recovery ramdisk,/init 符號連結為 覆寫。裝置啟動進入復原模式時,系統會/system/bin/init 二進位檔才能支援第二階段 init

當裝置開機recovery時,recovery + vendor_boot + 一般 RAM 磁碟如下:

  • /init (從 ramdisk,透過 init_first_stage 建構)
  • /system/bin/init (從 recovery ramdisk,建構自 init_second_stage.recovery,並以 /init 執行)

裝置啟動 Android 時,vendor_boot 的內容 + 一般內容 ramdisks 如下:

  • /init (從 init_first_stage 建立的一般 ramdisk)

移動 fstab 檔案

將安裝到一般 ramdisk 的所有 fstab 檔案移至 vendor_ramdisk。如需範例,請參閱 變更

安裝模組

您也可以選擇將裝置專屬模組安裝至 vendor_ramdisk (略過) 。Init 並未切換根目錄系統會將模組的 vendor_ramdisk 變化版本安裝至 vendor_ramdisk 的根。如需查看如何將模組安裝至 vendor_ramdisk,請參閱第一階段控制台中繼資料 總和檢查碼虛擬 A/B 壓縮

第一階段控制台

如要安裝模組的 vendor_ramdisk 變化版本,請使用下列指令:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

這能確保 linkershtoybox 能夠安裝到 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin,之後會安裝至 /system/binvendor_ramdisk

如要新增第一階段控制台 (例如 ADB) 所需的模組,請啟用 這些模組的 vendor_ramdisk 變體,方法是將相關修補程式上傳至 然後使用下列指令

PRODUCT_PACKAGES += adbd.vendor_ramdisk

這可確保將指定的模組安裝到 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin。如果 vendor_boot ramdisk 會在復原模式中載入,而該模組也可在 recovery 中使用。如果 復原模式下未載入 vendor_boot ramdisk,裝置可選擇是否載入 請同時安裝 adbd.recovery

中繼資料核對和

支援中繼資料 核對和 進行這項操作時,不支援 GKI 的裝置就會安裝 ramdisk 包含下列模組的變化版本。如要新增 GKI 支援功能,請將模組移至 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

如需範例,請參閱 變更清單

虛擬 A/B 壓縮

如要支援虛擬 A/B 壓縮功能,必須在以下位置安裝 snapuserdvendor_ramdisk。裝置應繼承自 virtual_ab_ota/compression.mk、 這個指令會安裝 snapuserdvendor_ramdisk 變化版本。

對啟動程序所做的變更

啟動 Android 裝置時,啟動程序不會變更。vendor_boot + 一般 ramdisk 和現有的開機程序類似,只是 fstab 會從 vendor_boot 載入。由於 system/bin/recovery 不存在, first_stage_init 將其視為一般啟動程序進行處理。

啟動進入復原模式時,啟動程序會變更。復原 + vendor_boot + 一般 ramdisk 與現有的復原程序類似,但 核心是從 boot 映像檔載入,而不是從 recovery 映像檔載入。 復原模式的啟動程序如下所示。

  1. 系統啟動載入程式會啟動,並執行以下操作:

    1. 將復原 + vendor_boot + 一般 ramdisk 推送至 /。(如果原始設備製造商 (OEM)) 將復原 ramdisk 中的重複核心模組新增至 BOARD_RECOVERY_KERNEL_MODULES) 和 vendor_boot 為選用項目)。
    2. boot 分區執行核心。
  2. 核心會將 ramdisk 掛接至 /,然後從一般 ramdisk 執行 /init

  3. 第一個階段 init 會啟動,然後執行以下操作:

    1. 可設定 IsRecoveryMode() == trueForceNormalBoot() == false
    2. /lib/modules 載入供應商核心模組。
    3. 呼叫 DoFirstStageMount(),但略過掛接程序,原因如下: IsRecoveryMode() == true。(裝置不會釋出 ramdisk,因為/ 仍相同),但會呼叫 SetInitAvbVersionInRecovery())。
    4. /system/bin/initrecovery ramdisk 啟動第二階段 init。

提供 e2fsck

裝置 Makefile 可沿用自:

  • virtual_ab_ota/launch_with_vendor_ramdisk.mk (如果裝置支援虛擬服務專員) A/B,但未壓縮。

  • virtual_ab_ota/compression.mk (如果裝置支援虛擬 A/B) 。

安裝產品 makefile $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck。在 執行階段,第一個階段 init 會執行 /system/bin/e2fsck

選項 2b:專屬和非 A/B 的復原分區

這個選項適用於含有非 A/B recovery 分區的裝置;也就是 裝置有名為 recovery 的分區,但沒有運算單元後置字串。這類裝置 包括:

  • 非 A/B 裝置;
  • 不是復原分區的 A/B 和虛擬 A/B 裝置 可更新。(此為異常現象)。

vendor_boot ramdisk 包含 ramdisk 和供應商的供應商位元 核心模組,包括:

  • 裝置專屬的 fstab 檔案
  • lib/modules (包含供應商核心模組)

recovery 圖片必須獨立。必須包含 啟動復原模式的所有必要資源,包括:

  • 核心映像檔
  • DTBO 圖片
  • lib/modules」中的核心模組
  • 第一階段啟動 (以符號連結形式) /init -> /system/bin/init
  • 第二階段初始化二進位檔 /system/bin/init
  • 裝置專屬的 fstab 檔案
  • 所有其他復原資源,包括 recovery 二進位檔

在這些裝置上,產品設定會沿用 出發地:generic_ramdisk.mk

設定 BOARD 值

針對非 A/B 裝置設定下列值:

BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true

recovery ramdisk 必須包含 /init -> /system/bin/init 符號連結,且 init_second_stage.recovery/system/bin/init。裝置開機時 復原模式,需要 /system/bin/init 二進位檔才能先支援兩者 第二階段和第二階段初始化

當裝置開機至 recovery 時,recovery ramdisks 的內容會 如下所示:

  • /init -> /system/bin/init (來自 recovery ramdisk)
  • /system/bin/init (從 recovery ramdisk,建構自 init_second_stage.recovery,並以 /init 執行)

裝置啟動 Android 時,vendor_boot 的內容 + 一般內容 ramdisks 如下:

  • /init (從 ramdisk,透過 init_first_stage 建構)

移動 fstab 檔案

將安裝到一般 ramdisk 的所有 fstab 檔案移至 vendor_ramdiskrecovery ramdisk。如需範例,請參閱 變更

安裝模組

您可以將裝置專屬模組安裝至「vendor_ramdisk」並 recovery ramdisk (略過) 。init 並未切換根目錄系統會將模組的 vendor_ramdisk 變化版本安裝至 vendor_ramdisk 的根。系統會將模組的 recovery 變化版本安裝至 recovery ramdisk 的根。如需查看如何將模組安裝至 vendor_ramdiskrecovery ramdisk,se 第一階段控制台中繼資料 核對和

第一階段控制台

如要安裝模組的 vendor_ramdisk 變化版本,請使用下列指令:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

這能確保 linkershtoybox 能夠安裝到 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin,之後會安裝至 /system/binvendor_ramdisk

如要新增第一階段控制台 (例如 ADB) 所需的模組,請啟用 這些模組的 vendor_ramdisk 變體,方法是將相關修補程式上傳至 然後使用下列指令

PRODUCT_PACKAGES += adbd.vendor_ramdisk

這可確保將指定的模組安裝到 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin

如要安裝模組的 recovery 變化版本,請將 vendor_ramdisk 替換為 recovery:

PRODUCT_PACKAGES += \
    linker.recovery \
    shell_and_utilities_recovery \
    adbd.recovery \

中繼資料核對和

支援中繼資料 核對和 進行這項操作時,不支援 GKI 的裝置就會安裝 ramdisk 包含下列模組的變化版本。如要新增 GKI 支援功能,請將模組移至 $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

如要在復原程序的第一個階段支援中繼資料核對和,請啟用 這些模組的復原變化版本,並一併安裝。

對啟動程序所做的變更

啟動 Android 裝置時,啟動程序不會變更。vendor_boot + 一般 ramdisk 和現有的開機程序類似,只是 fstab 會從 vendor_boot 載入。由於 system/bin/recovery 不存在, first_stage_init 將其視為一般啟動程序進行處理。

啟動進入復原模式時,啟動程序不會變更。恢復 ramdisk 的載入方式與現有的復原程序相同。 系統會從 recovery 映像檔載入核心。 復原模式的啟動程序如下所示。

  1. 系統啟動載入程式會啟動,並執行以下操作:

    1. 將復原 ramdisk 推送至 /
    2. recovery 分區執行核心。
  2. 核心會將 ramdisk 掛接至 /,然後執行 /init,這是以下的符號連結: recovery ramdisk 中的 /system/bin/init

  3. 第一個階段 init 會啟動,然後執行以下操作:

    1. 可設定 IsRecoveryMode() == trueForceNormalBoot() == false
    2. /lib/modules 載入供應商核心模組。
    3. 呼叫 DoFirstStageMount(),但略過掛接程序,原因如下: IsRecoveryMode() == true。(裝置不會釋出 ramdisk,因為/ 仍相同),但會呼叫 SetInitAvbVersionInRecovery())。
    4. /system/bin/initrecovery ramdisk 啟動第二階段 init。

啟動映像檔時間戳記

下列程式碼是 boot 圖片時間戳記檔案範例:

####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
  • 在建構期間,系統會將 system/etc/ramdisk/build.prop 檔案新增至一般類別 ramdisk。此檔案包含建構作業的時間戳記資訊。

  • 在執行階段,第一個階段 init 副本 將 ramdisk 從 ramdisk 到 tmpfs 的檔案,然後釋出 ramdisk 的容量, 階段「init」可讀取 這個檔案來設定 boot 圖片時間戳記屬性。