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 14 設計的核心 (例如 android14-6.1) 即使將平台版本升級至 Android 15 後,還是可以在裝置上執行。

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 所示。

從 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 分支生命週期

確認 KMI 分支版本的生命週期如下方圖 2 所示。

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
android-4.19-stable
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
android-4.19-stable
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
android-4.19-stable
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
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020 年) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

支援生命週期和安全性修補程式

ACK 會接收來自上游的 LTS 合併內容,以及 Android 專屬程式碼的錯誤修正內容。這些修正包括每月 Android 安全性公告中與 ACK 相關的所有核心安全性修補程式。

ACK 的支援時間可能比 kernel.org 中對應的上游穩定版核心還要長。在這種情況下,Google 會提供延長版支援服務,直到本節所示的產品生命週期結束 (EOL) 日期為止。當核心已達 EOL 時,Google 就不會再支援這些核心,且執行這些核心的裝置會被視為容易遭到攻擊。

從核心 6.6 開始,穩定核心的支援生命週期為 4 年。

下表列出支援的 ACK 的生命週期:

ACK 分支 推出
日期
支援
生命週期
(年)
產品停產 (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 建構和啟動測試。我們會在各種電路板上測試及啟動數百個建構設定。如要查看 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-4.19-stable

為 Android 常用核心貢獻一己之力

一般來說,功能開發應在主線 Linux 上進行,而非在 Android 通用核心上進行。強烈建議執行上游開發,在接受開發後,就可以根據需要輕鬆向後移植到特定 ACK 分支版本。Android 核心團隊很樂意為 Android 生態系統提供上游支援。

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