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.6
和 android14-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 所示。
图 1. 基于 android-mainline 内核创建通用内核
请注意,新的 Android 通用内核 android14-6.1
是在 2022 年从 android-mainline
分支出来的。2023 年,在声明下一个 LTS 时,android15-6.6
从 android-mainline
分支出来。
如图 1 所示,每个内核版本都是两个 GKI 内核的基础。例如,两个 v5.15 内核为 android13-5.15
和 android14-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 所示。
图 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
|
android15-6.6
|
Android 14 (2023) |
android14-6.1
|
android14-6.1
|
Android 13 (2022) |
android13-5.15
|
android13-5.15
|
Android 12 (2021) |
android12-5.10
|
android-4.19-stable
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
支持生命周期和安全补丁程序
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
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android-4.19-stable
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
为改进 Android 通用内核贡献力量
通常,功能开发应该在 Linux Mainline 内核而非 Android 通用内核上完成。我们非常鼓励您进行上游开发,上游接受您的开发后,您可以根据需要轻松将其向后移植到特定的 ACK 分支。为了促进 Android 生态系统的发展,Android 内核团队很乐意为您的上游开发工作提供支持。