Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

Android常見內核

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

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

android-mainline是Android功能的主要開發分支。只要Linus Torvalds發布發行或發行候選,Linux主線就會合併到android-mainline 。在2019年之前,通過克隆最近聲明的LTS內核並添加特定於Android的補丁來構建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的錯誤修復。

條款

這是本文檔中用來描述Android通用內核策略的一些新術語。

功能內核

通過最新的Android平台版本的功能增強的內核稱為功能內核。對於Android 11,功能內核基於內核版本4.14.y,4.19.y和5.4.y。在過去的平台版本中,功能內核與啟動內核相同。但是,在Android S中將有兩個功能內核和三個啟動內核。

通用內核映像

從Android 11開始,Android通用內核用於創建通用內核映像(GKI),它們是Aarch64內核映像,可用於在供應商模塊中實現具有SoC和驅動程序支持的任何設備上運行。有關詳細信息,請參見GKI概述

內核模塊接口

GKI引入了穩定內核模塊接口(KMI)的概念,該內核模塊接口允許從供應商模塊異步更新核心內核。凍結KMI後,將無法進行任何更改來破壞與現有供應商模塊的二進制兼容性。有關KMI的詳細信息,請參見GKI概述

啟動內核

指定的啟動內核可用於啟動具有特定Android平台版本的設備。對於Android 11,可以使用基於內核版本4.14.y,4.19.y和5.4.y的內核啟動設備。

常見的內核分支類型

KMI內核分支

KMI內核具有穩定的內核模塊接口。 KMI由內核版本和Android平台版本唯一標識,因此分支名為<androidRelease>-<kernel version> 。例如,Android 11的5.4 KMI內核名為android11-5.4.對於Android S,還有兩個附加的KMI內核android12-5.4android12-5.10

傳統甜點內核分支

傳統甜點內核的創建是為了確保新功能開發不會干擾與Android通用內核的合併。這些分支是在關聯的甜點發布之前創建的,並且會從LTS接收常規合併,但沒有新功能。例如, android-4.9-q從LTS 4.9.y分支接收合併。

如果內核版本不是啟動內核,則不會創建甜點內核,但是與最新平台版本關聯的內核對於升級到未來的Android平台版本有效。例如, android-4.4-pandroid-4.4*甜點分支的最後一個,因此它的原始平台版本Android 9(Pie)受支持和測試。平台版本也支持並測試了該版本,這些平台版本支持運行4.4內核的設備的升級:Android 10和Android 11。

由於Android平台版本的甜點命名方案已隨Android 10一起刪除,因此最後一個名為android-4.14-randroid-4.19-r甜點版本被稱為android-4.14-stableandroid-4.19-stable

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

Android平台發布核心支持到
Android 8.1(奧利奧) android-4.4-o
android-4.9-o
2021年6月
Android 9(派) android-4.4-p
android-4.9-p
android-4.14-p
2022年1月
Android 10 android-4.9-q
android-4.14-q
android-4.19-q
2023年1月
Android 11 android-4.14-stable
android-4.19-stable
2024年1月

舊版發佈內核分支

維護髮行內核以提供每月Android安全公告中引用的補丁的反向移植。它們是在新的Android平台發行時為每個啟動內核創建的。如支持生命週期和安全補丁所述,不贊成使用相關的內核或平台版本時,將不贊成使用它們。

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

在Android 11和更高版本的發行版中,合作夥伴必須合併甜點或KMI內核才能應用Android安全公告中引用的補丁。不會為Android 11或更高版本的平台創建發行內核。

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

Android平台發布核心支持到
Android 8.0(奧利奧) android-3.18-o-release
android-4.4-o-release
android-4.9-o-release
2021年1月
Android 8.1(奧利奧MR1) android-3.18-o-mr1
android-4.4-o-mr1
android-4.9-o-mr1
2021年6月
Android 9(派) android-4.4-p-release
android-4.9-p-release
android-4.14-p-release
2022年1月
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 S開始,功能內核要少於啟動內核,以限制操作系統的數量。必須支持的穩定KMI。

Android平台發布啟動內核功能內核
Android 9(2018年) android-4.4-p
android-4.9-p
android-4.14-p
android-4.4-p
android-4.9-p
android-4.14-p

Android 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
Android 11(2020年) android-4.14-stable
android-4.19-stable
android11-5.4
android-4.14-stable
android-4.19-stable
android11-5.4
Android S(2021年) android-4.19-stable
android12-5.4
android12-5.10
android12-5.4
android12-5.10
安卓T(2022) 1 android12-5.4
android13-5.10
android13-5.x
android13-5.10
android13-5.x 2

1個Android T(2022)尚未提交,僅顯示其是為了演示新的分支模型在未來的發展過程中將具有兩個功能和三個啟動內核。

2其中5.x是2021年底被選為LTS的內核版本。

通用內核層次結構

從android-mainline分支

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

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

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

