本页介绍了通用内核镜像 (GKI) 项目以及它如何提高 Android 的稳定性和安全性。
历史记录
每个 Android 设备都需要一个生产内核。在 GKI 之前,内核是自定义的,并且基于 Android 通用内核 (ACK),系统芯片 (SoC) 供应商和 OEM 会进行特定于设备的更改。
这种自定义可能会导致多达 50% 的内核代码是树外代码,而不是来自上游 Linux 内核或 ACK。因此,GKI 之前内核的自定义性质导致了严重的内核碎片化。
碎片化的成本
内核碎片化对 Android 社区有若干负面影响。
安全更新非常耗费人力
Android 安全公告 (ASB)中引用的安全补丁必须反向移植到每个设备内核中。但是,由于内核碎片化,将安全修复程序传播到现场的 Android 设备成本过高。
难以合并长期支持更新
长期支持 (LTS) 版本包括安全修复程序和其他关键错误修复。事实证明,与 LTS 版本保持同步是提供安全修复程序最有效的方法。在 Pixel 设备上,我们发现 ASB 中报告的 90% 的内核安全问题已针对保持更新的设备进行了修复。
但是,由于设备内核中的所有自定义修改,很难只将 LTS 修复程序合并到设备内核中。
抑制 Android 平台版本升级
碎片化使得需要内核更改的新 Android 功能难以添加到现场设备中。Android 框架代码必须考虑不同的内核变体,并且不能依赖于内核中实现的新 Android 功能。这减慢了创新速度,并导致代码大小和复杂性增加。
难以将内核更改贡献回上游 Linux
将补丁拉入生产内核的碎片化方式导致从上游 LTS 版本可用到设备中存在长达 18 个月的延迟。上游内核版本和产品之间的这种长时间延迟使得 Android 社区难以将所需的功能和驱动程序馈送到上游内核中。当用户提交改进建议时,代码库已更改,使得很难显示补丁的相关性。
修复碎片化:通用内核镜像
通用内核镜像 (GKI) 项目通过统一核心内核并将 SoC 和板级支持移出核心内核到可加载的供应商模块来解决内核碎片化问题。GKI 还为供应商模块提供稳定的内核模块接口 (KMI),以便可以独立更新模块和内核。GKI 内核的一些特性包括:
- GKI 内核从 ACK 源代码构建。
- GKI 内核是每个架构、每个 LTS 版本的一个单内核二进制文件以及关联的可加载模块。
- GKI 内核使用为关联 ACK 支持的所有 Android 平台版本进行测试。在 GKI 内核版本的生命周期内,没有功能弃用。
- GKI 内核向给定 LTS 中的驱动程序公开稳定的 KMI。
- GKI 内核不包含特定于 SoC 或特定于板级的代码。
有关 GKI 架构的映像,请参阅内核概览。
通用映像
从 Android 12 开始,搭载内核版本 5.10 或更高版本的设备必须搭载 GKI 内核。通用内核镜像 (GKI) 发布版本会定期更新,并定期使用 LTS 和关键错误修复程序进行更新。由于 KMI 保持二进制稳定性,因此您可以安装这些启动映像,而无需更改供应商映像。GKI 项目具有以下目标:
- 用 GKI 内核替换产品内核时,不要引入明显的性能或功耗退化。
- 使合作伙伴能够在没有供应商参与的情况下交付内核安全修复程序和错误修复程序。
- 降低设备升级主要内核版本的成本。
- 通过清晰的升级流程更新内核版本,从而为每个架构维护一个 GKI 内核二进制文件。