Android 内核常见问题解答

本文档包含有关 Android 内核(也称为通用内核映像 [GKI] 内核)的常见问题解答。如果您不熟悉 GKI 和 GKI 内核术语,请参阅内核概览

是否可以在稳定的内核中更改内核模块接口 (KMI) 符号列表?

不影响现有 KMI 的变更可以添加到冻结的内核中。这些变更包括新的已导出函数和符号列表条目。如需了解详情,请参阅管理符号列表

我可以更改稳定内核中的供应商模块使用的结构吗?

无法在包含冻结 KMI 的内核中更改 KMI 接口中的结构。在 KMI 冻结之前,这些结构可以更改。

能否在不破坏二进制文件/源代码兼容性的情况下更改内核?

可以按照 Android 专用补丁中的说明做出不影响 KMI 的更改。

GKI 如何处理内核配置?

如需了解内核配置,请参阅对 gki_defconfig 的更改

对于现有 GKI 模块的覆盖,如何处理相关的上游 bug 修复?

如果您基于 Android 通用内核 (ACK) 中的驱动程序创建供应商模块,您需要确保将来自上游和 ACK 的 bug 修复传播到模块。通常,最好不要修改 GKI 内核和 GKI 模块,以便 Google 始终以一致的方式提供这些更新。

是否有专门针对 GKI 的测试?

供应商测试套件 (VTS) 测试用于验证是否安装了经过认证的 GKI build,以及是否遵循了每个版本的 GKI 要求。例如,我们为启动头文件 v3 提供了 Android 12 VTS 测试,用于验证搭载 5.10 内核的设备中是否存在所需分区。

如何为设备 build 创建项目 defconfig fragment 文件?

除了 gki_defconfig 之外,许多符合 GKI 的设备还会使用一个配置 fragment 来描述所需的配置选项,从而构建供应商模块。例如 cuttlefish 和 DB845c,都是 ACK 代码库的一部分。必须要通过手动检查配置选项来优化 fragment,但来自内核源代码的 scripts/diffconfig 可用于比较 gki_defconfiggki_defconfig+device.fragment 的结果。

是否有什么解决方法可让 modprobe 将 - 与 _ 视作同等来处理?

modmod 手册页面包含以下描述:“modprobe 会智能地在 Linux 内核中添加或移除模块:请注意,为了方便起见,模块名称中的 _ 和 - 没有区别(执行自动下划线转换)。”GKI 团队遵循标准的上游惯例,因此供应商工具或模块命名规范必须将这种合规性考虑在内。

如何启用 debugfs 以供内部使用?

如需详细了解如何启用 debugfs,请参阅下游调试功能带来的干扰

如何在启用特定模块配置的情况下解决 GKI 内核之间不匹配的 ABI?

GKI 内核与模块配置之间的 ABI 不匹配表示有隐式模块配置依赖项;在这种情况下,启用模块会导致在生成的内核映像中构建二进制配置。请与 Android 内核团队 (kernel-team@android.com) 联系,确定向前推进的路径。确定符号列表后,请在问题跟踪器中创建 bug,然后将变更上传到符号列表。