Android 通用内核

AOSP 通用内核(也称为 Android 通用内核或 ACK)是 kernel.org 内核的下游,包含与 Android 社区相关但尚未合并到 Mainline 内核或长期支持 (LTS) 内核的补丁。这些补丁可能包括:

  • Android 功能所需的向后移植和精选的上游功能
  • 可供 Android 设备使用但仍处于上游开发阶段的功能
  • 对其他生态合作伙伴有用的供应商/原始设备制造商 (OEM) 功能

android-mainline 是 Android 功能的主要开发分支。每当 Linus Torvalds 发布内核版本或候选内核版本时,Linux Mainline 内核就会合并到 android-mainline 中。在 2019 年之前,Android 通用内核是通过克隆最新声明的 LTS 内核并添加 Android 专用补丁程序来构建的。2019 年,这一过程变成了从 android-mainline 中分支出新的 Android 通用内核。这种新模型以递增的方式构建内核,从而避免进行大量的向前移植和测试 Android 补丁程序的工作。android-mainline 会经过大量持续不断的测试,因此该模型可保证内核自发布之日起就具有很高的质量。

当上游声明新的 LTS 时,相应的通用内核就会从 android-mainline 分支出来。这样,合作伙伴就可以在上游声明 LTS 版本之前,通过从 android-mainline 进行合并来开始项目。创建新的通用内核分支后,合作伙伴可以将合并来源无缝更改为新的分支。

其他通用内核分支从其关联 LTS 内核接收定期合并。这些合并通常会在 LTS 版本发布后立即执行。例如,Linux 6.1.75 发布后,便合并到了 6.1 通用内核 (android14-6.1) 中。强烈建议合作伙伴更新其内核,以便及时获取最新的 LTS 和特定于 Android 的 bug 修复。

ACK KMI 内核分支

GKI 内核具有稳定的内核模块接口。KMI 仅通过内核版本和 Android 平台版本来标识,因此分支命名为 ANDROID_RELEASE-KERNEL_VERSION。例如,Android 14 的 6.1 GKI 内核名为 android14-6.1。Android 15 中引入的 GKI 内核名为 android15-6.6

功能内核和启动内核

在 Android 15 之前,三个最近期内核中的任意一个都可用于设备发布。从 Android 15 开始,两个最近期内核版本可用于设备发布。Android 15 的启动内核为 android15-6.6android14-6.1

由于更新平台版本时不需要升级内核,因此缺少平台版本最新功能的内核仍然可以用来启动设备。因此,即使设备上的平台版本已升级到 Android 15,为 Android 14 设计的内核(例如 android14-6.1)也可以在设备上使用。

Android 平台版本 启动内核 功能内核
Android 15 (2024) android15-6.6
android14-6.1
android15-6.6
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

1 如果您已针对平台版本更新关联的 BSP,则可能还需要遵守其他限制。一般来说,内核的 Android 版本号必须高于或等于目标 FCM 版本。如需了解详情,请参阅供应商接口对象 - 匹配内核分支

通用内核层次结构

从 android-mainline 分支

通用内核层次结构的顶层如图 1 所示。

基于 android-mainline 内核创建通用内核

图 1. 基于 android-mainline 内核创建通用内核

请注意,新的 Android 通用内核 android14-6.1 是在 2022 年从 android-mainline 分支出来的。2023 年,在声明下一个 LTS 时,android15-6.6android-mainline 分支出来。

如图 1 所示,每个内核版本都是两个 GKI 内核的基础。例如,两个 v5.15 内核为 android13-5.15android14-5.15,两者都是其各自平台版本的功能内核。5.10 也是如此;android12-5.10 已在声明 LTS 时创建,而 android13-5.10 在 2021 年春季内核功能完善里程碑阶段从 android12-5.10 分支出来,以允许开发 Android 13 的功能。从 Android 15 (2024) 开始,每个内核版本只有 1 个新的 GKI 内核(没有 android15-6.1 内核)。

ACK KMI 分支生命周期

