Android 通用内核

AOSP 通用内核(也称为 Android 通用内核或ACK )是kernel.org内核的下游,包含 Android 社​​区感兴趣的尚未合并到主线或长期支持 (LTS) 内核中的补丁。这些补丁可以包括:

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

android-mainline是 Android 功能的主要开发分支。每当 Linus Torvalds 发布版本或候选版本时,Linux 主线就会合并到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 特定错误修复的最新情况。

ACK KMI 内核分支

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

传统甜点内核分支

创建遗留甜点内核是为了保证新功能的开发不会干扰与 Android 通用内核的合并。这些分支是在相关甜点发布之前创建的,并从 LTS 定期合并,但没有新功能。例如, android-4.9-q从 LTS 4.9.y 分支接收合并。

如果内核版本不是启动内核,则不会创建甜点内核,但与最新平台版本关联的内核对于升级到未来的 Android 平台版本是有效的。例如, android-4.9-qandroid-4.9*甜点分支中的最后一个,因此它受到其原始平台版本 Android 10 的支持和测试。它还受到支持运行 4.9 的设备升级的平台版本的支持和测试。内核:Android 11 和 Android 12。

由于 Android 平台版本的甜点命名方案在 Android 10 中被删除,因此最后的甜点版本原本称为android-4.14-randroid-4.19-r改为称为android-4.14-stableandroid-4.19-stable

从 Android 11 开始,甜点内核被 GKI 内核取代,因此受支持的甜点内核的完整列表在此表中。

Android平台发布核心支持直至
安卓10 android-4.9-q
android-4.14-q
android-4.19-q
2023 年 1 月
安卓11 android-4.14-stable
android-4.19-stable
2024 年 1 月

旧版本内核分支

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

每个月发布 Android 安全公告时,这些内核都会使用公告中引用的与上游内核和 Android 通用内核相关的补丁的向后移植进行更新。他们不会收到 LTS 补丁,因此次要版本号永远不会改变。它们不包含特定于供应商的补丁的向后移植。

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

因此,此表中显示了 14 个版本内核的完整列表,并且不会添加任何版本内核。

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平台发布启动内核特征内核
安卓 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
安卓 13 (2022) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
安卓 12 (2021) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
安卓 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
安卓 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.15是从android-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 中每个分支中的不同颜色所示。如图所示,无论处于哪个阶段,LTS 都会定期合并。

开发阶段

创建后,ACK KMI 分支进入开发阶段(图 2 中的dev ),并开放为下一个 Android 平台版本提供功能贡献。在图 2 中,当 5.10 被声明为新的上游 LTS 内核时,创建了android12-5.10 。内核版本的第二个 ACK​​ KMI 分支可能会提前创建,以允许后续版本的开发。在图 2 中, android13-5.10是在android12-5.10过渡出开发阶段时创建的。

稳定阶段

当 ACK KMI 分支声明功能完成时,它会进入稳定阶段,在图 2 中标记为稳定阶段。合作伙伴功能和错误修复仍然被接受,但启用了 KMI 跟踪以检测影响接口的任何更改。在此阶段,会接受破坏 KMI 的更改,但必须根据需要更新 KMI 定义。有关 KMI 监控的详细信息,请参阅GKI 概述

KMI冷冻相

在将新平台版本推送到 AOSP 之前,ACK KMI 分支会被冻结,并在分支的生命周期内保持冻结状态。这意味着,除非发现严重的安全问题,且无法在不影响稳定 KMI 的情况下缓解,否则不会接受任何破坏 KMI 的更改。为了避免 KMI 损坏,如果 Android 设备不需要修复,则可能会修改或删除从 LTS 合并的一些补丁。

当 ACK KMI 分支被冻结时,只要现有 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 生成号的 KMI 版本字符串进行 git 标记。例如,当android11-5.4被冻结时,它被标记为 KMI 版本字符串5.4-android11-0 ,其中尾随0是 KMI 代号。如果存在安全问题或其他需要接受 KMI 更改补丁的事件,则 KMI 生成编号会增加,并且分支会重新标记。例如,如果此类更改被android11-5.4接受,则该分支将被标记为新的 KMI 版本5.4-android11-1 。可以使用uname命令找到当前的 KMI 生成:

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

平台发布后的数字是 KMI 代数(本例中为 0)。

如果 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 内核。旧版本不支持它们。因此 Android 12 设备不支持android13-5.10内核。

旧内核

旧版甜点内核( *-q*-stable )不向后兼容 Android 平台版本,但支持升级前两个 Android 平台版本的内核。因此,使用基于android-4.19-q内核的 Android 10 启动的设备可以在升级到 Android 2020 时继续使用android-4.19-q内核,或者更新供应商特定代码以支持android-4.19-stable

兼容性矩阵

此表显示了每个 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
安卓 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
安卓 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
安卓 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
安卓 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 特定代码的错误修复。这些修复包括每月Android 安全公告中引用的与 Android 通用内核相关的所有内核安全补丁。

合作伙伴可以确信,通过定期合并 Android 通用内核,他们可以获得所有可能的内核安全补丁。

通用内核测试

除了供应商的下游测试之外,通用内核还使用多个 CI 系统进行测试。

Linux 内核功能测试

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

内核CI测试

每当将新补丁提交到公共内核分支时,就会启动KernelCI构建和启动测试。在各种板上测试并启动了数百个构建配置。可以在此处找到 Android 内核的最新结果。

Android 提交前和提交后测试

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

当新补丁提交到ci.android.com中的 Android 公共内核分支时,Android 提交后测试会在 Android 公共内核分支中的新发布版本上执行。通过在ci.android.com中输入aosp_kernel作为部分分支名称,您可以看到包含可用结果的内核分支列表。例如,可以在此处找到android-mainline的结果。单击特定构建时,您将在Test Results选项卡中找到测试状态。

Android 平台源代码树中通过测试组kernel-presubmit进行测试映射定义的测试将作为 Android 内核分支的 presubmit 运行。例如,在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 天测试

当提交新补丁时, 0day测试会对所有 Android 通用内核分支执行逐个补丁测试。运行各种启动、功能和性能测试。加入公共群组cross-kernel-buildreports

测试矩阵

Android通用内核Android 平台发布测试套件
主要的14 13 12 11 10兰卡夫内核CI预提交帖子提交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 上完成,而不是在 Android 通用内核上完成。强烈鼓励上游开发,并且在开发被接受后,可以根据需要轻松向后移植到特定的 ACK 分支。 Android 内核团队很乐意支持上游工作,以造福 Android 生态系统。

Gerrit提交补丁并遵守这些贡献指南