通用內核映像 (GKI) 項目

Android 通用內核 (ACK)是所有 Android 產品內核的基礎。供應商和設備內核位於 ACK 的下游。供應商通過修改內核源代碼和添加設備驅動程序來增加對 SoC 和外圍設備的支持。這些修改可能非常廣泛,以至於設備上運行的多達 50% 的代碼是樹外代碼,並且不是來自上游 Linux 或來自 AOSP 通用內核。

因此,設備內核由以下部分組成:

  • 上游:來自 kernel.org 的 Linux 內核
  • AOSP:來自 AOSP 通用內核的其他 Android 特定補丁
  • 供應商:供應商提供的 SoC 和外圍設備啟用和優化補丁
  • OEM/設備:其他設備驅動程序和自定義

幾乎每個設備都有一個自定義內核。這是內核碎片。

Android內核層次結構導致碎片化

圖 1. Android 內核層次結構導致碎片化

碎片化的代價

內核碎片化對 Android 社​​區有幾個負面影響。

安全更新是勞動密集型的

Android 安全公告 (ASB)中引用的安全補丁必須反向移植到每個設備內核中。但是,由於內核碎片化,將安全修復程序傳播到現場的 Android 設備的成本非常高。

難以合併長期支持的更新

長期支持 (LTS)版本包括安全修復和其他關鍵錯誤修復。事實證明,與 LTS 版本保持同步是提供安全修復的最有效方式。在 Pixel 設備上,發現 ASB 中報告的 90% 的內核安全問題已經針對保持最新的設備進行了修復。

但是,由於設備內核中的所有自定義修改,很難將 LTS 修復合併到設備內核中。

禁止 Android 平台版本升級

碎片化使得需要內核更改的新 Android 功能難以添加到現場設備中。 Android 框架代碼必須假定支持多達五個內核版本,並且未對新平台版本進行內核更改(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 版本(目前只有 arm64 用於android11-5.4android12-5.4 )。
  • 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 T(AOSP 實驗性)的設備。
  • 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 體系結構。