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