請注意,新的Android通用內核android12-5.10在2020年從android-mainline分支出來。在2021年,當下一個LTS聲明時, android13-5.x (其中5.xy是被選擇為LTS的內核版本)將從android-mainline

如圖1所示,每個內核版本都是兩個KMI內核的基礎。例如,兩個v5.4內核分別是android11-5.4android12-5.4 ,它們都是各自平台版本的功能內核。對於5.10也是如此。 android12-5.10當LTS宣布和創建android13-5.10從將分支android12-5.10在春天2021內核功能完整的里程碑,使的功能發展為Android T.

KMI分支生命週期

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

5.10 KMI分支生命週期

圖2. 5.10 KMI分支生命週期

為了闡明開發過程和分支生命週期,圖2重點介紹了5.10的KMI分支。

每個KMI分支在圖2中通過每個分支中的不同顏色指示的三個階段循環。如圖所示,LTS被定期合併而與階段無關。

開發階段

創建後,KMI分支進入開發階段(圖2中的dev ),並為下一個Android平台版本的功能貢獻而開放。在圖2中,當將5.10聲明為新的上游LTS內核時,創建了android12-5.10 。可能會較早創建內核版本的第二個KMI分支,以允許開發後續發行版。在圖2中, android13-5.10創建時android12-5.10轉換出來的開發階段的。

穩定階段

當KMI分支宣布功能已完成時,它將進入穩定階段,在圖2中標記為stab 。仍然接受合作夥伴功能和錯誤修復,但是啟用KMI跟踪可以檢測到影響界面的任何更改。在此階段,可以接受破壞KMI的更改,但是必鬚根據需要更新KMI定義。有關KMI監視的詳細信息,請參見GKI概述

KMI凍結階段

在將新平台發佈到AOSP之前,KMI分支將被凍結,並在該分支的整個生命週期內保持凍結狀態。這意味著除非發現嚴重的安全問題,否則不接受任何破壞KMI的更改,而這些問題在不影響穩定KMI的情況下是無法緩解的。為了避免KMI損壞,如果Android設備不需要此修補程序,則可能會修改或刪除從LTS合併的某些補丁。

凍結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);

在KMI內核的整個生命週期中,都保持了與用戶空間的向後兼容性,以便可以將該內核安全地用於啟動該設備的Android平台發行版。對先前版本進行持續測試可確保保持兼容性。因此在圖2中, android12-5.10內核可用於Android S設備和Android T設備。由於Android平台版本也與以前的版本兼容,因此android12-5.4內核可用於Android T設備以啟動或升級。

進入凍結階段時,該分支將使用包含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生成的更改非常罕見。

內核之間的兼容性

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

KMI內核

新的KMI內核與支持該內核版本的所有Android平台版本保持向後兼容性。因此,專為Android S開發的android12-5.4內核可以在運行Android 11的設備上安全使用。對以前版本的穩定內核進行連續的VTS和CTS測試,可以確保兼容性。

KMI穩定,因此可以更新內核,而無需在供應商映像中重建內核模塊。

舊版內核

舊版甜點內核( *-o*-p*-q*-stable )在各個Android平台版本之間均不向後兼容,但支持先前兩個Android平台版本的內核進行升級。因此,使用基於android-4.19-q內核的Android 10啟動的設備可以在升級到Android 2020時繼續使用android-4.19-q內核,或者更新供應商特定的代碼以支持android-4.19-stable

相容性矩陣

下表顯示了每個Android平台版本支持和測試的內核版本。

Android平台發布支持的內核進行升級支持的啟動內核
Android 9(2018年) android-3.10
android-3.18
android-4.4-o
android-4.9-o
android-4.4-p
android-4.9-p
android-4.14-p
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
Android 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
Android S(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 1

支持生命週期和安全補丁

在不再支持關聯的LTS內核或Android Platform版本之前,將支持Android通用內核。雖然支持內核,但它會繼續從上游接收LTS合併信息,並修復Android特定代碼的錯誤。這些修復程序包括每月與Android通用內核相關的Android安全公告中引用的所有內核安全補丁。

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

通用內核測試

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

Linaro內核功能測試

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

KernelCI測試

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

Android提交前和提交後測試

預提交測試用於防止將故障引入普通內核。目前,結果尚未公開。

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

0天測試

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

測試矩陣

Android通用內核Android平台版本測試套件
11 10 9(派) 8(奧利奧)萊克福特內核CI預先提交發布提交0天
android-mainline
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-4.14-p
android-4.9-p
android-4.4-p
android-4.9-o
android-4.4-o
android-3.18

為Android通用內核做貢獻

通常,功能開發應該在主線Linux上完成,而不是在Android通用內核上完成。強烈建議您進行上游開發,並且在此開發被接受後,可以根據需要輕鬆地將其移植到特定的ACK分支。 Android內核團隊很樂意支持上游工作,以造福Android生態系統。

Gerrit提交補丁,並遵守這些貢獻準則