Android 11 引入了通用内核映像和供应商启动分区的概念。供应商启动分区用于存储与 GKI 兼容的内核模块,并在第一阶段 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
将 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_dlkm
和 odm_dlkm
分区会分别装载到 /vendor_dlkm
和 /odm_dlkm
目录中。发生这种情况时,/vendor/lib/modules
和 /odm/lib/modules
中的符号链接将变为可用。
然后,供应商进程(例如 .rc
脚本)可以根据 modules.load
中指定的顺序加载内核模块。供应商进程也可以稍后根据需要加载模块。
相关文档
如需查看有关创建供应商启动分区(其中包含供应商 RAMDisk)的文档,请参阅内核模块支持。