通用引導分區

在 Android 12 中,通用boot映像包含通用boot ramdisk 和通用內核映像 (GKI) 。要構建通用 ramdisk,請將特定於供應商的資源移出 ramdisk,以便通用 ramdisk 僅包含第一階段init和包含時間戳信息的屬性文件。

在以下設備上:

  • 不要使用專用的recovery分區,所有恢復位都從引導 ramdisk 移動到vendor_boot ramdisk。

  • 一定要使用專用的recovery分區,因為recovery ramdisk 是獨立的,所以不需要更改recovery ramdisk。

建築學

下圖說明了運行 Android 12 的設備的架構。

啟動或升級到 Android 12,沒有專門的恢復

啟動/升級設備,GKI,無專用恢復

圖 1.使用 GKI 啟動或升級到 Android 12 的設備,沒有專門的恢復

啟動或升級到 Android 12,專用和 A/B 恢復(專用 ramdisk)

啟動/升級設備、GKI、專用和 A/B 恢復

圖 2a。使用 GKI、專用和 A/B 恢復啟動或升級到 Android 12 的設備

如果recovery為 A/B,請參考此圖;即設備有recovery_arecovery_b分區。

啟動或升級到 Android 12,專用和非 A/B 恢復(專用 ramdisk)

啟動/升級設備、GKI、專用和非 A/B 恢復

圖 2b。使用 GKI、專用和非 A/B 恢復啟動或升級到 Android 12 的設備

如果recovery不是 A/B,請參考此圖;也就是說,設備有一個名為recovery的分區,沒有插槽後綴。

升級到 Android 12,recovery-as-boot (recovery-as-ramdisk)

啟動/升級設備,無 GKI,恢復即啟動

圖 3.升級到 Android 12、無 GKI、恢復即啟動的設備

升級到Android 12,專用恢復(專用ramdisk)

啟動/升級設備,無 GKI,專用恢復

圖 4.升級到 Android 12、無 GKI、專用恢復的設備

引導映像內容

