Android 11 導入了通用核心映像檔和供應商啟動分區的概念。供應商啟動分割區會儲存與 GKI 相容的 Kernel 模組,並由第一階段 init 載入。Android 11 發布前的核心模組也會儲存在供應商和 ODM 分割區,並由供應商程序載入。
如果是 Android 11 以上版本,核心和所有核心模組可以獨立更新,不受其餘分割區影響。如要為儲存在供應商分區中的核心模組啟用更新 (不更新供應商分區),請將所有供應商分區模組移至名為「供應商 DLKM」(動態可載入核心模組) 的新分區。然後獨立更新這個磁碟分割區。同樣地,您可以將 ODM 分區中儲存的所有核心模組移至名為「ODM DLKM」的新分區。這個分區也可以獨立更新。
分區位置
vendor_dlkm
和 odm_dlkm
分區位於超級分區中,做為另一個動態分區。
/vendor/lib/modules 中的 vendor_dlkm 內容
- 供應商核心模組
modprobe
個設定檔- 一個
modules.load
檔案
/odm/lib/modules 中的 odm_dlkm 內容
- ODM 核心模組
modprobe
個設定檔- 一個
modules.load
檔案
如要進一步瞭解核心模組設定檔,請參閱「核心模組支援」。
建立支援
建立 vendor_dlkm
和 odm_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_dlkm
和 odm_dlkm
分區會分別掛接在 /vendor_dlkm
和 /odm_dlkm
目錄中。發生這種情況時,/vendor/lib/modules
和 /odm/lib/modules
的符號連結就會變成可用。
然後,供應商程序 (例如 .rc
指令碼) 即可根據 modules.load
中指定的順序載入核心模組。如有需要,供應商程序也可以在稍後載入模組。
相關說明文件
如需建立供應商啟動磁碟分割區 (內含供應商 RAMDisk) 的相關文件,請參閱「核心模組支援」。