通用引導分區

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

對於使用 Android 13 啟動的設備,通用 ramdisk 將從boot映像中刪除,並放置在單獨的init_boot映像中。此變更可讓boot映像僅包含 GKI 核心。

對於繼續使用 Android 12 或更舊核心版本的升級設備,通用 ramdisk 保留在原來位置,不需要新的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 的設備,使用 GKI,無專用恢復

隨 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 的設備,使用 GKI,無專用恢復

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

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

圖 5.啟動或升級到 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 仍必須使用裝置特定的AVB金鑰對預先建置的boot.img進行簽署。
      • 通用cmdlineGENERIC_KERNEL_CMDLINE
      • GKI內核
    • 通用 ramdisk 映像
      • 僅包含在 Android 12 及更早版本的boot映像中
  • vendor_boot映像(有關詳細信息,請參閱Vendor Boot Partitions

    • 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 被加到 generic 和vendor_boot ramdisk 之前,因此它不需要是獨立的。例如:
      • 除了vendor_boot ramdisk 中的核心模組之外, lib/modules可能只包含引導恢復模式所需的附加核心模組。
      • /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 。此變數表示該板使用GKI。此變數不會影響 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 ,並且需要為連結的 vbmeta設定BOARD_AVB_INIT_BOOT*變量

允許的組合

組件或變數沒有recovery分割區的升級設備具有recovery分割區的升級設備啟動沒有recovery分割區的設備啟動具有 A/B recovery分區的設備啟動具有非 A/B recovery分區的設備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_IMAGE設為true或空。對於這些設備,如果設定了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

有關範例,請參閱此變更

系統作為root

使用 GKI 的裝置不支援 System-as-root。在此類設備上, BOARD_BUILD_SYSTEM_ROOT_IMAGE必須為空。使用動態分區的設備也不支援系統作為根用戶。

產品配置

使用通用 ramdisk 的設備必須安裝允許安裝到 ramdisk 的檔案清單。為此,請在device.mk中指定以下內容:

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

generic_ramdisk.mk檔案還可防止其他 makefile 意外地將其他檔案安裝到 ramdisk(將此類檔案移至vendor_ramdisk )。

設定設備

使用 Android 13 啟動、升級到 Android 12 以及使用 Android 12 啟動的裝置之間的設定說明有所不同。Android 13 的設定與使用 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設定為空。如果他們這樣做,他們正在使用新的配置。如果有這樣的設備:

      • 請勿使用專用recovery分區,架構如圖1所示,設備設定選項為選項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或 recovery),所以它不是一個完整的目標。有關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符號鏈接,以及/system/bin/init處的init_second_stage.recovery 。但是,由於通用 ramdisk 是連接在vendor_boot ramdisk 之後,因此/init符號連結會被覆寫。當裝置啟動進入恢復狀態時,需要/system/bin/init二進位檔案來支援第二階段 init。 vendor_boot + generic ramdisk 的內容如下:

  • /init (來自通用 ramdisk,由init_first_stage建構)
  • /system/bin/init (來自vendor_ramdisk ,由init_second_stage.recovery建構)

移動 fstab 文件

將安裝到通用 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 \
    resize2fs.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可以讀取啟動的建置時間戳記。

由於資源從 generic ramdisk 移動到vendor_boot ramdisk,因此連接 generic 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將 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虛擬磁碟包含所有復原資源。在此類設備上,產品配置繼承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/initinit_second_stage.recovery 。但是,由於引導 ramdisk 是在recovery ramdisk 之後串聯的,因此/init符號連結會被覆寫。當裝置啟動到復原模式時,需要/system/bin/init二進位檔案來支援第二階段 init。

當裝置啟動進入recovery時, recovery + vendor_boot +generic ramdisks的內容如下:

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

當裝置啟動到 Android 時, vendor_boot + generic ramdisk 的內容如下:

  • /init (來自通用 ramdisk,由init_first_stage建構)

移動 fstab 文件

將安裝到通用 ramdisk 的所有fstab檔案移至vendor_ramdisk 。有關範例,請參閱此變更

安裝模組

如果需要,您可以將設備特定的模組安裝到vendor_ramdisk (如果沒有要安裝的任何設備特定的模組,請跳過此步驟)。 Init不切換 root。模組的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 \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

有關範例,請參閱此變更清單

虛擬A/B壓縮

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

啟動過程的更改

當啟動進入 Android 時,啟動過程不會改變。 vendor_boot + generic ramdisk 與現有的引導過程類似,只是fstabvendor_boot載入。由於system/bin/recovery不存在, first_stage_init將其視為正常啟動。

啟動進入恢復模式時,啟動過程會改變。 recovery+ vendor_boot +generic ramdisk 與現有的恢復過程類似,但核心是從boot映像載入的,而不是從recovery映像載入的。恢復模式的啟動過程如下。

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

    1. 將 recovery + vendor_boot +generic ramdisk 推送到/ 。 (如果 OEM 透過將核心模組新增至BOARD_RECOVERY_KERNEL_MODULES來複製復原 ramdisk 中的核心模組), vendor_boot是可選的。)
    2. boot分區運行核心。
  2. 核心將 ramdisk 掛載到/ ,然後從通用 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二進位等。
  • ETC。

在此類設備上,產品配置繼承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/initinit_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 + generic ramdisk 的內容如下:

  • /init (來自 ramdisk,從init_first_stage構建)

移動 fstab 文件

將安裝到通用 ramdisk 的所有fstab檔案移至vendor_ramdiskrecovery ramdisk。有關範例,請參閱此變更

安裝模組

如果需要,您可以將特定於設備的模組安裝到vendor_ramdiskrecovery ramdisk(如果您沒有要安裝的任何特定於設備的模組,請跳過此步驟)。 init不會切換 root。模組的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 \
    resize2fs.vendor_ramdisk \
    tune2fs.vendor_ramdisk \

為了在復原的第一階段安裝期間支援元資料校驗和,請啟用這些模組的復原變體並安裝它們。

啟動過程的更改

當啟動進入 Android 時,啟動過程不會改變。 vendor_boot + generic ramdisk 與現有的引導過程類似,只是fstabvendor_boot載入。由於system/bin/recovery不存在, first_stage_init將其視為正常啟動。

啟動進入恢復模式時,啟動過程不會改變。恢復虛擬磁碟的載入方式與現有復原過程相同。核心是從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檔案被加入到通用 ramdisk 中。該文件包含已建置的時間戳資訊。

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