產品內核,也稱為設備內核或OEM 內核,是您在設備上附帶的內核。在 GKI 之前,產品內核源自一系列上游內核更改。圖 1 顯示了內核添加如何生成產品內核(OEM/設備內核):
圖 1. Pre-GKI 產品內核構建。
- kernel.org 中的Linux 長期支持 (LTS)內核已使用 Android 特定補丁進行了修改,從而產生了Android 通用內核 (ACK) 。
- 供應商修改了 ACK,添加了對其片上系統 (SoC) 的支持。供應商還可能添加性能或功耗優化。生成的內核稱為供應商內核。
- 最後,OEM 進一步修改了供應商內核,添加了他們認為必要的附加設備驅動程序和定制。生成的內核稱為產品內核。
所有這些修改都可能導致多達 50% 的內核代碼是樹外代碼,而不是來自上游 Linux 內核或 ACK。在 GKI 之前,幾乎每個設備都有一個自定義內核,這會導致內核碎片。
碎片化的成本
內核碎片對 Android 社區有一些負面影響。
安全更新需要大量人力
Android 安全公告 (ASB)中引用的安全補丁必須向後移植到每個設備內核中。然而,由於內核碎片,在現場向 Android 設備傳播安全修復程序的成本過高。
難以合併長期支持的更新
長期支持 (LTS)版本包括安全修復和其他關鍵錯誤修復。事實證明,保持最新的 LTS 版本是提供安全修復的最有效方法。在 Pixel 設備上,我們發現 ASB 中報告的 90% 的內核安全問題已經針對保持最新的設備進行了修復。
然而,由於設備內核中存在所有自定義修改,因此很難將 LTS 修復合併到設備內核中。
禁止Android平台發布升級
碎片使得需要內核更改的新 Android 功能很難添加到現場設備中。 Android 框架代碼必須假設支持多達 5 個內核版本,並且新平台版本沒有進行任何內核更改(Android 10 支持 3.18、4.4、4.9、4.14 和 4.19 內核,在某些情況下尚未進行更改)自2017 年Android 8 以來增加了新功能)。
很難將內核更改貢獻回上游 Linux
隨著對內核進行的所有更改,大多數旗艦設備附帶的內核版本已經至少 18 個月了。例如, kernel.org
於 2017 年 11 月發布了 4.14 內核,第一批使用 4.14 內核的 Android 手機於 2019 年春季發貨。
上游內核版本和產品之間的長時間延遲使得 Android 社區很難將所需的功能和驅動程序提供給上游內核。
修復碎片:通用內核映像
通用內核映像 (GKI) 項目通過統一核心內核並將 SoC 和主板支持從核心內核移至可加載的供應商模塊來解決內核碎片問題。 GKI還為供應商模塊提供了穩定的內核模塊接口(KMI),因此模塊和內核可以獨立更新。 GKI 內核的一些特徵是:
- GKI 內核是根據 ACK 源構建的。
- GKI 內核是一個單內核二進製文件,加上每個架構、每個 LTS 版本的相關可加載模塊(目前僅適用於
android11-5.4
和android12-5.4
的 arm64 )。 - GKI 內核已經過相關 ACK 支持的所有 Android 平台版本的測試。 GKI 內核版本的生命週期內不會棄用任何功能。
- GKI 內核向給定 LTS 內的驅動程序公開穩定的 KMI。
- GKI 內核不包含特定於 SoC 或特定於主板的代碼。
有關 GKI 架構的圖像,請參閱內核概述。
GKI 是一項複雜的更改,從 Android 11 平台版本中的 v5.4 內核開始分幾個階段推出。
目前有兩個 GKI 階段:
- GKI 1.0 是在 Android 11 中引入的,適用於具有 5.4 內核的設備。 GKI 1.0 適用於所有搭載 5.4 內核的設備,甚至是搭載 Android 12 或 Android 13 的設備。
- GKI 2.0 是在 Android 12 中針對具有 5.10 內核的設備引入的,並且是所有搭載 5.10 或更高版本內核的設備的新標準。
GKI 1.0
在 GKI 1.0 中,使用內核版本 5.4 啟動的設備必須通過 GKI 測試(Android 11 及更高版本的平台版本)。 GKI 1.0 目標包括以下內容:
- 使用 GKI 內核替換產品內核時,避免供應商測試套件 (VTS)或兼容性測試套件 (CTS)中的回歸。
- 減輕合作夥伴使用 AOSP 通用內核保持內核最新的負擔。
- 在內核中包含核心 Android 更改,以便設備升級並啟動新的 Android 版本。
- 不要破壞 Android 用戶空間。
- 將特定於硬件的組件從核心內核中分離出來作為可加載模塊。
有關 GKI 1.0 文檔,請參閱GKI 1.0 部分。
GKI 2.0
在 GKI 2.0 中,使用內核版本 5.10 或更高版本啟動的設備必須附帶 GKI 內核(從 Android 12 開始)。簽名的啟動映像可用,並通過 LTS 和關鍵錯誤修復定期更新。由於 KMI 保持了二進制穩定性,因此您可以安裝這些啟動映像,而無需更改供應商映像。 GKI 2.0 目標包括以下內容:
- 使用 GKI 內核替換產品內核時,不要造成顯著的性能或功耗下降。
- 使合作夥伴能夠在沒有供應商參與的情況下提供內核安全修復和錯誤修復。
- 降低更新設備主要內核版本的成本(例如,從 v5.10 到 2021 LTS 內核)。
- 通過使用清晰的升級流程更新內核版本,維護每個架構的單個 GKI 內核二進製文件。
GKI 2.0 代表 Android 內核的最新狀態。 GKI 1.0和以前的內核 (<=4.19)小節之外的內核文檔反映了 GKI 2.0 架構。
,產品內核,也稱為設備內核或OEM 內核,是您在設備上附帶的內核。在 GKI 之前,產品內核源自一系列上游內核更改。圖 1 顯示了內核添加如何生成產品內核(OEM/設備內核):
圖 1. Pre-GKI 產品內核構建。
- kernel.org 中的Linux 長期支持 (LTS)內核已使用 Android 特定補丁進行了修改,從而產生了Android 通用內核 (ACK) 。
- 供應商修改了 ACK,添加了對其片上系統 (SoC) 的支持。供應商還可能添加性能或功耗優化。生成的內核稱為供應商內核。
- 最後,OEM 進一步修改了供應商內核,添加了他們認為必要的附加設備驅動程序和定制。生成的內核稱為產品內核。
所有這些修改都可能導致多達 50% 的內核代碼是樹外代碼,而不是來自上游 Linux 內核或 ACK。在 GKI 之前,幾乎每個設備都有一個自定義內核,這會導致內核碎片。
碎片化的成本
內核碎片對 Android 社區有一些負面影響。
安全更新需要大量人力
Android 安全公告 (ASB)中引用的安全補丁必須向後移植到每個設備內核中。然而,由於內核碎片,在現場向 Android 設備傳播安全修復程序的成本過高。
難以合併長期支持的更新
長期支持 (LTS)版本包括安全修復和其他關鍵錯誤修復。事實證明,保持最新的 LTS 版本是提供安全修復的最有效方法。在 Pixel 設備上,我們發現 ASB 中報告的 90% 的內核安全問題已經針對保持最新的設備進行了修復。
然而,由於設備內核中存在所有自定義修改,因此很難將 LTS 修復合併到設備內核中。
禁止Android平台發布升級
碎片使得需要內核更改的新 Android 功能很難添加到現場設備中。 Android 框架代碼必須假設支持多達 5 個內核版本,並且新平台版本沒有進行任何內核更改(Android 10 支持 3.18、4.4、4.9、4.14 和 4.19 內核,在某些情況下尚未進行更改)自2017 年Android 8 以來增加了新功能)。
很難將內核更改貢獻回上游 Linux
隨著對內核進行的所有更改,大多數旗艦設備附帶的內核版本已經至少 18 個月了。例如, kernel.org
於 2017 年 11 月發布了 4.14 內核,第一批使用 4.14 內核的 Android 手機於 2019 年春季發貨。
上游內核版本和產品之間的長時間延遲使得 Android 社區很難將所需的功能和驅動程序提供給上游內核。
修復碎片:通用內核映像
通用內核映像 (GKI) 項目通過統一核心內核並將 SoC 和主板支持從核心內核移至可加載的供應商模塊來解決內核碎片問題。 GKI還為供應商模塊提供了穩定的內核模塊接口(KMI),因此模塊和內核可以獨立更新。 GKI 內核的一些特徵是:
- GKI 內核是根據 ACK 源構建的。
- GKI 內核是一個單內核二進製文件,加上每個架構、每個 LTS 版本的相關可加載模塊(目前僅適用於
android11-5.4
和android12-5.4
的 arm64 )。 - GKI 內核已經過相關 ACK 支持的所有 Android 平台版本的測試。 GKI 內核版本的生命週期內不會棄用任何功能。
- GKI 內核向給定 LTS 內的驅動程序公開穩定的 KMI。
- GKI 內核不包含特定於 SoC 或特定於主板的代碼。
有關 GKI 架構的圖像,請參閱內核概述。
GKI 是一項複雜的更改,從 Android 11 平台版本中的 v5.4 內核開始分幾個階段推出。
目前有兩個 GKI 階段:
- GKI 1.0 是在 Android 11 中引入的,適用於具有 5.4 內核的設備。 GKI 1.0 適用於所有搭載 5.4 內核的設備,甚至是搭載 Android 12 或 Android 13 的設備。
- GKI 2.0 是在 Android 12 中針對具有 5.10 內核的設備引入的,並且是所有搭載 5.10 或更高版本內核的設備的新標準。
GKI 1.0
在 GKI 1.0 中,使用內核版本 5.4 啟動的設備必須通過 GKI 測試(Android 11 及更高版本的平台版本)。 GKI 1.0 目標包括以下內容:
- 使用 GKI 內核替換產品內核時,避免供應商測試套件 (VTS)或兼容性測試套件 (CTS)中的回歸。
- 減輕合作夥伴使用 AOSP 通用內核保持內核最新的負擔。
- 在內核中包含核心 Android 更改,以便設備升級並啟動新的 Android 版本。
- 不要破壞 Android 用戶空間。
- 將特定於硬件的組件從核心內核中分離出來作為可加載模塊。
有關 GKI 1.0 文檔,請參閱GKI 1.0 部分。
GKI 2.0
在 GKI 2.0 中,使用內核版本 5.10 或更高版本啟動的設備必須附帶 GKI 內核(從 Android 12 開始)。簽名的啟動映像可用,並通過 LTS 和關鍵錯誤修復定期更新。由於 KMI 保持了二進制穩定性,因此您可以安裝這些啟動映像,而無需更改供應商映像。 GKI 2.0 目標包括以下內容:
- 使用 GKI 內核替換產品內核時,不要造成顯著的性能或功耗下降。
- 使合作夥伴能夠在沒有供應商參與的情況下提供內核安全修復和錯誤修復。
- 降低更新設備主要內核版本的成本(例如,從 v5.10 到 2021 LTS 內核)。
- 通過使用清晰的升級流程更新內核版本,維護每個架構的單個 GKI 內核二進製文件。
GKI 2.0 代表 Android 內核的最新狀態。 GKI 1.0和以前的內核 (<=4.19)小節之外的內核文檔反映了 GKI 2.0 架構。