供应商/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)的文档,请参阅内核模块支持