ACK KMI 分支的生命周期如下面的图 2 所示。

6.6 ACK KMI 分支生命周期

图 2. 6.6 ACK KMI 分支生命周期

为了阐明开发流程和分支生命周期,图 2 着重说明了 6.6 的 ACK KMI 分支。

每个 ACK KMI 分支均会经历图 2 所示的 3 个阶段(在每个分支中用不同的颜色表示)。如图所示,无论在哪个阶段,都会定期合并 LTS。

开发阶段

创建后,ACK KMI 分支会进入开发阶段(在图 2 中标为 dev),可接受针对下一个 Android 平台版本的功能贡献。在图 2 中,当 6.6 被声明为新的上游 LTS 内核时,创建了 android15-6.6

稳定阶段

当 ACK KMI 分支被声明为功能完善后,它会进入稳定阶段,在图 2 中标为 stab。此阶段仍然接受合作伙伴功能和 bug 修复,但会启用 KMI 跟踪,以检测任何会影响接口的更改。此阶段接受 KMI 破坏性更改,并且 KMI 定义按照预定义的频率进行更新,通常每两周更新一次。如需详细了解 GKI 监控,请参阅 GKI 概览

KMI 冻结阶段

在将新平台版本推送到 AOSP 之前,ACK KMI 分支会被冻结,并在分支的整个生命周期内保持该状态。这意味着,除非发现严重的安全问题,并且在不影响稳定版 KMI 的情况下无法解决该问题,否则不会接受任何 KMI 破坏性更改。为了避免 KMI 遭到破坏,在没有必要对 Android 设备进行修复时,可能会修改或丢弃从 LTS 合并的某些补丁。

当 ACK KMI 分支被冻结时,可以接受 bug 修复和合作伙伴功能,但前提是不会破坏现有 KMI 通用内核。可以使用新的导出符号扩展 KMI,但前提是不会影响构成当前 KMI 的接口。当新接口添加到 KMI 后,它们会立即变为稳定状态,并且不会被将来的更改所破坏。

例如,不允许向 KMI 接口通用内核使用的结构中添加字段,因为这会改变接口定义:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

但可以添加新函数:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

在 GKI 内核的生命周期内,将保持与用户空间的向后兼容性,以便可以将内核安全地用于设备发布时所搭载的 Android 平台版本。针对先前版本的持续测试确保了这种兼容性。因此,在图 2 中,android15-6.6 内核可用于 Android 15 设备及更高版本的设备。由于 Android 平台版本也与以前的版本兼容,因此 android14-6.1 内核可用于 Android 15 设备的发布或升级。

KMI 代系编号

如果在稳定阶段进行 LTS 合并,或者在此之后发生安全问题或其他事件,以致需要接受会更改 KMI 的补丁,系统就会增大 build.config.common 中记录的 KMI 代系编号。可以使用 uname 命令查找当前的 KMI 代系:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

平台版本后面的数字即为 KMI 代系(在本例中为 6)。

如果 KMI 代系发生变化,内核将与符合先前 KMI 代系的供应商模块不兼容,因此,必须重建这些模块并使其与内核同步更新。KMI 冻结后,KMI 代系一般很少发生变化。

内核之间的兼容性

从新的 GKI 内核开始,同一 LTS 系列的内核之间的兼容性要求将会不断变化。

GKI 内核

GKI 内核将保持与支持该内核版本的所有 Android 平台版本的向后兼容性。此外,Android 平台版本也向后兼容先前版本中的 GKI 内核。因此,您可以在搭载 Android 15 (2024) 的设备上安全地使用专为 Android 14 (2023) 开发的 android14-6.1 内核。通过不断在所有支持的版本上对 GKI 内核进行 VTS 和 CTS 测试,这种兼容性已经得到了验证。

KMI 很稳定,因此,无需在供应商映像中重建内核模块就可以更新内核。

不同 GKI 内核之间不会保持 KMI 兼容性。例如,如果不重建所有模块,就无法将 android14-6.1 内核替换为 android15-6.6 内核。

