对于供应商模块而言,维护稳定的内核模块接口 (KMI) 至关重要。GKI 内核以二进制形式构建和发布,而供应商可加载模块则在单独的树中构建。生成的 GKI 内核和供应商模块必须像它们是同时构建的一样工作。
通常,Linux 社区不赞成在主线内核中保持内核内 ABI 稳定性的概念。面对不同的工具链、配置以及不断发展的 Linux 主线内核,在主线中维护稳定的 KMI 是不可行的。但是,在高度受限的 GKI 环境中,通过以下约束条件,可以维护稳定的 KMI
只能使用单个配置
gki_defconfig
来构建内核。KMI 仅在同一 LTS 和 Android 版本的内核中保持稳定,例如
android13-5.10
、android12-5.10
或android13-5.15
。- 对于
android-mainline
,不维护 KMI 稳定性。
- 对于
仅使用 AOSP 中提供的并为相应分支定义的特定 Clang 工具链来构建内核和模块。
仅监控符号列表中指定的模块已知使用的符号的稳定性,并将这些符号视为 KMI 符号。
- 由此推论,供应商模块必须仅使用 KMI 符号。此约束通过在需要非 KMI 符号时阻止模块加载来强制执行。
在 KMI 分支冻结后,允许进行更改,但不能破坏 KMI。这些更改包括以下内容
- 配置更改
- 内核代码更改
- 工具链更改(包括更新)
使用密封构建流程和 LLVM 工具链
密封构建流程通过使 kernel/manifest
中的 repo
清单完整描述构建环境,从而确保 KMI 的稳定性。例如,android13-5.15
的清单包括构建通用内核映像 (GKI) 内核所需的工具链、构建脚本和所有其他内容。相应的 build.config
配置文件(例如 GKI 构建配置 build.config.gki.aarch64
)确保正确使用包含的工具来生成一致的构建结果。
使用密封构建流程还确保树的 ABI 描述是一致的,无论是由 Google 生成(例如,android13-5.15
的 abi_gki_aarch64.xml
)还是在包含供应商模块的本地树中生成。创建和比较内核模块接口 (KMI) 的 ABI 描述的工具也作为清单描述的仓库的一部分提供。
用于构建 GKI 内核的工具链必须与用于构建供应商模块的工具链完全兼容。从 Android 10 开始,所有 Android 内核都必须使用 LLVM 工具链构建。对于 GKI,用于构建产品内核和供应商模块的 LLVM 工具链必须生成与 AOSP 中的 LLVM 工具链相同的 ABI,并且合作伙伴必须确保 KMI 与 GKI 内核兼容。强烈建议使用提供的构建工具,因为它们可提供最佳兼容性。
下一步是什么?
有关使用密封构建流程和 LLVM 工具链构建内核的说明,请参阅构建内核。
有关如何监控 ABI 并修复问题的说明,请参阅Android 内核 ABI 监控