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 的问题修复。
术语
下面是本文档中用于描述 Android 通用内核政策的一些新术语。
功能内核
包含最新 Android 平台版本功能的增强内核称为功能内核。对于 Android 11,功能内核基于内核版本 4.14.y、4.19.y 和 5.4.y。在过去的平台版本中,功能内核与启动内核相同。但在 Android S 中,将有两个功能内核和三个启动内核。
通用内核映像
从 Android 11 开始,将使用 Android 通用内核创建通用内核映像 (GKI),这些 Aarch64 内核映像可用于运行在供应商模块中实现 SoC 和驱动程序支持的任何设备。如需了解详情,请参阅 GKI 概览。
内核模块接口
GKI 引入了稳定的内核模块接口 (KMI) 的概念,该接口允许从供应商模块异步更新核心内核。当 KMI 被冻结时,将不能进行任何破坏二进制文件与现有供应商模块兼容性的更改。如需详细了解 KMI,请参阅 GKI 概览。
启动内核
指定的启动内核可用于启动搭载特定 Android 平台版本的设备。对于 Android 11,可以使用基于内核版本 4.14.y、4.19.y 和 5.4.y 的内核启动设备。
通用内核分支类型
KMI 内核分支
KMI 内核具有稳定的内核模块接口。KMI 由内核版本和 Android 平台版本唯一标识,因此分支命名为 <androidRelease>-<kernel version>
。例如,Android 11 的 5.4 KMI 内核命名为 android11-5.4.
。对于 Android 12,预计还会另外增加两个 KMI 内核:android12-5.4
和另一个基于新 LTS 内核(预计将于 2020 年底声明)的内核。
旧版 dessert 内核分支
旧版 dessert 内核用于确保新功能开发不会影响从 AOSP 通用内核合并的机制。这类分支先于关联的 dessert 版本创建,并从 LTS 接收定期合并,但不包含新功能。例如,android-4.9-q
会从 LTS 4.9.y 分支接收合并。
如果内核版本不是启动内核,不会创建 dessert 内核,但与最新平台版本关联的内核可用于升级到未来的 Android 平台版本。例如,android-4.4-p
是最后一个 android-4.4*
dessert 分支,因此,该分支受其原始平台版本 Android 9 (Pie) 支持并在该平台版本上进行了测试。此外,该分支还受 Android 10 和 Android 11 平台版本(支持对搭载 4.4 内核的设备进行升级)的支持,并在这两个平台版本上进行了测试。
由于 Android 10 弃用了 Android 平台版本的 dessert 命名方案,因此最后两个 dessert 版本被命名为 android-4.14-stable
和 android-4.19-stable
而非 android-4.14-r
和 android-4.19-r
。
从 Android 11 开始,dessert 内核被 KMI 内核所取代,因此下表列出的即是受支持 dessert 内核的完整列表。
Android 平台版本 | 内核 | 支持截止日期 |
---|---|---|
Android 8.1 (Oreo) | android-4.4-o android-4.9-o
|
2021 年 6 月 |
Android 9 (Pie) | android-4.4-p android-4.9-p android-4.14-p
|
2022 年 1 月 |
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 月 |
旧版发布内核分支
维护发布内核的目的是提供每月 Android 安全公告中引用的补丁程序的向后移植。当新的 Android 平台版本发布时,会为每个启动内核创建发布内核。如支持生命周期和安全补丁程序中所述,当相关的内核或平台版本被弃用时,发布内核也会被弃用。
每月发布 Android 安全公告后,都会通过向后移植安全公告中引用的补丁程序(与上游内核和 Android 通用内核相关)更新这些内核。这些内核不会收到 LTS 补丁程序,因此其次要版本号永远不变。它们不包含供应商特定补丁程序的向后移植。
在 Android 11 及更高平台版本中,合作伙伴必须从 dessert 或 KMI 内核进行合并,才能应用 Android 安全公告中引用的补丁程序。对于 Android 11 或更高平台版本,不会创建发布内核。
因此,下表显示的就是 14 个发布内核的完整列表,不会再增加。
Android 平台版本 | 内核 | 支持截止日期 |
---|---|---|
Android 8.0 (Oreo) | android-3.18-o-release android-4.4-o-release
android-4.9-o-release
|
2021 年 1 月 |
Android 8.1 (Oreo MR1) | android-3.18-o-mr1 android-4.4-o-mr1 android-4.9-o-mr1
|
2021 年 6 月 |
Android 9 (Pie) | android-4.4-p-release android-4.9-p-release
android-4.14-p-release
|
2022 年 1 月 |
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-stable
、android-4.19-stable
和 android11-5.4
。
由于更新平台版本时通常不需要升级内核,因此缺少平台版本最新功能的内核仍然可以用来启动设备。因此,即使设备上的平台版本已升级到 Android 11,为 Android 10 设计的内核(例如 android-4.19-q
)也可以在设备上使用。从 Android S 开始,为了控制必须支持的稳定版 KMI 的数量,功能内核的数量将少于启动内核的数量。
Android 平台版本 | 启动内核 | 功能内核 |
---|---|---|
Android 9 (2018) | android-4.4-p android-4.9-p
android-4.14-p
|
android-4.4-p android-4.9-p
android-4.14-p
|
Android 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
|
Android 11 (2020) | android-4.14-stable android-4.19-stable
android11-5.4
|
android-4.14-stable android-4.19-stable
android11-5.4
|
Android S (2021) | android-4.19-stable android12-5.4
android12-5.x 1 |
android12-5.4 android12-5.x
|
Android T (2022)2 | android12-5.4 android13-5.x
android13-5.y
|
android13-5.x android13-5.y3
|
1 这里的 5.x 是指 2020 年底选为 LTS 的内核版本。 2 Android T (2022) 尚未提交,列于此处只是为了展示新分支模型的两个功能内核和三个启动内核未来如何演变发展。 3 这里的 5.y 是指 2021 年底选为 LTS 的内核版本。 |
通用内核层次结构
从 android-mainline 分支
通用内核层次结构的顶层如图 1 所示。
图 1. 基于 android-mainline 内核创建通用内核
请注意,新的 Android 通用内核 android11-5.4
是在 2019 年从 android-mainline
分支出来的。2020 年,当声明下一个 LTS 时,android12-5.x
(其中 5.x.y 是指选为 LTS 的内核版本)将从 android-mainline
分支。
如图 1 所示,每个内核版本都是两个 KMI 内核的基础。例如,两个 v5.4 内核为 android11-5.4
和 android12-5.4
,两者都是其各自平台版本的功能内核。5.x 也是如此。android12-5.x
将在声明 LTS 时创建,而 android13-5.x
将在春季内核功能完善里程碑阶段从 android12-5.x
分支出来,以允许开发 Android T 的功能。
KMI 分支生命周期
KMI 分支的生命周期如下面的图 2 所示。
图 2. 5.x KMI 分支生命周期
为了阐明开发流程和分支生命周期,图 2 着重说明了 5.x 的 KMI 分支(其中 5.x 是指 2020 年底选择的 TLS 版本的内核版本)。
每个 KMI 分支均会经历图 2 所示的三个阶段(在每个分支中用不同的颜色表示)。如图所示,无论在哪个阶段,都会定期合并 LTS。
开发阶段
创建后,KMI 分支会进入开发阶段(图 2 中的 dev),可接受针对下一个 Android 平台版本的功能贡献。在图 2 中,当 5.x 被声明为新的上游 LTS 内核时,创建了 android12-5.x
。内核版本的第二个 KMI 分支可能会较早创建,以便开发后续版本。在图 2 中,当 android12-5.x
从开发阶段过渡到其他阶段时,创建了 android13-5.x
。
稳定阶段
当 KMI 分支被声明为功能完善后,它会进入稳定阶段,在图 2 中标为 stab。此阶段仍然接受合作伙伴功能和问题修复,但会启用 KMI 跟踪,以检测任何会影响接口的更改。此阶段接受 KMI 破坏性更改,但必须视需要更新 KMI 定义。如需详细了解 KMI 监控,请参阅 GKI 概览。
KMI 冻结阶段
在将新平台版本推送到 AOSP 之前,KMI 分支会被冻结,并在分支的整个生命周期内保持该状态。这意味着,除非发现严重的安全问题,并且在不影响稳定版 KMI 的情况下无法解决该问题,否则不会接受任何 KMI 破坏性更改。为了避免 KMI 遭到破坏,在没有必要对 Android 设备进行修复时,可能会修改或丢弃从 LTS 合并的某些补丁程序。
当 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);
在 KMI 内核的生命周期内,将保持与用户空间的向后兼容性,以便可以将内核安全地用于设备发布时所搭载的 Android 平台版本。针对先前版本的持续测试确保了这种兼容性。因此,在图 2 中,android13-5.4
内核可用于 Android S 设备和 Android T 设备。由于 Android 平台版本也与以前的版本兼容,因此 android12-5.4
内核可用于 Android T 设备的发布或升级。
当分支进入冻结阶段时,系统会使用包含 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 代系一般很少发生变化。
内核之间的兼容性
从新的 KMI 内核开始,同一 LTS 系列的内核之间的兼容性要求将会不断变化。
KMI 内核
新的 KMI 内核将保持与支持该内核版本的所有 Android 平台版本的向后兼容性。因此,专为 Android S 开发的 android12-5.4
内核可在搭载 Android 11 的设备上安全使用。不断在先前版本上对稳定内核进行 VTS 和 CTS 测试确保了这种兼容性。
KMI 很稳定,因此,无需在供应商映像中重建内核模块就可以更新内核。
旧版内核
旧版 dessert 内核(*-o
、*-p
、*-q
、*-stable
)不在 Android 平台版本之间向后兼容,但来自前两个 Android 平台版本的内核支持升级。因此,在发布时搭载 Android 10(使用基于 android-4.19-q
的内核)的设备,可以在升级到 Android 2020 时继续使用 android-4.19-q
内核,也可以更新供应商特定代码来支持 android-4.19-stable
。
兼容性列表
下表显示了每个 Android 平台版本支持和测试的内核版本。
Android 平台版本 | 支持用于升级的内核 | 支持用于发布的内核 |
---|---|---|
Android 9 (2018) | android-3.10
|
android-4.4-p
|
Android 10 (2019) | android-3.18
|
android-4.9-q
|
Android 11 (2020) | android-4.4-o
|
android-4.14-stable
|
Android S (2021) | android-4.9-o
|
android-4.19-stable
|
15.x.y 是指在 2020 年底选为 LTS 的内核版本 |
支持生命周期和安全补丁程序
Android 通用内核将一直受到支持,直至关联的 LTS 内核或 Android 平台版本不再受支持。当内核受到支持时,它会持续收到来自上游的 LTS 合并以及针对 Android 特定代码的问题修复。这些修复包括每月 Android 安全公告中引用的所有与 Android 通用内核相关的内核安全补丁程序。
合作伙伴可以放心,通过定期从 Android 通用内核进行合并,他们将获得所有可能的内核安全补丁程序。
通用内核测试
除了由供应商进行的下游测试外,通用内核还会经过多种 CI 系统的测试。
Linaro 内核功能测试
Linaro 内核功能测试 (LKFT) 测试会在一组 arm32 和 arm64 物理设备上启动各种测试套件,包括 kselftest、LTS、VTS 和 CTS。您可以在这里找到最新的测试结果。
KernelCI 测试
每次向通用内核分支提交新的补丁程序时,都会启动 KernelCI build-and-boot 测试。会在各种板卡上测试并启动数百种 build 配置。您可以在这里找到 Android 内核的最新结果。
Android 提交前和提交后测试
提交前测试用于防止在通用内核中引入故障。目前尚未公开结果。
Android 提交后测试在向通用内核分支提交新的补丁程序后执行。通过输入 aosp_kernel
作为部分分支名称,您会看到具有结果的内核分支列表。例如,可以在这里找到 android-mainline
的结果。
0 天测试
0 天测试会在提交新补丁程序后,在所有 Android 通用内核分支上针对每个补丁程序进行测试。会运行各种启动、功能和性能测试。加入公共组 cros-kernel-buildreports
测试列表
Android 通用内核 | Android 平台版本 | 测试套件 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
Master | 11 | 10 | 9 (Pie) | 8 (Oreo) | LKFT | KernelCI | 提交前 | 提交后 | 0 天 | |
android-mainline
|
✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.4
|
✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
android-4.19-q
|
✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
android-4.14-p |
❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
android-4.9-o
|
❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
为改进 Android 通用内核贡献力量
通常,功能开发应该在 Linux Mainline 内核而非 Android 通用内核上完成。我们非常鼓励您进行上游开发,上游接受您的开发后,您可以根据需要轻松将其向后移植到特定的 ACK 分支。为了促进 Android 生态系统的发展,Android 内核团队很乐意为您的上游开发工作提供支持。