供应商分区和 ODM DLKM 分区

Android 11 引入了通用内核映像和供应商启动分区的概念。供应商启动分区用于存储与 GKI 兼容的内核模块,并在第一阶段 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

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 odm_dlkm 添加到 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 中。平台 build 会对这些模块运行 depmod,并将 depmod 输出文件复制到映像中。build 会创建一个 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)的文档,请参阅内核模块支持