在 Android 12 中,啟動映像包含以下內容。

  • 通用boot映像
    • 標頭版本V3V4
      • 用於 GKI boot.img 認證的boot_signature (僅限 v4)。認證的 GKI boot.img未簽名用於驗證啟動。 OEM 仍必須使用特定於設備的AVB密鑰對預構建的boot.img進行簽名。
      • 通用GENERIC_KERNEL_CMDLINE cmdline
      • 通用內核映像
    • 通用boot ramdisk 映像
  • vendor_boot映像(有關詳細信息,請參閱Vendor Boot Partitions
    • vendor_boot標頭
      • 特定於設備的cmdline ( BOARD_KERNEL_CMDLINE )
    • vendor_boot ramdisk 映像
      • lib/modules
      • 恢復資源(如果沒有專用恢復)
    • dtb圖像
  • recovery圖像
    • 標頭版本 V2
      • 用於恢復的特定於設備的cmdline (如有必要)
      • 對於非 A/B 恢復分區,header 的內容必須是獨立的;請參閱恢復映像。例如:
      • 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 被添加到bootvendor_boot ramdisk,因此它不需要是獨立的。例如:
      • 除了vendor_boot ramdisk 中的內核模塊之外, lib/modules可能只包含啟動恢復模式所需的其他內核模塊。
      • /init處的符號鏈接可能存在,但它被引導映像中的第一階段/init二進製文件所掩蓋。

通用引導 ramdisk 映像內容

在 Android 12 中,通用boot 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/

引導映像集成

構建標誌控制如何構建bootrecoveryvendor_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 。此變量指示板使用 GKI 和通用boot映像。此變量不影響 sysprops 或PRODUCT_PACKAGES

    這是板級 GKI 開關;下面列出的所有變量都受此變量的限制。

  • BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT 。此變量控制是否為vendor_boot構建 ramdisk 恢復資源。

    • 當設置為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

    • 其他設備必須將此變量留空。

允許的組合

組件或變量在沒有recovery分區的情況下更新設備使用recovery分區更新設備啟動沒有recovery分區的設備使用 A/B recovery分區啟動設備使用非 A/B recovery分區啟動設備aosp_arm64
包含boot是的是的是的是的是的是的
包含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_RESOURCE_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_IMAGE設置為true或為空。對於這些設備,如果設置了BOARD_RECOVERYIMAGE_PARTITION_SIZE ,則會構建recovery映像。

為引導啟用鏈接的 vbmeta

必須為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

例如,請參閱此更改

系統為根

使用 GKI 和通用引導映像的設備不支持 System-as-root,無論設備是否支持可更新的 GKI 模塊。在此類設備上, BOARD_BUILD_SYSTEM_ROOT_IMAGE必須為空。使用動態分區的設備也不支持 System-as-root,這是使用可更新 GKI 模塊的要求。

產品配置

使用通用 ramdisk 的設備必須安裝允許安裝到 ramdisk 的文件列表。為此,請在device.mk中指定以下內容:

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

generic_ramdisk.mk文件還可以防止其他 makefile 意外地將其他文件安裝到 ramdisk(將這些文件移動到vendor_ramdisk )。

設置設備

更新到 Android 12 和啟動 Android 12 的設備之間的設置說明有所不同。

  • 更新至 Android 12 的設備:

    • 可以保留BOARD_USES_RECOVERY_AS_BOOT的值。如果他們這樣做,他們使用的是舊配置,並且新的構建變量必須為空。如果此類設備:

      • 設置BOARD_USES_RECOVERY_AS_BOOTtrue ,架構如圖3所示。

      • 設置BOARD_USES_RECOVERY_AS_BOOT為空,架構如圖4所示。

    • 可以將BOARD_USES_RECOVERY_AS_BOOT設置為空。如果他們這樣做,他們正在使用新的配置。如果此類設備:

  • 搭載 Android 12 的設備必須將BOARD_USES_RECOVERY_AS_BOOT設置為空並使用新配置。如果此類設備:

因為aosp_arm64只構建 GKI 和通用boot映像(而不是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 可以包含指向/system/bin/init符號鏈接的/init和 /system/bin /system/bin/init init 中的init_second_stage.recovery 。但是,因為boot ramdisk 在vendor_boot ramdisk 之後連接,所以/init符號鏈接被覆蓋。當設備啟動恢復時,需要/system/bin/init二進製文件來支持第二階段 init。 vendor_boot + boot ramdisk的內容如下:

  • /init (來自 ramdisk,由init_first_stage
  • /system/bin/init (來自vendor_ramdisk ,由init_second_stage.recovery

移動 fstab 文件

將安裝到boot ramdisk 的任何fstab文件移動到vendor_ramdisk 。例如,請參閱此更改

安裝模塊

如果需要,您可以將特定於設備的模塊安裝到vendor_ramdisk (如果您沒有要安裝的任何特定於設備的模塊,請跳過此步驟)。

  • 當模塊安裝到/first_stage_ramdisk時,使用模塊的vendor_ramdisk變體。該模塊應該在init將 root 切換到/first_stage_ramdisk但在init將 root 切換到/system之前可用。例如,請參閱元數據校驗和和虛擬 A/B 壓縮

  • 當模塊安裝到/時,使用模塊的recovery變體。在init將 root 切換到/first_stage_ramdisk之前,該模塊應該可用。有關將模塊安裝到/的詳細信息,請參閱第一階段控制台

一級控制台

由於第一階段控制台在init將 root 切換到/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 ,然後安裝到vendor_ramdisk下的/system/bin

要添加第一階段控制台所需的模塊(例如 adbd),請使用以下命令。

PRODUCT_PACKAGES += adbd.recovery

這確保指定的模塊安裝到$ANDROID_PRODUCT_OUT/recovery/root/system/bin ,然後安裝到vendor_ramdisk下的/system/bin

元數據校驗和

為了在第一階段掛載期間支持元數據校驗和,不支持 GKI 的設備會安裝以下模塊的 ramdisk 變體。要添加對 GKI 的支持,請將模塊移動到$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin

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

例如,請參閱此更改列表

虛擬 A/B 壓縮

要支持虛擬 A/B 壓縮,必須將snapuserd安裝到vendor_ramdisk 。該設備應該從virtual_ab_ota/compression.mk繼承,它安裝了snapuserdvendor_ramdisk變體。

引導過程的變化

啟動進入恢復或進入 Android 的過程不會改變,但以下情況除外:

  • Ramdisk build.prop移動到/second_stage_resources以便第二階段init可以讀取啟動的構建時間戳。

因為資源從boot ramdisk 移動到vendor_boot ramdisk,連接bootvendor_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將 root 切換到/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符號鏈接,以及/system/bin/init中的init_second_stage.recovery 。但是,由於引導 ramdisk 在recovery ramdisk 之後連接,因此/init符號鏈接被覆蓋。當設備啟動到恢復模式時,需要/system/bin/init二進製文件來支持第二階段 init。

當設備啟動進入recovery時, recovery + vendor_boot + boot ramdisks 的內容如下:

  • /init (來自 ramdisk,由init_first_stage
  • /system/bin/init (來自recovery ramdisk,由init_second_stage.recovery ,並從/init執行)

設備啟動進入Android時, vendor_boot + boot ramdisk的內容如下:

  • /init (來自 ramdisk,由init_first_stage

移動 fstab 文件

將安裝到boot 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 ,然後安裝到vendor_ramdisk下的/system/bin

要添加第一階段控制台所需的模塊(例如 adbd),請通過將相關補丁上傳到 AOSP 來啟用這些模塊的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 \
    resizefs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

例如,請參閱此更改列表

虛擬 A/B 壓縮

要支持虛擬 A/B 壓縮,必須將snapuserd安裝到vendor_ramdisk 。該設備應該從virtual_ab_ota/compression.mk繼承,它安裝了snapuserdvendor_ramdisk變體。

引導過程的變化

啟動到 Android 時,啟動過程不會改變。 vendor_boot + boot ramdisk 類似於現有的引導過程,除了fstabvendor_boot加載。因為system/bin/recovery不存在, first_stage_init將其作為正常啟動處理。

啟動進入恢復模式時,啟動過程會發生變化。 recovery + vendor_boot + boot ramdisk 類似於現有的恢復過程,但內核是從boot映像而不是從recovery映像加載的。恢復模式的啟動過程如下。

  1. 引導加載程序啟動,然後執行以下操作:

    1. 將 recovery + vendor_boot + boot ramdisk 推送到/ 。 (如果 OEM 通過將它們添加到BOARD_RECOVERY_KERNEL_MODULES來複製恢復 ramdisk 中的內核模塊), vendor_boot是可選的。)
    2. boot分區運行內核。
  2. 內核將 ramdisk 掛載到/然後從boot ramdisk 執行/init

  3. 第一階段 init 開始,然後執行以下操作:

    1. 設置IsRecoveryMode() == trueForceNormalBoot() == false
    2. /lib/modules加載供應商內核模塊。
    3. 調用DoFirstStageMount()但跳過安裝,因為IsRecoveryMode() == true 。 (設備不會釋放 ramdisk(因為/仍然相同),但會調用SetInitAvbVersionInRecovery() 。)
    4. recovery ramdisk 的/system/bin/init啟動第二階段 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 作為符號鏈接/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符號鏈接,以及/system/bin/init中的init_second_stage.recovery 。當設備啟動進入恢復模式時,需要/system/bin/init二進製文件來支持第一階段和第二階段 init。

當設備啟動進入recovery時, recovery ramdisk 的內容如下:

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

設備啟動進入Android時, vendor_boot + boot ramdisk的內容如下:

  • /init (來自 ramdisk,由init_first_stage

移動 fstab 文件

將安裝到boot ramdisk 的所有fstab文件移動到vendor_ramdiskrecovery ramdisk。例如,請參閱此更改

安裝模塊

如果需要,您可以將特定於設備的模塊安裝到vendor_ramdiskrecovery ramdisk(如果您沒有要安裝的任何特定於設備的模塊,請跳過此步驟)。 init不切換根目錄。模塊的vendor_ramdisk變體安裝到vendor_ramdisk的根目錄。模塊的recovery變體安裝到recovery ramdisk 的根目錄。有關將模塊安裝到vendor_ramdiskrecovery ramdisk 的示例,請參閱第一階段控制台元數據校驗和

一級控制台

要安裝模塊的vendor_ramdisk變體,請使用以下命令:

PRODUCT_PACKAGES += \
    linker.vendor_ramdisk \
    shell_and_utilities_vendor_ramdisk \

這可確保linkershtoybox安裝到$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin ,然後安裝到vendor_ramdisk下的/system/bin

要添加第一階段控制台所需的模塊(例如 adbd),請通過將相關補丁上傳到 AOSP 來啟用這些模塊的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 \
    resizefs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

要在恢復的第一階段掛載期間支持元數據校驗和,請啟用這些模塊的恢復變體並安裝它們。

引導過程的變化

啟動到 Android 時,啟動過程不會改變。 vendor_boot + boot ramdisk 類似於現有的引導過程,除了fstabvendor_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. recovery ramdisk 的/system/bin/init啟動第二階段 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文件被添加到通用boot映像 ramdisk。該文件包含構建的時間戳信息。

  • 在運行時,第一階段init在釋放 ramdisk 之前將文件從 ramdisk複製tmpfs ,以便第二階段init可以讀取此文件以設置boot映像時間戳屬性。