GKI是什么? Google為什么要推行GKI?
GKI全稱General Kernel Image。GKI在framework和kernel之間提供了標(biāo)準(zhǔn)接口,使得android OS能夠輕松適配/維護(hù)/兼容不同的設(shè)備和linux kernel。
Google引入GKI的目的是將Framework和Kernel進(jìn)一步的解耦。因?yàn)?,android一直高度依賴linux kernel, linux kernel一更新,android系統(tǒng)就要跟著適配更新。google發(fā)步的安全patch,也會(huì)因?yàn)閗ernel的版本而掣肘。
通用內(nèi)核映像 (GKI) 項(xiàng)目通過(guò)統(tǒng)一核心內(nèi)核并將 SoC 和板級(jí)支持從核心內(nèi)核移至可加載模塊中,解決了內(nèi)核碎片化問(wèn)題。GKI 內(nèi)核為內(nèi)核模塊提供了穩(wěn)定的內(nèi)核模塊接口 (KMI),因此模塊和內(nèi)核可以獨(dú)立進(jìn)行更新。
內(nèi)核碎片化帶來(lái)的問(wèn)題:(市面上的內(nèi)核版本太多,嚴(yán)重阻礙了Android的迭代更新),具體描述如下:
1. 安全更新需要耗費(fèi)大量人力
Android 安全公告 (ASB) 中引用的安全補(bǔ)丁程序必須向后移植(舊的android 系統(tǒng))到每個(gè)設(shè)備內(nèi)核中。但是,由于存在內(nèi)核碎片化問(wèn)題,向正常使用的 Android 設(shè)備傳播安全修復(fù)的代價(jià)非常之高。
2. 很難合并長(zhǎng)期支持的更新
長(zhǎng)期支持 (LTS) 版本包含安全修復(fù)和其他重大問(wèn)題修復(fù)。事實(shí)證明,使用最新的 LTS 版本是提供安全修復(fù)的最有效方式。我們發(fā)現(xiàn),ASB 報(bào)告的內(nèi)核安全問(wèn)題中有 90% 都已在保持最新狀態(tài)的 Pixel 設(shè)備上得到修復(fù)。(簡(jiǎn)單一句話,打補(bǔ)丁不如升級(jí)OS)
不過(guò),由于設(shè)備內(nèi)核中所有的自定義修改,很難僅將 LTS 修復(fù)合并到設(shè)備內(nèi)核中。
3. 妨礙 Android 平臺(tái)進(jìn)行版本升級(jí)
由于碎片化問(wèn)題,很難向正常使用的設(shè)備添加需要更改內(nèi)核的 Android 新功能。Android 框架代碼必須假設(shè)支持的內(nèi)核版本多達(dá) 5 個(gè),并且沒(méi)有針對(duì)新的平臺(tái)版本進(jìn)行任何內(nèi)核更改(Android 10 支持內(nèi)核版本 3.18、4.4、4.9、4.14 和 4.19;在某些情況下,這些版本自 2017 年 Android 8 發(fā)布以來(lái)還未添加新功能)。
4. 很難將內(nèi)核更改貢獻(xiàn)回上游 Linux
對(duì)內(nèi)核進(jìn)行完所有更改后,大多數(shù)旗艦設(shè)備附帶的內(nèi)核版本已經(jīng)至少存在 18 個(gè)月了。例如,kernel.org 于 2017 年 11 月發(fā)布了 4.14 版內(nèi)核,而首批使用 4.14 版內(nèi)核的 Android 手機(jī)于 2019 年春季才發(fā)布(新特性上推linux main branch就太晚了)。
上游內(nèi)核發(fā)布與產(chǎn)品發(fā)布之間的這種長(zhǎng)時(shí)間延遲導(dǎo)致 Android 社區(qū)很難將所需的功能和驅(qū)動(dòng)程序饋送到上游內(nèi)核中,因此解決碎片化問(wèn)題并非易事。
于是就有了GKI項(xiàng)目!?。。?!大家還記得從Android8引入的Trible 機(jī)制嗎?也是Android將framwork和linux kernel解耦的一個(gè)項(xiàng)目。
總而言之,無(wú)論是Android還是Apple OS 都是希望能夠?qū)⒆约旱淖钚翺S推送到盡可能多的設(shè)備上,從而搶占市場(chǎng)分額!
核心特性和目標(biāo)如下:
1. 基于 ACK 來(lái)源構(gòu)建而成。(ACK , Android/Aosp common kernel,Android最上游代碼)
2. 是每個(gè)架構(gòu)和每個(gè) LTS 版本的單內(nèi)核二進(jìn)制文件以及關(guān)聯(lián)的可加載模塊(目前只有適用于 android11-5.4 和 android12-5.4 的 arm64)。
3.已經(jīng)過(guò)關(guān)聯(lián) ACK 支持的所有 Android 平臺(tái)版本的測(cè)試。在 GKI 內(nèi)核版本的生命周期內(nèi)不會(huì)發(fā)生功能棄用。
4. 為給定 LTS 中的驅(qū)動(dòng)程序提供了穩(wěn)定版 KMI。
5. 不包含 SoC 專用代碼或板卡專用代碼。(這個(gè)很好理解,不包含e.g specifc Qualcomm and Board code)。
Key features and goals of Android GKI include:
Stability(穩(wěn)定性): The GKI aims to maintain a stable ABI(Application Binary Interface//應(yīng)用程序二進(jìn)制接口), ensuring that the Android framework can work with different kernel versions without requiring modifications.
Compatibility(兼容性): GKI enables Android to run on a wide range of devices with different kernel configurations, reducing fragmentation and enabling faster updates.
Portability(可移植性): By abstracting Android from the underlying kernel, GKI simplifies the process of porting Android to new devices and adapting it to different kernel versions.
Security(安全性): GKI facilitates the timely delivery of security patches(通常是Google的安全性補(bǔ)?。?and updates by decoupling the Android framework from the kernel, allowing for more efficient patching processes.
GKI可以更改嗎?
通常在開發(fā)中我們不修改,而且其GKI鏡像中的內(nèi)容配置文件,我們也不可以修改,例如:
../kernel_platform/msm-kernel/arch/arm64/configs/gki_defconfig
但是Android的官網(wǎng)也提供了修改的方法,如下說(shuō)明,分別有三個(gè)方面(再次提醒,通常作為ODM是不改的,(Android(ACK)?/ Qualcomm(供應(yīng)商內(nèi)核)?/ ODM(設(shè)備內(nèi)核));
1.?將新功能配置為 GKI 模塊。?
2.?將內(nèi)置內(nèi)核功能配置為 GKI 模塊。
3.?將受保護(hù)的 GKI 模塊轉(zhuǎn)換為不受保護(hù)的模塊。?
以上三個(gè)類型的修改,后面需要的時(shí)候可以進(jìn)一步細(xì)看。有一個(gè)提醒就是,無(wú)論哪個(gè)修改,都必需需要提交更改以供審核。GKI 模塊是 Android 專用內(nèi)核功能,因此無(wú)需在上游提交模塊轉(zhuǎn)換補(bǔ)丁。不過(guò),您必須按照其他準(zhǔn)則提交?Android 通用內(nèi)核 (ACK) 補(bǔ)丁。
什么是ACK,簡(jiǎn)稱AOSP Common Kernel,應(yīng)該是和LKML幾乎一樣的分支內(nèi)容。官網(wǎng)的解釋是
AOSP 通用內(nèi)核(也稱為 Android 通用內(nèi)核或ACK?https://android.googlesource.com/kernel/common/?)是kernel.org內(nèi)核的下游,包含 Android 社??區(qū)感興趣的尚未合并到主線或長(zhǎng)期支持 (LTS) 內(nèi)核中的補(bǔ)丁。
官網(wǎng)對(duì)android-mainlin做簡(jiǎn)單介紹:
android-mainline
是 Android 功能的主要開發(fā)分支。每當(dāng) Linus Torvalds 發(fā)布版本或候選版本時(shí),Linux 主線就會(huì)合并到android-mainline
中。 2019 年之前,Android 通用內(nèi)核是通過(guò)克隆最近聲明的 LTS(Long Time Support) 內(nèi)核并添加 Android 特定補(bǔ)丁來(lái)構(gòu)建的。這個(gè)過(guò)程在 2019 年發(fā)生了變化,從android-mainline
分支出新的 Android 通用內(nèi)核。這種新模型通過(guò)逐步實(shí)現(xiàn)相同的結(jié)果,避免了轉(zhuǎn)發(fā)端口和測(cè)試 Android 補(bǔ)丁的大量工作。?android-mainline
經(jīng)過(guò)重要的持續(xù)測(cè)試,該模型從發(fā)布之日起就確保了高質(zhì)量的內(nèi)核。
當(dāng)上游聲明一個(gè)新的 LTS 時(shí),相應(yīng)的公共內(nèi)核將從android-mainline
分支出來(lái)。這允許合作伙伴在聲明 LTS 版本之前通過(guò)從android-mainline
合并來(lái)開始項(xiàng)目。創(chuàng)建新的通用內(nèi)核分支后,合作伙伴可以無(wú)縫地將合并源更改為新分支。
其他常見的內(nèi)核分支從其關(guān)聯(lián)的LTS 內(nèi)核接收定期合并。這些合并通常在 LTS 版本發(fā)布后立即完成。例如,當(dāng) Linux 4.19.64 發(fā)布時(shí),它被合并到 4.19 通用內(nèi)核中(例如android-4.19-q
?)。強(qiáng)烈鼓勵(lì)合作伙伴(Qualcomm ? MTK?) 定期將通用內(nèi)核(GKI)合并到其產(chǎn)品內(nèi)核中,以及時(shí)了解 LTS 和 Android 特定錯(cuò)誤修復(fù)的最新情況(Qualcomm 會(huì)不定期的去合并Android的通用內(nèi)核補(bǔ)丁)。
所以,想給ACK 提交補(bǔ)丁一定是要經(jīng)過(guò)嚴(yán)格省查的。所以,作為ODM開發(fā)中,通常不會(huì)這么做。對(duì)處理器/個(gè)別電子器件精通的內(nèi)核維護(hù)者通常能夠給linux內(nèi)核提交patch,那也絕對(duì)是行業(yè)大牛;通常ODM開發(fā)內(nèi)核中的驅(qū)動(dòng),我們通常需要定義在自己的config文件中,并且是一=m的形式進(jìn)行編譯。開機(jī)過(guò)程中,需要進(jìn)行動(dòng)態(tài)加載的。這個(gè)是目前GKI2.0的基本要求。
官網(wǎng)對(duì)GKI KMI內(nèi)核分支介紹
GKI 內(nèi)核具有穩(wěn)定的內(nèi)核模塊接口。 KMI (內(nèi)核模塊接口)由內(nèi)核版本和 Android 平臺(tái)版本唯一標(biāo)識(shí),因此分支被命名為<androidRelease>-<kernel version>
?。例如,Android 11 的 5.4 GKI 內(nèi)核名為android11-5.4.
對(duì)于 Android 12,還有兩個(gè)額外的 GKI 內(nèi)核:?android12-5.4
和android12-5.10
?。kernel_platform/msm-kernel/Makefile. 我的高通平臺(tái)是從Android 12 launch的。
也就是說(shuō),Android發(fā)布時(shí)候會(huì)綁定對(duì)應(yīng)的linux kernel版本,目的是提供一個(gè)固定KMI。后續(xù)開發(fā)者可以根據(jù)KMI中的接口,進(jìn)行對(duì)應(yīng)的內(nèi)核開發(fā)。
從 Android 12 開始,功能內(nèi)核將少于啟動(dòng)內(nèi)核,以限制功能內(nèi)核的數(shù)量必須支持的穩(wěn)定 KMI。
簡(jiǎn)單看下KMI的時(shí)間線:
每個(gè) ACK?? KMI 分支都會(huì)循環(huán)經(jīng)歷三個(gè)階段: 例如android12-5.10
開發(fā)階段:
創(chuàng)建后,ACK KMI (我理解這是一個(gè)kernel分支,GKI則是對(duì)應(yīng)的內(nèi)核鏡像)分支進(jìn)入開發(fā)階段(圖 2 中的dev?),并開放為下一個(gè) Android 平臺(tái)版本提供功能貢獻(xiàn)。當(dāng) 5.10 被聲明為新的上游 LTS 內(nèi)核時(shí),創(chuàng)建了android12-5.10
?。內(nèi)核版本的第二個(gè) ACK?? KMI 分支可能會(huì)提前創(chuàng)建,以允許后續(xù)版本的開發(fā)。android13-5.10
是在android12-5.10
過(guò)渡出開發(fā)階段時(shí)創(chuàng)建的。
穩(wěn)定階段:
當(dāng) ACK KMI 分支聲明功能完成時(shí),它會(huì)進(jìn)入穩(wěn)定階段,在圖 2 中標(biāo)記為穩(wěn)定階段。合作伙伴功能和錯(cuò)誤修復(fù)仍然被接受(合作伙伴:e.g Qualcomm),但啟用了 KMI 跟蹤以檢測(cè)影響接口的任何更改。在此階段,會(huì)接受破壞 KMI 的更改,但必須根據(jù)需要更新 KMI 定義。有關(guān) KMI 監(jiān)控的詳細(xì)信息,請(qǐng)參閱GKI 概述。
冷凍階段:
在將新平臺(tái)版本推送到 AOSP 之前,ACK KMI 分支會(huì)被凍結(jié),并在分支的生命周期內(nèi)保持凍結(jié)狀態(tài)。這意味著,除非發(fā)現(xiàn)嚴(yán)重的安全問(wèn)題,且無(wú)法在不影響穩(wěn)定 KMI 的情況下緩解,否則不會(huì)接受任何破壞 KMI 的更改。為了避免 KMI 損壞,如果 Android 設(shè)備不需要修復(fù),則可能會(huì)修改或刪除從 LTS 合并的一些補(bǔ)丁。
GKI1.0的情況,這里就不多解釋,有個(gè)核心的要求是:GKI 1.0 不要求供應(yīng)商模塊可卸載,可以=y。
我們看看GKI2.0的情況下,
GKI 2.0 - GKI 產(chǎn)品
搭載 Android S (2021) 平臺(tái)版本且使用內(nèi)核版本 v5.x(5.x 是 2020 年年底被選為 LTS 的內(nèi)核版本)或更高版本的設(shè)備必須附帶 GKI 內(nèi)核(將提供已簽名的啟動(dòng)映像,并通過(guò) LTS 和重大問(wèn)題修復(fù)定期對(duì)其進(jìn)行更新。由于 KMI 將保持二進(jìn)制穩(wěn)定性,因此無(wú)需對(duì)供應(yīng)商映像進(jìn)行任何更改,即可安裝這些啟動(dòng)映像。
GKI 2.0 的目標(biāo)
1. 不為 GKI 引入明顯的性能或能效降低問(wèn)題。
2. 使 OEM 無(wú)需供應(yīng)商參與即可提供內(nèi)核安全修復(fù)和問(wèn)題修復(fù) (LTS)。(是說(shuō)OEM直接從Google 獲取補(bǔ)丁?而不用從e.g Qualcomm獲?。?/strong>)
3. 降低更新設(shè)備主要內(nèi)核版本(例如,將 v5.x 更新為 v5.y)所需的費(fèi)用。(通常我們的升級(jí)直接從Qualcomm拉代碼)
4. 通過(guò)按照清晰的升級(jí)過(guò)程更新內(nèi)核版本,只為每個(gè)架構(gòu)(例如Qualcomm6490 Armv7 架構(gòu))維護(hù)一個(gè) GKI 內(nèi)核二進(jìn)制文件。
開發(fā)有關(guān):
GKI2.0?下的內(nèi)核開發(fā),首先要注意,需要遵循GKI2.0中要求的ABI接口檢查,目的是,你不能更改KMI中的接口。這個(gè)部分,可以在編譯中進(jìn)行檢查。
詳細(xì)的說(shuō)明如下ABI檢查如下:
ABI 工具使用 KMI 符號(hào)列表來(lái)限制必須監(jiān)控哪些接口以實(shí)現(xiàn)穩(wěn)定性。主符號(hào)列表包含 GKI 內(nèi)核模塊所需的符號(hào)。供應(yīng)商應(yīng)提交并更新其他符號(hào)列表,以確保其依賴的接口保持 ABI 兼容性。
符號(hào)列表包含報(bào)告的特定供應(yīng)商或設(shè)備所需的符號(hào)。工具使用的完整列表是所有 KMI 符號(hào)列表文件的并集。ABI 工具會(huì)確定每個(gè)符號(hào)的詳細(xì)信息,包括函數(shù)簽名和嵌套數(shù)據(jù)結(jié)構(gòu)。
當(dāng) KMI 被凍結(jié)時(shí),不允許對(duì)現(xiàn)有 KMI 接口進(jìn)行任何更改;它們是穩(wěn)定的。
當(dāng)有補(bǔ)丁改動(dòng)了KMI 接口或者數(shù)據(jù)結(jié)構(gòu)(例如include/linux/mmxx.h),應(yīng)用此補(bǔ)丁后再次運(yùn)行 build ABI 時(shí),該工具會(huì)退出,同時(shí)顯示非零錯(cuò)誤代碼并報(bào)告ABI錯(cuò)誤。例如:
Leaf changes summary: 1 artifact changed
Changed leaf types summary: 1 leaf type changed
Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
'struct mm_struct at mm_types.h:372:1' changed:
type size changed from 6848 to 6912 (in bits)
there are data member changes:
[...]
最常見的錯(cuò)誤原因是,驅(qū)動(dòng)程序使用了內(nèi)核中不在符號(hào)列表中的新符號(hào)。目前,我使用的符號(hào)表是:hon4490-android14-vendor/kernel_platform/common/android/abi_gki_aarch64_qcom,當(dāng)出現(xiàn)問(wèn)題時(shí),第一時(shí)間檢查該接口是否在符號(hào)列表中。
最后,新的設(shè)備驅(qū)動(dòng)是需要單獨(dú)配置到kernel configure中,而且必需以=m的形式進(jìn)行,這是GKI2.0的標(biāo)準(zhǔn)要求。
舉個(gè)例子:
例如,需要往內(nèi)核中添加一個(gè)新的設(shè)備驅(qū)動(dòng),Touch的驅(qū)動(dòng)。
1. 修改上一層目錄中的Kconfig/Makefile,添加驅(qū)動(dòng)編譯規(guī)則,例如
obj-$(CONFIG_TOUCHSCREEN_ATMEL_MAXTOUCH_TS) += xxx.o
那么,同樣需要將CONFIG_TOUCHSCREEN_ATMEL_MAXTOUCH_TS編譯選項(xiàng)添加到整個(gè)內(nèi)核的編譯配置中,才能夠在編譯內(nèi)核的時(shí)候進(jìn)行編譯。
這里使用到的就是?configs/vendor/xxx_GKI.config?, 添加CONFIG_TOUCHSCREEN_ATMEL_MAXTOUCH_TS=m的編譯配置。其實(shí)同樣可以添加到configs/vendor/xxx_consolidate.config。這里的區(qū)別是什么?原來(lái),xxx-consolidate_defconfig是編譯userdebug時(shí)候被包含的配置文件。
那關(guān)于GKI2.0的大概歷史就是這樣,相關(guān)的開發(fā)注意事項(xiàng)需要結(jié)合開發(fā)過(guò)程進(jìn)行深化理解。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-848514.html
實(shí)干出真知!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-848514.html
到了這里,關(guān)于我的NPI項(xiàng)目之設(shè)備系統(tǒng)啟動(dòng)(八) -- Android14的GKI項(xiàng)目的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!