Android 通用內核

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

  • 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分支。這允許合作夥伴通過從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 android-4.14-stableandroid-4.19-stable

甜點內核從 Android 11 開始被 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 及更高版本的平台版本中,合作夥伴必須從甜點或 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 10 設計的內核,例如android-4.19-q ,即使在將平台版本升級到 Android 11 後也可以在設備上使用。從 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 2
android12-5.4
android12-5.10
android12-5.4
android12-5.10
Android T(AOSP 實驗性)(2022 年) 1 android12-5.4 2
android12-5.10 2
android13-5.10
android13-5.15
android13-5.10
android13-5.15

1 Android T(AOSP 實驗性)(2022 年)未提交,僅用於演示新的分支模型在未來將如何發展,具有兩個功能和三個啟動內核。

2內核的Android版本號必須高於或等於目標FCM版本。有關詳細信息,請參閱供應商接口對象 - 匹配內核分支

通用內核層次結構

從 android-mainline 分支

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

從 android-mainline 內核創建通用內核

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

請注意,2020 年新的 Android 通用內核android12-5.10是從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 T 開發功能(AOSP 實驗性)。

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 T(AOSP 實驗)設備。由於Android平台版本也兼容之前的版本, android12-5.4內核可用於Android T(AOSP實驗)設備啟動或升級。

進入凍結階段時,分支會使用包含 KMI 代號的 KMI 版本字符串進行 git 標記。例如,當android11-5.4被凍結時,它被標記為 KMI 版本字符串5.4-android11-0 ,其中尾隨的0是 KMI 代號。如果存在需要接受 KMI 更改補丁的安全問題或其他事件,則增加 KMI 生成編號並重新標記分支。例如,如果這樣的更改被android11-5.4接受,則該分支將被標記為新的 KMI 版本5.4-android11-1 。當前的 KMI 生成可以使用uname命令找到:

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

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

如果 KMI 代發生變化,內核與符合上一代 KMI 的供應商模塊不兼容,因此必須與內核同步重建和更新模塊。預計 KMI 生成更改將非常罕見。

內核之間的兼容性

從新的 GKI 內核開始,同一 LTS 系列中的內核之間的兼容性要求正在發生變化。

GKI 內核

GKI 內核保持與支持該內核版本的所有 Android 平台版本的向後兼容性。此外,Android 平台版本向後兼容以前版本的 GKI 內核。因此,您可以在運行 Android T(AOSP 實驗性)的設備上安全地使用為 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 (EOL)
android-4.9-o
android-4.4-p
(EOL)
android-4.9-p (停產)
android-4.14-p (EOL)
android-4.9-q
android-4.14-q
android-4.19-q
安卓 11 (2020) android-4.4-o (EOL)
android-4.4-p (EOL)
android-4.9-o (停產)
android-4.9-p (停產)
安卓4.9-q
android-4.14-p (EOL)
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 (停產)
安卓4.9-q
android-4.14-p (EOL)
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

支持生命週期和安全補丁

支持 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 testing 在提交新補丁時對所有 Android 通用內核分支進行逐個補丁測試。運行各種啟動、功能和性能測試。加入公共組cros-kernel-buildreports

測試矩陣

Android通用內核Android 平台版本測試套件
掌握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提交補丁並遵守這些貢獻指南