Android 常用核心

AOSP 通用核心 (也稱為 Android 通用核心或 ACK) 是 kernel.org 核心的後端,其中包含 Android 社群感興趣的修補程式,但尚未合併至主要或長期支援 (LTS) 核心。這些修補程式可能包括:

  • 回溯及精選 Android 功能所需的上游功能
  • 已可供 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.6android14-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 版本號碼必須大於或等於目標 FCM 版本。詳情請參閱「供應商介面物件 - 比對核心分支」。

常見的核心階層

從 android-mainline 分支

常見核心階層的頂層結構如圖 1 所示。

從 Android-Mainline 核心建立常見核心

圖 1. 從 Android-Mainline 核心建立常見核心

請注意,新的 Android 通用核心 android14-6.1 已於 2022 年從 android-mainline 分支。在 2023 年,當下一個 LTS 宣告時,android15-6.6 會從 android-mainline 分支。

如圖 1 所示,每個核心版本都可以是兩個 GKI 核心的基礎。舉例來說,兩個 v5.15 核心分別是 android13-5.15android14-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 分支生命週期

下圖 2 顯示 ACK KMI 分支的生命週期。

6.6 ACK KMI 分支生命週期

圖 2. 6.6 ACK KMI 分支生命週期

為了說明開發流程和分支生命週期,圖 2 將著重於 6.6 的 ACK KMI 分支。

每個 ACK KMI 分支都會循環執行三個階段,如圖 2 所示,每個分支都以不同顏色標示。如圖所示,無論階段為何,LTS 都會定期合併。

開發階段

建立後,ACK KMI 分支會進入開發階段 (在圖 2 中標示為 dev),並開放為下一個 Android 平台版本提供功能貢獻。在圖 2 中,當 6.6 宣告為新的上游 LTS 核心時,android15-6.6 就會建立。

穩定期

當 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 產生變更的情況應會非常罕見。

核心之間的相容性

從新的 GKI 核心開始,同一個 LTS 系列的核心之間的相容性需求會有所變更。

GKI 核心

GKI 核心會維持與所有支援核心版本的 Android 平台版本回溯相容性。此外,Android 平台版本與先前版本的 GKI 核心回溯相容。因此,您可以在搭載 Android 15 (2024) 的裝置上,安全地使用為 Android 14 (2023) 開發的 android14-6.1 核心。相容性會透過持續的 VTS 和 CTS 測試,針對 GKI 核心和所有支援的版本進行測試。

KMI 是穩定的,因此核心可以更新,而不需要在供應商映像檔中重建核心模組。

不同 GKI 核心之間不會維持 KMI 相容性。舉例來說,如果未重新建構所有模組,就無法將 android14-6.1 核心取代為 android15-6.6 核心。

系統僅支援 GKI 核心的初始版本和後續版本。舊版不支援這些功能。因此,搭載 Android 14 (2023) 的裝置不支援 android15-6.6 核心。

相容性矩陣

下表列出各 Android 平台版本支援及測試的核心版本。

Android 平台版本 升級作業支援的核心 支援的啟動核心
Android 15 (2024 年) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android15-6.6
android14-6.1
Android 14 (2023 年) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022 年) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021 年) android12-5.10
android12-5.4
android11-5.4
android11-5.4
android12-5.4
android12-5.10
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 Kernel Functional Test (LKFT) 測試會在一系列實體 arm32 和 arm64 裝置上啟動各種測試套件,包括 kselftest、LTP、VTS 和 CTS。如要查看近期的測試結果,請前往這個頁面

KernelCI 測試

每當新的修補程式提交至常見的核心分支時,系統就會啟動 KernelCI 建構和啟動測試。我們會在各種電路板上測試及啟動數百個建構設定。如要查看 Android 核心的最新結果,請按這裡

Android 提交前和提交後測試

提交前測試可避免將失敗問題引入 Android 通用核心。您可以在 Android 通用核心 gerrit 的程式碼變更中,查看「檢查」分頁中的測試結果摘要。

當新的修補程式提交至 ci.android.com 的 Android 常見核心分支時,Android 會針對 Android 常見核心分支中的新發布版本執行 Android 提交後測試。只要在 ci.android.com 中輸入 aosp_kernel 做為分支名稱的一部分,即可看到可提供結果的核心分支清單。舉例來說,您可以前往這個頁面查看 android-mainline 的結果。按一下特定版本後,您會在 Test Results 分頁中看到測試狀態。

在 Android 平台來源樹狀結構中,由 test-mapping 搭配測試群組 kernel-presubmit 定義的測試,會以提交前測試的形式執行,以便提交 Android 核心分支。舉例來說,在 test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING 中設定以下項目,即可在 Android 通用核心程式碼簽入時,將 vts_kernel_proc_file_api_test 設為預先提交測試。

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

0 日測試

0 日測試會在新的修補程式提交時,針對所有 Android 通用核心分支執行逐一修補測試。執行各種啟動、功能和效能測試。加入公開群組 cros-kernel-buildreports

測試矩陣

Android 通用核心 Android 平台版本 測試套件
主要 15 14 13 12 11 10 LKFT KernelCI 提交前 提交後 0-day
android-mainline
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4

為 Android 常見核心做出貢獻

一般來說,功能開發應在主線 Linux 上進行,而非在 Android 通用核心上進行。我們強烈建議您在上游進行開發作業,並在開發作業獲得接受後,視需要將其輕鬆回移至特定 ACK 分支。Android 核心團隊很樂意為 Android 生態系統提供上游支援。

將修補程式提交至 Gerrit,並遵循這些貢獻指南