Android 通用内核

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

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

android-mainline是 Android 功能的主要开发分支。每当 Linus Torvalds 发布一个版本或候选版本时,Linux 主线就会合并到android-mainline中。 2019 年之前,Android 通用内核是通过克隆最近宣布的 LTS 内核并添加特定于 Android 的补丁来构建的。这个过程在 2019 年发生了变化,从android-mainline分支出新的 Android 通用内核。这种新模型通过逐步完成相同的结果,避免了转发端口和测试 Android 补丁的大量工作。 android-mainline经历了重要的连续测试,此模型从发布之日起确保了高质量的内核。

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

其他公共内核分支从其关联的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 开始,Dessert 内核将被 GKI 内核取代,因此受支持的甜点内核的完整列表在此表中。

安卓平台发布核心支持到
安卓 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 及更高版本的平台版本中,合作伙伴必须从 Dessert 或 GKI 内核合并才能应用 Android 安全公告中引用的补丁。不会为 Android 11 或更高版本的平台版本创建任何版本内核。

因此,此表中显示了 14 个发布内核的完整列表,不会添加任何内核。

安卓平台发布核心支持到
安卓 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。

安卓平台发布启动内核特征核
安卓 10 (2019) android-4.9-q
android-4.14-q
android-4.19-q

android-4.9-q
android-4.14-q
android-4.19-q
安卓 11 (2020) android-4.14-stable
android-4.19-stable
android11-5.4
android-4.14-stable
android-4.19-stable
android11-5.4
安卓 12 (2021) android-4.19-stable
android11-5.4 1
android12-5.4
android12-5.10
android12-5.4
android12-5.10
安卓 13 (2022) android11-5.4 1
android12-5.4 1
android12-5.10 1
android13-5.10
android13-5.15
android13-5.10
android13-5.15

1如果关联的 BSP 已针对平台版本更新,则可能适用其他限制。更笼统地说,内核的Android Release 编号必须高于或等于目标 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 中, android12-5.10是在 5.10 被声明为新的上游 LTS 内核时创建的。内核版本的第二个 ACK​​ KMI 分支可能会更早创建,以允许开发后续版本。在图 2 中, android13-5.10是在android12-5.10退出开发阶段时创建的。

稳定阶段

当 ACK KMI 分支声明功能完成时,它进入稳定阶段,在图 2 中标记为stab 。合作伙伴功能和错误修复仍然被接受,但启用 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 平台版本支持和测试的内核版本。

安卓平台发布升级支持的内核启动时支持的内核
安卓 10 (2019) android-3.18 (停产)
android-4.4-o (停产)
android-4.9-o
android-4.4-p
(停产)
android-4.9-p (停产)
android-4.14-p (停产)
android-4.9-q
android-4.14-q
android-4.19-q
安卓 11 (2020) android-4.4-o (停产)
android-4.4-p (停产)
android-4.9-o (停产)
android-4.9-p (停产)
android-4.9-q
android-4.14-p (停产)
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
安卓 12 (2021) android-4.9-o (停产)
android-4.9-p (停产)
android-4.9-q
android-4.14-p
(停产)
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
安卓 13 (2022) android-4.9-q
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android13-5.10
android13-5.15
android11-5.4
android12-5.4
android12-5.10
android13-5.10
android13-5.15

支持生命周期和安全补丁

支持 Android 通用内核,直到不再支持关联的 LTS 内核或 Android 平台版本。在支持内核的同时,它会继续接收来自上游的 LTS 合并和针对 Android 特定代码的错误修复。这些修复包括每月Android 安全公告中引用的与 Android 通用内核相关的所有内核安全补丁。

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

常见内核测试

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

Linaro 内核功能测试

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

内核CI测试

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

Android 提交前和提交后测试

提交前测试用于防止将故障引入公共内核。结果目前不公开。

Android 提交后测试在将新补丁提交到公共内核分支时执行。通过输入aosp_kernel作为部分分支名称,您会看到包含可用结果的内核分支列表。例如,可以在此处找到android-mainline的结果。

0日测试

0-day测试在提交新补丁时对所有 Android 通用内核分支进行逐个补丁测试。运行各种引导、功能和性能测试。加入公共组cros-kernel-buildreports

测试矩阵

Android通用内核安卓平台发布测试套件
掌握13 12 11 10 9(馅饼) LKFT内核CI预提交发布提交0天
android-mainline
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
android-4.14-q
android-4.9-q

为 Android 通用内核做贡献

通常,功能开发应该在主线 Linux 上进行,而不是在 Android 通用内核上进行。强烈鼓励上游开发,在那里接受开发后,可以很容易地根据需要向后移植到特定的ACK分支。 Android 内核团队很高兴为 Android 生态系统的利益支持上游工作。

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