为供应商模块维护稳定的 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 监控