Android 通用内核

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

  • Android 功能所需的向后移植和精选的上游功能
  • 可供 Android 设备使用但仍处于上游开发阶段的功能(例如,Energy Aware Scheduler 任务放置优化)。
  • 对其他生态系统合作伙伴有用的供应商/原始设备制造商 (OEM) 功能(例如,sdcardfs)。

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 4.19.64 发布后,便会合并到 4.19 通用内核(例如 android-4.19-q)中。强烈建议合作伙伴定期执行从通用内核到其产品内核的合并,以便及时获取最新的 LTS 和特定于 Android 的 bug 修复。

ACK KMI 内核分支

GKI 内核具有稳定的内核模块接口。KMI 由内核版本和 Android 平台版本唯一标识,因此分支的命名方式为 <androidRelease>-<kernel version>。例如,Android 11 的 5.4 GKI 内核名为 android11-5.4.。对于 Android 12,还有两个额外的 GKI 内核:android12-5.4android12-5.10

旧版 dessert 内核分支

旧版 dessert 内核用于确保新功能开发不会影响从 AOSP 通用内核合并的机制。这类分支先于关联的 dessert 版本创建,并从 LTS 接收定期合并,但不包含新功能。例如,android-4.9-q 会从 LTS 4.9.y 分支接收合并。

如果内核版本不是启动内核,不会创建 dessert 内核,但与最新平台版本关联的内核可用于升级到未来的 Android 平台版本。例如,android-4.9-q 是最后一个 android-4.9* dessert 分支,因此,该分支受其原始平台版本 Android 10 支持并在该平台版本上进行了测试。此外,该分支还受 Android 11 和 Android 12 平台版本(支持对搭载 4.9 内核的设备进行升级)的支持,并在这两个平台版本上进行了测试。

由于 Android 10 废弃了 Android 平台版本的 dessert 命名方案,因此最后两个 dessert 版本本应被命名为 android-4.14-randroid-4.19-r,但是却命名为 android-4.14-stableandroid-4.19-stable

从 Android 11 开始,dessert 内核被 GKI 内核所取代,因此下表列出的即是受支持 dessert 内核的完整列表。

Android 平台版本 内核 支持截止日期
Android 10 android-4.9-q
android-4.14-q
android-4.19-q
2023 年 1 月
Android 11 android-4.14-stable
android-4.19-stable
2024 年 1 月
2024 年 12 月

旧版发布内核分支

维护发布内核的目的是提供每月 Android 安全公告中引用的补丁程序的向后移植。当新的 Android 平台版本发布时,会为每个启动内核创建发布内核。如支持生命周期和安全补丁程序中所述,当相关的内核或平台版本被废弃时,发布内核也会被废弃。

每月发布 Android 安全公告后,都会通过向后移植安全公告中引用的补丁(与上游内核和 Android 通用内核相关)更新这些内核。这些内核不会收到 LTS 补丁程序,因此其次要版本号永远不变。它们不包含供应商专用补丁的向后移植。

在 Android 11 及更高平台版本中,合作伙伴必须从 dessert 或 GKI 内核进行合并,才能应用 Android 安全公告中引用的补丁。对于 Android 11 或更高平台版本,不会创建发布内核。

因此,下表显示的就是 14 个发布内核的完整列表,不会再增加。

Android 平台版本 内核 支持截止日期
Android 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
2023 年 1 月

功能内核和启动内核

每个 Android 平台版本都支持基于三个 Linux 内核版本中的任何一个启动新设备。如下表所示,Android 11 的启动内核为 android-4.14-stableandroid-4.19-stableandroid11-5.4

由于更新平台版本时通常不需要升级内核,因此缺少平台版本最新功能的内核仍然可以用来启动设备。因此,即使设备上的平台版本已升级到 Android 11,为 Android 10 设计的内核(例如 android-4.19-q)也可以在设备上使用。从 Android 12 开始,为了控制必须支持的稳定版 KMI 的数量,功能内核的数量将少于启动内核的数量。

Android 平台版本 启动内核 功能内核
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.101
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.41
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.19-q
android-4.14-q
android-4.9-q

android-4.19-q
android-4.14-q
android-4.9-q

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

通用内核层次结构

从 android-mainline 分支

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

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

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

请注意,新的 Android 通用内核 android12-5.10 是在 2020 年从 android-mainline 分支出来的。2021 年,在声明下一个 LTS 时,android13-5.15android-mainline 分支出来。

如图 1 所示,每个内核版本都是两个 GKI 内核的基础。例如,两个 v5.4 内核为 android11-5.4android12-5.4,两者都是其各自平台版本的功能内核。5.10 也是如此。android12-5.10 已在声明 LTS 时创建,而 android13-5.10 将在 2021 年春季内核功能完善里程碑阶段从 android12-5.10 分支出来,以允许开发 Android 13 的功能。

ACK KMI 分支生命周期

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

5.10 ACK KMI 分支生命周期

图 2.5.10 ACK KMI 分支生命周期

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

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

开发阶段

创建后,ACK KMI 分支会进入开发阶段(在图 2 中标为 dev),可接受针对下一个 Android 平台版本的功能贡献。在图 2 中,当 5.10 被声明为新的上游 LTS 内核时,创建了 android12-5.10。内核版本的第二个 ACK KMI 分支可能会较早创建,以便开发后续版本。在图 2 中,当 android12-5.10 从开发阶段过渡到其他阶段时,创建了 android13-5.10

稳定阶段

当 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 中,android12-5.10 内核可用于 Android 12 设备和 Android 13 设备。由于 Android 平台版本也与以前的版本兼容,因此 android12-5.4 内核可用于 Android 13 设备的发布或升级。

KMI 代系编号

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

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

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

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

内核之间的兼容性

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

GKI 内核

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

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

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

GKI 内核仅在其初始版本和后续版本中受支持,在比其低的版本中不受支持。因此,android13-5.10 内核在 Android 12 设备上不受支持。

旧版内核

旧版 dessert 内核(*-q*-stable)不在 Android 平台版本之间向后兼容,但来自前两个 Android 平台版本的内核支持升级。因此,在发布时搭载 Android 10(使用基于 android-4.19-q 的内核)的设备,可以在升级到 Android 2020 时继续使用 android-4.19-q 内核,也可以更新供应商特定代码来支持 android-4.19-stable

兼容性列表

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

Android 平台版本 支持用于升级的内核 支持用于发布的内核
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
android-4.14-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
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
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.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

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

Android 通用内核会一直受到支持,直至关联的 LTS 内核或 Android 平台版本不再受支持。当内核受到支持时,它会持续收到来自上游的 LTS 合并以及针对 Android 特定代码的 bug 修复。这些修复包括每月 Android 安全公告中引用的所有与 Android 通用内核相关的内核安全补丁程序。

合作伙伴可以放心,通过定期从 Android 通用内核进行合并,他们将获得所有可能的内核安全补丁程序。

通用内核测试

除了由供应商进行的下游测试外,通用内核还会经过多种 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 平台版本 测试套件
主要电话号码 14 13 12 11 10 LKFT KernelCI 提交前 提交后 0 天
android-mainline
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-4.19-stable
android-4.14-stable

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

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

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