供應商和 ODM DLKM 分區

Android 11 引入了一般核心映像檔和供應商啟動分區的概念。供應商啟動分割區會儲存與 GKI 相容的核心模組,並由第一階段初始載入。Android 11 版本之前的核心模組也會儲存在供應商和 ODM 分區中,並由供應商程序載入。

在 Android 11 以上版本中,核心和所有核心模組可獨立於其他分區更新。如要啟用儲存在供應商分區的核心模組更新 (不需供應商分區更新),請將所有供應商分區模組移至名為「Vendor DLKM」的新分區 (可動態載入的核心模組)。接著,您可以獨立更新這個分區。同樣地,您可以將儲存在 ODM 分區中的所有核心模組移至名為 ODM DLKM 的新分區。這個分區也可以獨立更新。

分區位置

vendor_dlkmodm_dlkm 分區位於超分區中,做為另一個動態分區。

/vendor/lib/modules 中的 vendor_dlkm 內容

  • 供應商核心模組
  • modprobe 設定檔
  • 一個 modules.load 檔案

/odm/lib/modules 中的 odm_dlkm 內容

  • ODM 核心模組
  • modprobe 設定檔
  • 一個 modules.load 檔案

如要進一步瞭解核心模組設定檔,請參閱「核心模組支援」。

建構支援

建立 vendor_dlkmodm_dlkm 的程序與建立其他動態分區的程序類似。

vendor_dlkm 建構範例

如以下範例所示,建構 vendor_dlkm

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

<GROUP_NAME> 替換為更新群組的適當名稱。更新群組應為供應商分區所在的群組。

如果是 A/B 和虛擬 A/B 裝置,device.mk

AB_OTA_PARTITIONS += vendor_dlkm

Fstab

vendor_dlkm 的項目新增至 fstab。根據裝置變更標記。請使用 CL vendor_dlkm 新增至 CF 做為範例。

vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

odm_dlkm 建構範例

如以下範例所示,建構 odm_dlkm

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

針對 A/B 和虛擬 A/B 裝置:device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

odm_dlkm 的項目新增至 fstab。請根據裝置變更旗標。請參考 CL Add odm_dlkm to CF 範例。

odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

將核心模組複製到分區

如要選取要複製到 vendor_dlkm 分區的核心模組,請在 BOARD_VENDOR_KERNEL_MODULES 中列出這些模組。

如要覆寫 modules.load 的內容,您可以在 BOARD_VENDOR_KERNEL_MODULES_LOAD 中指定。

在建構期間,BOARD_VENDOR_KERNEL_MODULES 中列出的模組會在 $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules 中安裝。在 /vendor/lib/modules 建立符號連結,並導向 /vendor_dlkm/lib/modules

同樣地,如要選取要複製到 odm_dlkm 分區的核心模組,請在 BOARD_ODM_KERNEL_MODULES 中列出這些模組。平台版本會在模組上執行 depmod,並將 depmod 輸出檔案複製到映像檔中。建構作業會建立 modules.load 檔案,並將其儲存在映像檔中。這個檔案包含 BOARD_ODM_KERNEL_MODULES 中列出的所有模組。

如要覆寫 modules.load 的內容,您可以在 BOARD_ODM_KERNEL_MODULES_LOAD 中指定。

在建構期間,BOARD_ODM_KERNEL_MODULES 中列出的模組會安裝在 $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules 中。系統會在 /odm/lib/modules 中建立符號連結,並導向 /odm_dlkm/lib/modules

針對供應商和 ODM 核心模組,一律使用 /vendor/lib/modules/odm/lib/modules

不得使用 /vendor_dlkm/lib/modules。沒有 vendor_dlkm 分割區的裝置會直接將 BOARD_VENDOR_KERNEL_MODULES 安裝至 /vendor/lib/modules。由於 /vendor_dlkm/lib/modules 不存在,因此這會造成問題。

請勿使用 /odm_dlkm/lib/modules沒有 odm_dlkm 分割區的裝置會直接將 BOARD_ODM_KERNEL_MODULES 安裝至 /odm/lib/modules。由於 /odm_dlkm/lib/modules 不存在,因此會造成問題。

分區掛載和模組載入

first_stage_init 期間,vendor_dlkmodm_dlkm 分區會分別掛載至 /vendor_dlkm/odm_dlkm 目錄。發生這種情況時,/vendor/lib/modules/odm/lib/modules 中的符號連結就會可用。

接著,供應商程序 (例如 .rc 指令碼) 就能根據 modules.load 中指定的順序載入核心模組。供應商程序也可以視需要在日後載入模組。

如需建立廠商啟動分區 (包含廠商 RAMDisk) 的相關資訊,請參閱核心模組支援