Android 常用核心

Android 開放原始碼計畫通用核心 (又稱為 Android 常見核心或 ACK) 是 kernel.org 核心的下游,並包含 Android 社群感興趣的修補程式,但尚未合併到主系列或長期支援 (LTS) 核心。這些修補程式可能包括:

  • 向後移植 Android 功能所需的上游功能
  • 可用於 Android 裝置,但開發中上游的功能
  • 對其他生態系統合作夥伴有幫助的供應商/原始設備製造商 (OEM) 功能

android-mainline 是 Android 功能的主要開發分支版本。每當 Linus Torvalds 發布候選版本或候選版時,Linux 主線就會合併至 android-mainline。在 2019 年之前,Android 通用核心的建構方式,是複製最近宣告的 LTS 核心,並新增 Android 專用的修補程式。這項程序已在 2019 年變更,將新的 Android 一般核心從 android-mainline 分支。這個新模型會逐步完成相同的結果,藉此大幅避免轉送通訊埠和測試 Android 修補程式。android-mainline 會經過大量持續測試,此模型可確保從發布當天起都能擁有高品質的核心。

當宣告新的 LTS 時,對應的通用核心會從 android-mainline 分支。如此一來,合作夥伴就能和 android-mainline 合併,在宣告 LTS 版本之前開始專案。建立新的共同核心分支版本後,合作夥伴可以順暢地將合併來源變更為新的分支版本。

其他常見的核心分支版本會收到來自相關聯 LTS 核心的定期合併作業。這些合併作業通常會在 LTS 版本發布後立即完成。舉例來說,在發布 Linux 6.1.75 時,這個 SDK 已合併至 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 (Android 開放原始碼計畫實驗功能),導入 GKI 核心 android15-6.6

功能與啟動核心

在 Android 15 (Android 開放原始碼計畫實驗功能) 之前,其中三個核心中的任一核心可用於裝置啟動作業。從 Android 15 (Android 開放原始碼計畫實驗功能) 開始,兩個最新的核心版本可用於裝置啟動。Android 15 (Android 開放原始碼計畫實驗功能) 的啟動核心為 android15-6.6android14-6.1

由於更新平台版本時不需要核心升級,因此如果核心沒有平台版本的最新功能,仍可用於啟動裝置。因此,針對 Android 14 設計的核心 (例如 android14-6.1),即使將平台版本升級至 Android 15 (Android 開放原始碼計畫實驗功能),使用者還是可以在裝置上使用。

Android 平台版本 啟動核心 功能核心
Android 15 (Android 開放原始碼計畫實驗功能) (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.101
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.41
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 核心建立通用核心

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

如圖 1 所示,每個核心版本都可以是兩個 GKI 核心的基礎。舉例來說,5.15 版的兩個核心是 android13-5.15android14-5.15,這兩個核心都是各自平台版本的功能核心。這也適用於 5.10 版;在 LTS 宣告時會建立 android12-5.10,並在 2021 年春季的核心功能完成里程碑,從 android12-5.10 分支 android13-5.10,以便開發 Android 13 的功能。自 Android 15 (Android 開放原始碼計畫實驗功能) (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 會定期合併。

開發階段

確認 KMI 分支版本建立完成後,就會進入開發階段 (在圖 2 中標示為「dev」),並開放為下一個 Android 平台版本的功能提供內容。在圖 2 中,將 6.6 宣告為新的上游 LTS 核心時,系統會建立 android15-6.6

穩定階段

當 ACK KMI 分支宣告完成時,就會進入穩定階段 (在圖 2 中標為「stable」)。系統仍會接受合作夥伴功能和錯誤修正,但已啟用 KMI 追蹤功能,可偵測任何會影響介面的變更。在這個階段,接受 KMI 破壞性變更,而 KMI 定義會以預先定義的頻率 (通常為每兩週) 更新。如要進一步瞭解 KMI 監控,請參閱 GKI 總覽

KMI 凍結階段

將新的平台版本推送至 Android 開放原始碼計畫之前,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 開放原始碼計畫實驗) 裝置和後續裝置。由於 Android 平台版本也與先前版本相容,因此 android14-6.1 核心可用於 Android 15 (AOSP 實驗) 裝置啟動或升級。

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 (Android 開放原始碼計畫實驗) (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 (Android 開放原始碼計畫實驗功能) (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

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

系統支援 Android 通用核心,直到系統不再支援相關的 LTS 核心或 Android 平台版本為止。當核心受支援時,該核心會持續接收上游的 LTS 合併,以及 Android 特定程式碼的錯誤修正。這些修正項目包括每月 Android 安全性公告中,推薦與 Android 常見核心相關的所有核心安全性修補程式。

合作夥伴只要使用 GKI 核心,就能取得所有可能的核心安全性修補程式。

常見核心測試

常見的核心除了通過供應商的下游測試之外,還使用了數個 CI 系統進行測試。

Linux 核心功能測試

Linux 核心功能測試 (LKFT) 測試會在一組實體 arm32 和 arm64 裝置上啟動各種測試套件,包括 kselftest、LTP、VTS 和 CTS。您可以在這裡查看最近的測試結果。

核心持續整合測試

每當將新的修補程式提交至一般核心分支時,就會啟動 KernelCI 建構與啟動測試。系統會在不同的主機板上測試及啟動數百種建構設定。如要查看 Android 核心的最新結果,請按這裡

Android 預先提交與提交後測試

預先提交測試可避免將錯誤導入 Android 常見核心。如要查看測試結果摘要,請前往 Android 常見核心伺服器中程式碼變更的「檢查」分頁。

當新的修補程式修訂到 ci.android.com 中的 Android 一般分支版本時,系統會在 Android 通用分支版本的新已發布版本中,執行 Android 提交後測試。在 ci.android.com 中輸入 aosp_kernel 做為部分分支版本名稱,就會看到具備可用結果的核心分支版本清單。舉例來說,如要查看 android-mainline 的結果,請按這裡。點選特定版本時,您會在 Test Results 分頁中看到測試狀態。

如果 test-mapping 定義的測試,Android 平台來源樹狀結構中的測試群組 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 核心持續整合 預先提交 提交後 0 天
android-mainline
android5-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 提交修補程式,並遵守這些貢獻指南