Android 11 引入了通用内核映像和供应商启动分区的概念。供应商启动分区存储与 GKI 兼容的内核模块,并由第一阶段 init 加载。Android 11 版本之前的内核模块也存储在供应商和 ODM 分区中,并由供应商进程加载。
对于 Android 11 或更高版本,内核和所有内核模块都可以独立于其余分区进行更新。要为存储在供应商分区中的内核模块启用更新(无需供应商分区更新),请将所有供应商分区模块移至名为 Vendor 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>
替换为相应的更新组名称。更新组应为 vendor 分区所在的组。
对于 A/B 和 Virtual 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 和 Virtual 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
中列出它们。平台构建对模块运行 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
的符号链接。
始终对供应商和 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
中指定的顺序加载内核模块。如果需要,供应商进程也可以在稍后加载模块。
相关文档
有关创建 vendor-boot 分区(其中包含供应商 RAMDisk)的文档,请参阅内核模块支持。