Android常用內核

AOSP 通用核心(也稱為 Android 通用核心或ACK )是kernel.org核心的下游,包含 Android 社​​群感興趣的尚未合併到主線或長期支援 (LTS) 核心中的補丁。這些補丁可以包括:

  • Android 功能所需的上游功能的向後移植和精選
  • 適用於 Android 裝置但仍在上游開發的功能(例如 Energy Aware Scheduler 任務放置最佳化)。
  • 對其他生態系統合作夥伴有用的供應商/OEM 功能(例如 sdcardfs)。

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 4.19.64 發佈時,它被合併到 4.19 通用核心中(例如android-4.19-q )。強烈鼓勵合作夥伴定期將通用核心合併到其產品核心中,以及時了解 LTS 和 Android 特定錯誤修復的最新情況。

ACK KMI 核心分支

GKI 核心具有穩定的核心模組介面。 KMI 由內核版本和 Android 平台版本唯一標識,因此分支被命名為<androidRelease>-<kernel version> 。例如,Android 11 的 5.4 GKI 核心名為android11-5.4.對於 Android 12,還有兩個額外的 GKI 核心: android12-5.4android12-5.10

傳統甜點內核分支

創建遺留甜點核心是為了確保新功能的開發不會幹擾與 Android 通用核心的合併。這些分支是在相關甜點發布之前創建的,並從 LTS 定期合併,但沒有新功能。例如, android-4.9-q從 LTS 4.9.y 分支接收合併。

如果內核版本不是啟動內核,則不會創建甜點內核,但與最新平台版本關聯的內核對於升級到未來的 Android 平台版本是有效的。例如, android-4.9-qandroid-4.9*甜點分支中的最後一個,因此它受到其原始平台版本 Android 10 的支援和測試。它還受到支援運行 4.9 的裝置升級的平台版本的支援和測試。核心:Android 11 和Android 12。

由於 Android 平台版本的甜點命名方案在 Android 10 中被刪除,因此最後的甜點版本原本稱為android-4.14-randroid-4.19-r改為稱為android-4.14-stableandroid-4.19-stable

從 Android 11 開始,甜點內核被 GKI 內核取代,因此受支援的甜點內核的完整列表在此表中。

Android平台發布核心支援直到
安卓10 android-4.9-q
android-4.14-q
android-4.19-q
2023 年 1 月
安卓11 android-4.14-stable
android-4.19-stable
2024 年 1 月
2024 年 12 月

舊版核心分支

維護版本核心是為了提供每月Android 安全公告中引用的修補程式的向後移植。當有新的 Android 平台版本發佈時,它們是為每個啟動核心建立的。當相關的核心或平台版本被棄用時,它們也會被棄用,如支援生命週期和安全性修補程式中所述。

每個月發布 Android 安全公告時,這些核心都會使用公告中引用的與上游核心和 Android 通用核心相關的修補程式的向後移植進行更新。他們不會收到 LTS 補丁,因此次要版本號碼永遠不會改變。它們不包含特定於供應商的補丁的向後移植。

在 Android 11 及更高版本的平台版本中,合作夥伴必須從甜點或 GKI 核心合併才能套用 Android 安全公告中引用的修補程式。不會為 Android 11 或更高版本的平台版本建立版本核心。

因此,此表中顯示了 14 個版本內核的完整列表,並且不會添加任何版本內核。

Android平台發布核心支援直到
安卓10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
2023 年 1 月

功能和啟動內核

每個 Android 平台版本都支援啟動基於三個 Linux 核心版本中任一個的新裝置。如下表所示,Android 11 的啟動核心為android-4.14-stableandroid-4.19-stableandroid11-5.4

由於更新平台版本時通常不需要升級內核,因此缺少平台版本最新功能的內核仍可用於啟動設備。因此,即使在將平台版本升級到 Android 11 後,專為 Android 10 設計的內核(例如android-4.19-q )也可以在設備上使用。從Android 12 開始,功能內核將少於啟動內核,以限制功能內核的數量必須支援的穩定 KMI。

Android平台發布啟動內核特徵內核
安卓 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
安卓 13 (2022) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
安卓 12 (2021) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
安卓 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
安卓 10 (2019) android-4.19-q
android-4.14-q
android-4.9-q

android-4.19-q
android-4.14-q
android-4.9-q

1如果相關 BSP 已針對平台版本進行更新,則可能適用其他限制。更一般而言,核心的Android 版本號碼必須高於或等於目標 FCM 版本。有關詳細信息,請參閱供應商介面物件 - 匹配內核分支

通用內核層次結構

來自 android-mainline 的分支

通用內核層次結構的頂層如圖 1 所示。

從 android-mainline 核心建立通用內核

圖 1.從 android-mainline 內核建立通用內核

請注意,新的 Android 通用核心android12-5.10是在 2020 年從android-mainline分支出來的。2021 年,當聲明下一個 LTS 時, android13-5.15是從android-mainline分支出來的。

如圖 1 所示,每個核心版本都是兩個 GKI 核心的基礎。例如,兩個 v5.4 核心是android11-5.4android12-5.4 ,這兩個核心都是各自平台版本的功能核心。 5.10 也是如此; android12-5.10是在宣布 LTS 時創建的, android13-5.10將於 2021 年春季內核功能完成里程碑時從android12-5.10分支,以允許開發 Android 13 的功能。

ACK KMI 分支生命週期

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

5.10 ACK KMI分支生命週期

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

為了闡明開發流程和分支生命週期,圖 2 重點關注 5.10 的 ACK KMI 分支。

