AOSP 通用内核(也称为 Android 通用内核或 ACK)是 kernel.org 内核的下游,包含 Android 社区感兴趣但尚未合并到主线或长期支持 (LTS) 内核中的补丁。这些补丁可能包括
- Android 功能所需的上游功能的反向移植和 Cherry-pick
- 已为 Android 设备准备就绪但仍在上游开发的功能
- 对其他生态系统合作伙伴有用的供应商/OEM 功能
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 6.1.75 发布时,它被合并到 6.1 通用内核 (android14-6.1
) 中。强烈建议合作伙伴更新其内核,以保持与 LTS 和 Android 特定的错误修复同步。
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
|
android12-5.10
android12-5.4
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
1 如果关联的 BSP 已针对平台版本更新,则可能适用其他限制。有关详细信息,请参阅供应商接口对象 - 匹配内核分支。 |
通用内核层次结构
从 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) 开始,每个内核版本只有一个新的 GKI 内核(没有 android15-6.1
内核)。
ACK KMI 分支生命周期
ACK KMI 分支的生命周期如下图 2 所示。
图 2. 6.6 ACK KMI 分支生命周期
为了阐明开发过程和分支生命周期,图 2 重点介绍了 6.6 的 ACK KMI 分支。
每个 ACK KMI 分支都经历三个阶段,图 2 中每个分支的不同颜色表示了这三个阶段。如图所示,无论处于哪个阶段,LTS 都会定期合并。
开发阶段
当 ACK KMI 分支创建时,它将进入开发阶段(在图 2 中标记为 dev),并对外开放,接受为下一个 Android 平台版本贡献的功能。在图 2 中,android15-6.6
是在 6.6 被声明为新的上游 LTS 内核时创建的。
稳定阶段
当 ACK KMI 分支被声明为功能完成时,它将进入稳定阶段(在图 2 中标记为 stable)。仍然接受合作伙伴功能和错误修复,但会启用 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 中,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 生成号更改将非常罕见。
内核之间的兼容性
同一 LTS 系列中内核之间的兼容性要求正在发生变化,从新的 GKI 内核开始。
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
|
android11-5.4
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
支持生命周期和安全补丁
ACK 接收来自上游的 LTS 合并和 Android 特定代码的错误修复。这些修复包括每月Android 安全公告中引用的所有与 ACK 相关的内核安全补丁。
ACK 的支持时间可能比 kernel.org 上相应的上游稳定内核更长。在这种情况下,Google 会提供扩展支持,直到本节中显示的生命周期结束 (EOL) 日期。当内核 EOL 时,Google 将不再支持它们,并且运行它们的设备被认为是易受攻击的。
从内核 6.6 开始,稳定内核的支持生命周期为 4 年。
下表显示了受支持的 ACK 的生命周期
ACK 分支 | 启动 日期 |
支持 生命周期 (年) |
EOL |
---|---|---|---|
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 构建和启动测试。在各种板上测试和启动了数百个构建配置。Android 内核的最新结果可以在此处找到。
Android 预提交和后提交测试
预提交测试用于防止将故障引入 Android 通用内核。测试结果摘要可以在 Android 通用内核 gerrit 中代码更改的“检查”选项卡中找到。
当新补丁提交到 ci.android.com 中的 Android 通用内核分支时,会在 Android 通用内核分支中的新发布版本上执行 Android 后提交测试。通过在 ci.android.com 中输入 aosp_kernel
作为部分分支名称,您将看到包含可用结果的内核分支列表。例如,android-mainline
的结果可以在此处找到。单击特定版本时,您将在 测试结果
选项卡中找到测试状态。
在 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-day 测试
当提交新补丁时,0-day 测试对所有 Android 通用内核分支执行逐个补丁的测试。运行各种启动、功能和性能测试。加入公共群组 cros-kernel-buildreports
测试矩阵
Android 通用内核 | Android 平台版本 | 测试套件 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
主线 | 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 通用内核做贡献
通常,功能开发应在主线 Linux 上完成,而不是在 Android 通用内核上完成。强烈鼓励上游开发,并且在开发被接受后,可以根据需要轻松地将其反向移植到特定的 ACK 分支。Android 内核团队很乐意支持为了 Android 生态系统利益的上游工作。