产品内核,也称为设备内核或OEM 内核,是您在设备上附带的内核。在 GKI 之前,产品内核源自一系列上游内核更改。图 1 显示了内核添加如何生成产品内核(OEM/设备内核):
图 1. Pre-GKI 产品内核构建。
- kernel.org 中的Linux 长期支持 (LTS)内核已使用 Android 特定补丁进行了修改,从而产生了Android 通用内核 (ACK) 。
- 供应商修改了 ACK,添加了对其片上系统 (SoC) 的支持。供应商还可能添加性能或功耗优化。生成的内核称为供应商内核。
- 最后,OEM 进一步修改了供应商内核,添加了他们认为必要的附加设备驱动程序和定制。生成的内核称为产品内核。
所有这些修改都可能导致多达 50% 的内核代码是树外代码,而不是来自上游 Linux 内核或 ACK。在 GKI 之前,几乎每个设备都有一个自定义内核,这会导致内核碎片。
碎片化的成本
内核碎片对 Android 社区有一些负面影响。
安全更新需要大量人力
Android 安全公告 (ASB)中引用的安全补丁必须向后移植到每个设备内核中。然而,由于内核碎片,在现场向 Android 设备传播安全修复程序的成本过高。
难以合并长期支持的更新
长期支持 (LTS)版本包括安全修复和其他关键错误修复。事实证明,保持最新的 LTS 版本是提供安全修复的最有效方法。在 Pixel 设备上,我们发现 ASB 中报告的 90% 的内核安全问题已经针对保持最新的设备进行了修复。
然而,由于设备内核中存在所有自定义修改,因此很难将 LTS 修复合并到设备内核中。
禁止Android平台发布升级
碎片使得需要内核更改的新 Android 功能很难添加到现场设备中。 Android 框架代码必须假设支持多达 5 个内核版本,并且新平台版本没有进行任何内核更改(Android 10 支持 3.18、4.4、4.9、4.14 和 4.19 内核,在某些情况下尚未进行更改)自 2017 年 Android 8 以来增加了新功能)。
很难将内核更改贡献回上游 Linux
随着对内核进行的所有更改,大多数旗舰设备附带的内核版本已经至少 18 个月了。例如, kernel.org
于 2017 年 11 月发布了 4.14 内核,第一批使用 4.14 内核的 Android 手机于 2019 年春季发货。
上游内核版本和产品之间的长时间延迟使得 Android 社区很难将所需的功能和驱动程序提供给上游内核。
修复碎片:通用内核映像
通用内核映像 (GKI) 项目通过统一核心内核并将 SoC 和主板支持从核心内核移至可加载的供应商模块来解决内核碎片问题。 GKI还为供应商模块提供了稳定的内核模块接口(KMI),因此模块和内核可以独立更新。 GKI 内核的一些特征是:
- GKI 内核是根据 ACK 源构建的。
- GKI 内核是一个单内核二进制文件,加上每个架构、每个 LTS 版本的相关可加载模块(目前仅适用于
android11-5.4
和android12-5.4
的 arm64 )。 - GKI 内核已经过相关 ACK 支持的所有 Android 平台版本的测试。 GKI 内核版本的生命周期内不会弃用任何功能。
- GKI 内核向给定 LTS 内的驱动程序公开稳定的 KMI。
- GKI 内核不包含特定于 SoC 或特定于主板的代码。
有关 GKI 架构的图像,请参阅内核概述。
GKI 是一项复杂的更改,从 Android 11 平台版本中的 v5.4 内核开始分几个阶段推出。
目前有两个 GKI 阶段:
- GKI 1.0 是在 Android 11 中引入的,适用于具有 5.4 内核的设备。 GKI 1.0 适用于所有搭载 5.4 内核的设备,甚至是搭载 Android 12 或 Android 13 的设备。
- GKI 2.0 是在 Android 12 中针对具有 5.10 内核的设备引入的,并且是所有搭载 5.10 或更高版本内核的设备的新标准。
GKI 1.0
在 GKI 1.0 中,使用内核版本 5.4 启动的设备必须通过 GKI 测试(Android 11 及更高版本的平台版本)。 GKI 1.0 目标包括以下内容:
- 使用 GKI 内核替换产品内核时,避免供应商测试套件 (VTS)或兼容性测试套件 (CTS)中的回归。
- 减轻合作伙伴使用 AOSP 通用内核保持内核最新的负担。
- 在内核中包含核心 Android 更改,以便设备升级并启动新的 Android 版本。
- 不要破坏 Android 用户空间。
- 将特定于硬件的组件从核心内核中分离出来作为可加载模块。
有关 GKI 1.0 文档,请参阅GKI 1.0 部分。
GKI 2.0
在 GKI 2.0 中,使用内核版本 5.10 或更高版本启动的设备必须附带 GKI 内核(从 Android 12 开始)。签名的启动映像可用,并通过 LTS 和关键错误修复定期更新。由于 KMI 保持了二进制稳定性,因此您可以安装这些启动映像,而无需更改供应商映像。 GKI 2.0 目标包括以下内容:
- 使用 GKI 内核替换产品内核时,不要造成显着的性能或功耗下降。
- 使合作伙伴能够在没有供应商参与的情况下提供内核安全修复和错误修复。
- 降低更新设备主要内核版本的成本(例如,从 v5.10 到 2021 LTS 内核)。
- 通过使用清晰的升级流程更新内核版本,维护每个架构的单个 GKI 内核二进制文件。
GKI 2.0 代表 Android 内核的最新状态。 GKI 1.0和以前的内核 (<=4.19)小节之外的内核文档反映了 GKI 2.0 架构。