供應商和原始設計製造商 (ODM) DLKM 分區

Android 11 導入了通用核心映像檔和供應商啟動分區的概念。供應商啟動分割區會儲存與 GKI 相容的 Kernel 模組,並由第一階段 init 載入。Android 11 發布前的核心模組也會儲存在供應商和 ODM 分割區,並由供應商程序載入。

如果是 Android 11 以上版本,核心和所有核心模組可以獨立更新,不受其餘分割區影響。如要為儲存在供應商分區中的核心模組啟用更新 (不更新供應商分區),請將所有供應商分區模組移至名為「供應商 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

在 fstab 中新增 vendor_dlkm 的下列項目。根據裝置變更旗標。以 CL Add vendor_dlkm to 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

在 fstab 中新增 odm_dlkm 的下列項目。根據裝置變更旗標。以 CL Add odm_dlkm to CF 為例。

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

將核心模組複製到分區

如要選取要複製到 vendor_dlkm 分割區的 Kernel 模組,請在 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 分割區的 Kernel 模組,請在 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

一律使用 /vendor/lib/modules/odm/lib/modules 處理供應商和 ODM 核心模組。

請勿使用 /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) 的相關文件,請參閱「核心模組支援」。