每個 ACK KMI 分支都會循環經歷三個階段,如圖 2 中每個分支中的不同顏色所示。如圖所示,無論處於哪個階段,LTS 都會定期合併。

開發階段

建立後,ACK KMI 分支進入開發階段(圖 2 中的dev ),並開放為下一個 Android 平台版本提供功能貢獻。在圖 2 中,當 5.10 被宣告為新的上游 LTS 核心時,創建了android12-5.10 。核心版本的第二個 ACK KMI 分支可能會提前創建,以允許後續版本的開發。在圖 2 中, android13-5.10是在android12-5.10過渡出開發階段時創建的。

穩定階段

當 ACK KMI 分支聲明功能完成時,它會進入穩定階段,在圖 2 中標記為穩定階段。合作夥伴功能和錯誤修復仍然被接受,但啟用了 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 中, android12-5.10核心可用於 Android 12 裝置和 Android 13 裝置。由於 Android 平台版本也相容於先前的版本,因此android12-5.4核心可用於 Android 13 裝置進行啟動或升級。

進入凍結階段時,分支會使用包含 KMI 生成號的 KMI 版本字串進行 git 標記。例如,當android11-5.4被凍結時,它被標記為 KMI 版本字串5.4-android11-0 ,其中尾隨0是 KMI 代號。如果有安全性問題或其他需要接受 KMI 變更修補程式的事件,則 KMI 產生編號會增加,且分支會重新標記。例如,如果此類變更被android11-5.4接受,則該分支將被標記為新的 KMI 版本5.4-android11-1 。可以使用uname指令找到目前的 KMI 產生:

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

平台發布後的數字是 KMI 代數(本例為 0)。

如果 KMI 版本發生變化,核心與符合上一版本 KMI 的供應商模組不相容,因此必須與核心同步重建和更新模組。 KMI 世代變化預計非常罕見。

核心之間的相容性

從新的 GKI 核心開始,同一 LTS 系列中核心之間的相容性要求正在改變。

GKI 內核

GKI 核心與支援該核心版本的所有 Android 平台版本保持向後相容性。此外,Android 平台版本向後相容於先前版本的 GKI 核心。因此,您可以在運行 Android 13 的裝置上安全地使用為 Android 12 開發的android12-5.4核心。透過對 GKI 核心與所有支援版本的持續 VTS 和 CTS 測試來驗證相容性。

KMI 很穩定,因此無需在供應商映像中重建核心模組即可更新核心。

不同 GKI 核心之間不維護 KMI 相容性。因此,例如,在不重建所有模組的情況下,無法將android12-5.10替換為android13-5.10核心。

僅初始版本和後續版本支援 GKI 核心。舊版本不支援它們。因此 Android 12 裝置不支援android13-5.10核心。

舊內核

舊版甜點核心( *-q*-stable )在 Android 平台版本之間不向後相容,但支援升級來自前兩個 Android 平台版本的核心。因此,使用基於android-4.19-q內核的 Android 10 啟動的裝置可以在升級到 Android 2020 時繼續使用android-4.19-q內核,或更新供應商特定程式碼以支援android-4.19-stable

相容性矩陣

此表顯示了每個 Android 平台版本支援和測試的核心版本。

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
android-4.14-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
安卓 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
安卓 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
安卓 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
安卓 10 (2019) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

支援生命週期和安全補丁

Android 通用核心將受到支持,直到不再支援關聯的 LTS 核心或 Android 平台版本。雖然支援內核,但它會繼續接收來自上游的 LTS 合併以及 Android 特定程式碼的錯誤修復。這些修復包括每月Android 安全性公告中引用的與 Android 通用核心相關的所有核心安全性修補程式。

合作夥伴可以確信,透過定期合併 Android 通用內核,他們可以獲得所有可能的內核安全修補程式。

通用核心測試

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

Linux 核心功能測試

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

核心CI測試

每當將新補丁提交到公共核心分支時,就會啟動KernelCI建置和啟動測試。在各種板上測試並啟動了數百個建置配置。可以在此處找到 Android 核心的最新結果。

Android 提交前和提交後測試

提交前測試用於防止 Android 通用核心中引入故障。測試結果摘要可以在 Android 通用核心 gerrit 中程式碼變更的「檢查」標籤中找到。

當新補丁提交到ci.android.com中的 Android 公共核心分支時,Android 提交後測試會在 Android 公共核心分支中的新發布版本上執行。透過在ci.android.com中輸入aosp_kernel作為部分分支名稱,您可以看到包含可用結果的核心分支清單。例如,可以在此處找到android-mainline的結果。當您按一下特定建置時,您將在Test Results標籤中找到測試狀態。

Android 平台原始碼樹中透過測試組kernel-presubmit進行測試映射定義的測試將作為 Android 核心分支的 presubmit 運行。例如,在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 天測試

當提交新補丁時, 0day測試會對所有 Android 通用核心分支執行逐個補丁測試。運行各種啟動、功能和效能測試。加入公共群組cross-kernel-buildreports

測試矩陣

Android通用核心Android 平台發布測試套件
主要的14 13 12 11 10蘭卡夫核心CI預提交貼文提交0 天
android-mainline
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-4.19-stable
android-4.14-stable

為 Android 通用核心做出貢獻

一般來說,功能開發應該在主線 Linux 上完成,而不是在 Android 通用核心上完成。強烈鼓勵上游開發,並且在開發被接受後,可以根據需要輕鬆向後移植到特定的 ACK 分支。 Android 核心團隊很樂意支援上游工作,以造福 Android 生態系統。

Gerrit提交補丁並遵守這些貢獻指南