将内核功能配置为 GKI 模块

本页面介绍了如何将新的内核功能配置为 GKI 模块,或将现有的内置内核功能配置为 GKI 模块。

将新功能配置为 GKI 模块

  1. 对于新功能,请修改 gki_defconfig 并将所需内核功能的配置项从 n 设置为 m (=m)。在 arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig 中都进行此设置。

  2. 将为该功能生成的 KO (.ko) 文件添加到 common/modules.bzlCOMMON_GKI_MODULES_LIST 部分。按排序顺序添加文件。如果您不确定生成的所有文件,构建会失败并列出所有需要添加到列表中的 KO 文件。

  3. (可选)对于 Android 15 及更高版本,请跳过此步骤。

    将步骤 2 中的同一组 KO 文件按升序排序(以便在运行时进行二进制搜索)添加到 common/android/gki_{ARCH}_protected_modules,以将该模块指定为受保护的 GKI 模块。

  4. 更新导出列表,使其包含 common/android/abi_gki_protected_exports_ARCHITECTURE 中新添加的导出。例如,要更新列表,请为 aarch64 运行 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports。被指定为受保护 GKI 模块的模块仍必须获得 Google 的批准才能成为官方受保护模块。

  5. 确保将步骤 2 中新添加的 KO 文件复制到内核的 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gzsystem_dlkm_staging_archive.tar.gz 归档文件中的模块可以用作在平台 build 中生成 system_dlkm.img 的输入。

  6. 提交更改以供审核。GKI 模块是仅限 Android 的内核功能,因此模块转换补丁无需向上游提交。但是,您必须遵循其他指南来提交 Android 通用内核 (ACK) 补丁

将内核内置功能配置为 GKI 模块

  1. 对于现有的内置内核功能,请修改 gki_defconfig 并将所需内核功能的配置项从 y 设置为 m (=m)。在 arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig 中都进行此设置。

  2. 将为该功能生成的 KO (.ko) 文件添加到 common/modules.bzlCOMMON_GKI_MODULES_LIST 部分。按排序顺序添加文件。如果您不确定生成的所有文件,构建会失败并列出所有需要添加到列表中的 KO 文件。

  3. 将步骤 2 中的同一组 KO 文件按升序排序(以便在运行时进行二进制搜索)添加到 common/android/gki_{ARCH}_protected_modules,以将该模块指定为受保护的 GKI 模块。更新受保护的导出列表,以包含 common/android/abi_gki_protected_exports_{ARCH} 中来自新添加模块的导出,方法是为 aarch64 使用 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports。被指定为受保护 GKI 模块的模块仍必须获得 Google 的批准才能成为官方受保护模块。

  4. 确保将步骤 2 中新转换的模块 KO 文件复制到内核的 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gzsystem_dlkm_staging_archive.tar.gz 归档文件中的模块可以用作在平台 build 中生成 system_dlkm.img 的输入。

  5. 提交更改以供审核。GKI 模块是仅限 Android 的内核功能,因此模块转换补丁无需向上游提交。但是,您必须遵循其他指南来提交 Android 通用内核 (ACK) 补丁

将受保护的 GKI 模块转换为不受保护的模块

    • 对于 Android 14 及更早版本:从 common/android/gki_protected_modules 的受保护模块列表中移除要从受保护模块转换为不受保护模块的模块。
    • 对于 Android 15 及更高版本:将要从受保护模块转换为不受保护模块的模块添加到 common/modules.bzl 文件中的 COMMON_UNPROTECTED_MODULES_LIST 列表。
  1. 更新受保护的导出列表,以排除 common/android/abi_gki_protected_exports_{ARCH} 中来自新转换的不受保护模块的导出,方法是为 aarch64 使用 tools/bazel run //common:kernel_aarch64_abi_update_protected_exports

  2. 提交更改以供审核。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 尝试导出只能由签名的 GKI 模块导出的 some_kernel_function 时,加载会失败并显示此消息。

解决方法

如果未签名模块是自定义版本,则可以使用导出 some_kernel_function 的模块的 GKI 版本来纠正此问题。