供應商/ODM DLKM 分區

Android 11 引入了通用內核映像和供應商引導分區的概念。供應商引導分區存儲與 GKI 兼容的內核模塊,並由第一階段 init 加載。 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 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

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的符號鏈接。

始終將/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)的文檔,請參閱內核模塊支持