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.4
和android12-5.10
。
傳統甜點內核分支
傳統甜點內核的創建是為了確保新功能開發不會干擾與Android通用內核的合併。這些分支是在關聯的甜點發布之前創建的,並且會從LTS接收常規合併,但沒有新功能。例如, android-4.9-q
從LTS 4.9.y分支接收合併。
如果內核版本不是啟動內核,則不會創建甜點內核,但是與最新平台版本關聯的內核對於升級到未來的Android平台版本有效。例如, android-4.4-p
是android-4.4*
甜點分支的最後一個,因此它的原始平台版本Android 9(Pie)受支持和測試。平台版本也支持並測試了該版本,這些平台版本支持運行4.4內核的設備的升級:Android 10和Android 11。
由於Android平台版本的甜點命名方案已隨Android 10一起刪除,因此最後一個名為android-4.14-r
和android-4.19-r
甜點版本被稱為android-4.14-stable
和android-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-stable
, android-4.19-stable
和android11-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所示。
圖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.4
和android12-5.4
,它們都是各自平台版本的功能內核。對於5.10也是如此。 android12-5.10
當LTS宣布和創建android13-5.10
從將分支android12-5.10
在春天2021內核功能完整的里程碑,使的功能發展為Android T.
KMI分支生命週期
KMI分支的生命週期如下圖2所示。
圖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-4.4-p |
Android 10(2019年) | android-3.18 | android-4.9-q |
Android 11(2020年) | android-4.4-o | android-4.14-stable |
Android S(2021年) | android-4.9-o | android-4.19-stable |
支持生命週期和安全補丁
在不再支持關聯的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-q | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
android-4.14-p | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
android-4.9-o | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
為Android通用內核做貢獻
通常,功能開發應該在主線Linux上完成,而不是在Android通用內核上完成。強烈建議您進行上游開發,並且在此開發被接受後,可以根據需要輕鬆地將其移植到特定的ACK分支。 Android內核團隊很樂意支持上游工作,以造福Android生態系統。