GKI 内核仅在其初始版本和后续版本中受支持,在比其低的版本中不受支持。因此,搭载 Android 14 (2023) 的设备不支持 android15-6.6 内核。

兼容性列表

下表显示了每个 Android 平台版本支持和测试的内核版本。

Android 平台版本 支持用于升级的内核 支持用于发布的内核
Android 15 (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android15-6.6
android14-6.1
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

支持生命周期和安全补丁程序

ACK 会收到来自上游的 LTS 合并以及针对 Android 特定代码的 bug 修复。这些修复包括每月 Android 安全公告中引用的所有与 ACK 相关的内核安全补丁。

ACK 的支持期可能比 kernel.org 上相应的上游稳定内核更长。在这种情况下,Google 可延长支持期,直到此部分中所示的服务终止 (EOL) 日期为止。内核服务终止后,它们将不再受 Google 支持,并且运行这类内核的设备会被视为易受攻击。

从内核 6.6 开始,稳定内核的支持生命周期为 4 年。

此表显示了受支持 ACK 的生命周期:

ACK 分支 推出
日期
Support
lifetime
(years)
EOL
android-4.19-stable 2018-10-22 6 2025-01-01
android11-5.4 2019-11-24 6 2026-01-01
android12-5.4 2019-11-24 6 2026-01-01
android12-5.10 2020-12-13 6 2027-07-01
android13-5.10 2020-12-13 6 2027-07-01
android13-5.15 2021-10-31 6 2028-07-01
android14-5.15 2021-10-31 6 2028-07-01
android14-6.1 2022-12-11 6 2029-07-01
android15-6.6 2023-10-29 4 2028-07-01

通用内核测试

除了由供应商进行的下游测试外,通用内核还会经过多种 CI 系统的测试。

Linux 内核功能测试

Linux 内核功能测试 (LKFT) 会在一组 arm32 和 arm64 物理设备上启动各种测试套件,包括 kselftest、LTP、VTS 和 CTS。您可以在这里找到最新的测试结果。

KernelCI 测试

每次向通用内核分支提交新的补丁程序时,都会启动 KernelCI build-and-boot 测试。会在各种板卡上测试并启动数百种 build 配置。您可以在这里找到 Android 内核的最新结果。

Android 提交前和提交后测试

提交前测试用于防止在 Android 通用内核中引入故障。您可以在 Android 通用内核 Gerrit 中代码更改的“检查”标签页中找到测试结果摘要。

Android 提交后测试会在向 ci.android.com 中 Android 通用内核分支提交新的补丁后,在 Android 通用内核分支上针对新发布的 build 加以执行。通过在 ci.android.com 中输入 aosp_kernel 作为部分分支名称,您会看到具有结果的内核分支列表。例如,您可以在这里找到 android-mainline 的结果。点击特定 build 后,您可以在 Test Results 标签页中找到测试状态。

由 Android 平台源代码树中的 test-mapping 通过测试组 kernel-presubmit 定义的测试,会作为 Android 内核分支的提交前测试运行。例如,test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING 中的以下配置将启用 vts_kernel_proc_file_api_test 作为 Android 通用内核代码检查时的提交前测试。

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

0 天测试

0 天测试会在提交新补丁程序后,在所有 Android 通用内核分支上针对每个补丁程序进行测试。会运行各种启动、功能和性能测试。加入公共组 cros-kernel-buildreports

测试列表

Android 通用内核 Android 平台版本 测试套件
Main 15 14 13 12 11 10 LKFT KernelCI 提交前 提交后 0-day
android-mainline
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable

为改进 Android 通用内核贡献力量

通常,功能开发应该在 Linux Mainline 内核而非 Android 通用内核上完成。我们非常鼓励您进行上游开发,上游接受您的开发后,您可以根据需要轻松将其向后移植到特定的 ACK 分支。为了促进 Android 生态系统的发展,Android 内核团队很乐意为您的上游开发工作提供支持。

将补丁程序提交到 Gerrit 并遵循这些贡献准则