本页旨在介绍如何将新的内核功能或现有的内置内核功能配置为 GKI 模块。
将新功能配置为 GKI 模块
对于新功能,请修改
gki_defconfig
并将所需内核功能的配置项从n
改设为m
(=m
)。在arch/arm64/configs/gki_defconfig
和arch/x86/configs/gki_defconfig
中均配置此设置。将为该功能生成的 KO (
.ko
) 文件添加到common/modules.bzl
的COMMON_GKI_MODULES_LIST
部分。依序添加文件。如果您不确定生成的所有文件,构建会失败并会列出应向列表添加的所有必要 KO 文件。将第 2 步中的同一组 KO 文件(按升序排列以便在运行时进行二进制文件搜索)添加到
common/android/gki_{ARCH}_protected_modules
中,以将该模块指定为受保护的 GKI 模块。使用适用于aarch64
的tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
更新受保护的导出列表,使其包含common/android/abi_gki_protected_exports_{ARCH}
中新添加的模块中的导出内容。即使已被指定为受保护的 GKI 模块,这些模块仍必须获得 Google 批准,才能成为受官方保护的模块。确保将第 2 步中新添加的 KO 文件复制到内核的
out/<androidX-Y.Z>/dist/system_dlkm.img
和out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz
。system_dlkm_staging_archive.tar.gz
归档中的模块可用作输入内容,以在平台 build 中生成system_dlkm.img
。提交您的更改以供审核。GKI 模块是 Android 专用内核功能,因此无需在上游提交模块转换补丁。不过,您必须遵循其他准则,才能提交 Android 通用内核 (ACK) 补丁。
将内置内核功能配置为 GKI 模块
对于现有的内置内核功能,请修改
gki_defconfig
并将所需内核功能的配置项从y
改设为m
(=m
)。在arch/arm64/configs/gki_defconfig
和arch/x86/configs/gki_defconfig
中均配置此设置。将为该功能生成的 KO (
.ko
) 文件添加到common/modules.bzl
的COMMON_GKI_MODULES_LIST
部分。依序添加文件。如果您不确定生成的所有文件,构建会失败并会列出应向列表添加的所有必要 KO 文件。将第 2 步中的同一组 KO 文件(按升序排列以便在运行时进行二进制文件搜索)添加到
common/android/gki_{ARCH}_protected_modules
中,以将该模块指定为受保护的 GKI 模块。使用适用于aarch64
的tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
更新受保护的导出列表,使其包含common/android/abi_gki_protected_exports_{ARCH}
中新添加的模块中的导出内容。即使已被指定为受保护的 GKI 模块,这些模块仍必须获得 Google 批准,才能成为受官方保护的模块。确保将第 2 步中新转换的模块 KO 文件复制到内核的
out/<androidX-Y.Z>/dist/system_dlkm.img
和out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz
。system_dlkm_staging_archive.tar.gz
归档中的模块可用作输入内容,以在平台 build 中生成system_dlkm.img
。提交您的更改以供审核。GKI 模块是 Android 专用内核功能,因此无需在上游提交模块转换补丁。不过,您必须按照其他准则提交 Android 通用内核 (ACK) 补丁。
将受保护的 GKI 模块转换为不受保护的模块
从位于
common/android/gki_protected_modules
的受保护模块列表中移除从受保护状态转换为不受保护状态的模块。使用适用于
aarch64
的tools/bazel run //common:kernel_aarch64_abi_update_protected_exports
更新受保护导出的列表,以排除common/android/abi_gki_protected_exports_{ARCH}
中新转换的不受保护模块中的导出内容。提交您的更改以供审核。GKI 模块是 Android 专用内核功能,因此无需在上游提交模块转换补丁。不过,您必须按照其他准则提交 Android 通用内核 (ACK) 补丁。
GKI 模块符号违规行为解决方法快速指南
当未签名模块违反 GKI 模块的符号保护设置时,模块加载期间可能会遇到两种类型的错误,从而导致失败。
1. 使用受保护符号的未签名模块
错误:
module: Protected symbol: some_kernel_function (err -13)
原因:
module.ko
文件是一个未签名的供应商模块,它会尝试在加载期间解析 GKI 模块导出的符号 some_kernel_function
,而不会在供应商符号列表中列出该符号。
解决方法:
如果 module.ko
不是受保护的 GKI 模块,更新符号列表以在供应商符号列表中添加 some_kernel_function
可解决该错误。或者,也可以使用 GKI 版本的 module.ko
。
2. 导出受保护符号的未签名模块
错误:
module: exports protected symbol some_kernel_function
原因:
导出 some_kernel_function
的模块是受保护的 GKI 模块,module.ko
可能是该模块的未签名自定义版本。当 module.ko
尝试导出 some_kernel_function
(只能由已签名的 GKI 模块导出)时,加载会失败并显示此消息。
解决方法:
如果未签名模块是自定义版本,则可以使用导出 some_kernel_function
的模块的 GKI 版本来修正此问题。