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.6
和 android14-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 所示。
圖 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 分支生命週期
確認 KMI 分支版本的生命週期如下方圖 2 所示。
圖 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
|
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 專屬程式碼的錯誤修正內容。這些修正包括每月 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
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android-4.19-stable
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
為 Android 常用核心貢獻一己之力
一般來說,功能開發應在主線 Linux 上進行,而非在 Android 通用核心上進行。強烈建議執行上游開發,在接受開發後,就可以根據需要輕鬆向後移植到特定 ACK 分支版本。Android 核心團隊很樂意為 Android 生態系統提供上游支援。