Android 通用內核

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

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

android-mainline是 Android 功能的主要開發分支。每當 Linus Torvalds 發布一個​​版本或候選版本時,Linux 主線就會合併到android-mainline中。 2019 年之前,Android 通用內核是通過克隆最近宣布的 LTS 內核並添加特定於 Android 的補丁來構建的。這個過程在 2019 年發生了變化,從android-mainline分支出新的 Android 通用內核。這種新模型通過逐步完成相同的結果,避免了轉發端口和測試 Android 補丁的大量工作。 android-mainline經歷了重要的連續測試,此模型從發布之日起確保了高質量的內核。

當上游聲明一個新的 LTS 時,相應的通用內核從android-mainline分支出來。這允許合作夥伴通過從android-mainline合併,在 LTS 版本聲明之前開始一個項目。創建新的公共內核分支後,合作夥伴可以無縫地將合併源更改為新分支。

其他公共內核分支從其關聯的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 開始,Dessert 內核將被 GKI 內核取代,因此受支持的甜點內核的完整列表在此表中。

安卓平台發布核心支持到
安卓 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 月

舊版本內核分支

維護髮佈內核以提供每月Android 安全公告中引用的補丁的反向移植。當有新的 Android 平台版本時,它們是為每個啟動內核創建的。如支持生命週期和安全補丁中所述,當關聯的內核或平台版本被棄用時,它們將被棄用。

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

在 Android 11 及更高版本的平台版本中,合作夥伴必須從 Dessert 或 GKI 內核合併才能應用 Android 安全公告中引用的補丁。不會為 Android 11 或更高版本的平台版本創建任何版本內核。

因此,此表中顯示了 14 個發佈內核的完整列表,不會添加任何內核。

安卓平台發布核心支持到
安卓 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。

安卓平台發布啟動內核特徵核
安卓 10 (2019) android-4.9-q
android-4.14-q
android-4.19-q

android-4.9-q
android-4.14-q
android-4.19-q
安卓 11 (2020) android-4.14-stable
android-4.19-stable
android11-5.4
android-4.14-stable
android-4.19-stable
android11-5.4
安卓 12 (2021) android-4.19-stable
android11-5.4 1
android12-5.4
android12-5.10
android12-5.4
android12-5.10
安卓 13 (2022) android11-5.4 1
android12-5.4 1
android12-5.10 1
android13-5.10
android13-5.15
android13-5.10
android13-5.15

1如果關聯的 BSP 已針對平台版本更新,則可能適用其他限制。更籠統地說,內核的Android Release 編號必須高於或等於目標 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 中, android12-5.10是在 5.10 被聲明為新的上游 LTS 內核時創建的。內核版本的第二個 ACK KMI 分支可能會更早創建,以允許開發後續版本。在圖 2 中, android13-5.10是在android12-5.10退出開發階段時創建的。

穩定階段

當 ACK KMI 分支聲明功能完成時,它進入穩定階段,在圖 2 中標記為stab 。合作夥伴功能和錯誤修復仍然被接受,但啟用 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 平台版本支持和測試的內核版本。

安卓平台發布升級支持的內核啟動時支持的內核
安卓 10 (2019) android-3.18 (停產)
android-4.4-o (停產)
android-4.9-o
android-4.4-p
(停產)
android-4.9-p (停產)
android-4.14-p (停產)
android-4.9-q
android-4.14-q
android-4.19-q
安卓 11 (2020) android-4.4-o (停產)
android-4.4-p (停產)
android-4.9-o (停產)
android-4.9-p (停產)
android-4.9-q
android-4.14-p (停產)
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
安卓 12 (2021) android-4.9-o (停產)
android-4.9-p (停產)
android-4.9-q
android-4.14-p
(停產)
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
安卓 13 (2022) android-4.9-q
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android13-5.10
android13-5.15
android11-5.4
android12-5.4
android12-5.10
android13-5.10
android13-5.15

支持生命週期和安全補丁

支持 Android 通用內核,直到不再支持關聯的 LTS 內核或 Android 平台版本。在支持內核的同時,它會繼續接收來自上游的 LTS 合併和針對 Android 特定代碼的錯誤修復。這些修復包括每月Android 安全公告中引用的與 Android 通用內核相關的所有內核安全補丁。

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

常見內核測試

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

Linaro 內核功能測試

Linaro 內核功能測試 (LKFT)測試在一組物理 arm32 和 arm64 設備上啟動各種測試套件,包括 kselftest、LTP、VTS 和 CTS。最近的測試結果可以在這裡找到。

內核CI測試

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

Android 提交前和提交後測試

提交前測試用於防止將故障引入公共內核。結果目前不公開。

Android 提交後測試在將新補丁提交到公共內核分支時執行。通過輸入aosp_kernel作為部分分支名稱,您會看到包含可用結果的內核分支列表。例如,可以在此處找到android-mainline的結果。

0日測試

0-day測試在提交新補丁時對所有 Android 通用內核分支進行逐個補丁測試。運行各種引導、功能和性能測試。加入公共組cros-kernel-buildreports

測試矩陣

Android通用內核安卓平台發布測試套件
掌握13 12 11 10 9(餡餅) LKFT內核CI預提交發布提交0天
android-mainline
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
android-4.14-q
android-4.9-q

為 Android 通用內核做貢獻

通常,功能開發應該在主線 Linux 上進行,而不是在 Android 通用內核上進行。強烈鼓勵上游開發,在那裡接受開發後,可以很容易地根據需要向後移植到特定的ACK分支。 Android 內核團隊很高興為 Android 生態系統的利益支持上游工作。

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