GKI 版本管理架構

本頁說明通用核心映像檔 (GKI) 的版本管理架構。通用核心映像檔 (GKI) 具有名為核心版本的專屬 ID。核心版本包含核心模組介面 (KMI) 版本和子層級。核心版本是指要發布的映像檔,而 KMI 版本則代表建構版本的介面。KMI 版本可支援多個核心版本。一個核心發布版本只會與一個 KMI 版本連結。於 核心模組介面必須變更的極少數事件,KMI 版本編號,以反映 KMI 版本的異動。

條款摘要

下表摘要列出這個網頁使用的重要詞彙, 支援 GKI 最新資訊

名稱 符號 示例 說明
核心發布版本 w.x.y-zzz-k-uffix 5.4.42-android12-0-foo GKI 版本的專屬 ID。這是 uname 傳回的值。
KMI 版本 w.x-zzz-k 5.4-android12-0 說明 GKI 與動態可載入的核心模組 (DLKM) 之間的核心模組介面 (KMI)。
子層 y 42 說明相同 KMI 版本中核心版本的發布順序。

下表列出其他相關術語供您參考。

名稱 符號 示例 說明
w.x.y w.x.y 5.4.42

詳情請參閱「Linux 核心 Makefiles (搜尋「KERNELRELEASE」)。

這份文件直接使用 w.x.y。這也通常稱為三部分版本編號。VINTF 中使用的術語「核心版本」可能會與其他術語混淆,尤其是 w

這個變數在 libkver 中稱為 kernel_version_tuple

這個元組不得因 OTA 或 。

核心分支版本 zzz-w.x android12-5.4 此字詞已用於 常見的核心分支版本類型
版本 w 鍵 5 這份文件並未使用這個術語。這個變數稱為 libkver 中的 version
修補程式等級 x 4 本文件未使用這個術語。這個變數在 libkver 中稱為 patch_level
Android 版本 zzz android12

這是與核心相關聯的 Android (甜點) 版本號碼。

比較 AndroidRelease 欄位時,系統會從字串中擷取數字部分進行比較。

任何更新 (包括 OTA 或主線) 都不得降低 Android 版本號碼。

KMI 產生 k 鍵 0

這個額外號碼可用來處理 事件。如果修正安全性錯誤時需要在相同的時間範圍內變更 KMI 隨著 Android 版本增加,KMI 的產生量也隨之增加。

KMI 的產生編號開頭為 0。

版本管理設計

核心發布版本

定義

對於搭載 GKI 的裝置,其核心版本定義如下:

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

詳情請參閱「從裝置判斷核心版本」。

以下是核心版本的範例。

5.4.42-android12-0-00544-ged21d463f856

說明

核心版本是 GKI 版本的專屬 ID。如果兩個 GKI 二進位檔 相同的核心版本,則必須與位元組相同。

核心版本包含 KMI 版本、子層級和後置字串。適用對象 但本文會略過 KMI 產生後的後置字串。

KMI 版本

定義

KMI 版本的定義如下:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

請注意,子層級 y 並非 KMI 版本。以核心版本中的範例來說,KMI 版本為:

5.4-android12-0

說明

KMI 版本描述了 GKI 與 可動態載入的核心模組 (DLKM)。

如果兩個核心版本具有相同的 KMI 版本,則會實作相同的核心模組介面。與其中一個相容的 DLKM 也與另一個相容。

KMI 版本不得透過任何 OTA 更新降低。

子層

子層級 y 說明中核心版本的發布順序 KMI 版本

如果兩個核心版本具有相同的 KMI 版本,但分別具有 Y1 和 Y2 子層級:

  • 如果 Y1 小於或等於 Y2,執行 Y1 的裝置可能會收到 更新至 Y2
  • 如果 Y1 大於 Y2,搭載 Y1 的裝置就無法更新至 Y2。

也就是說,如果 KMI 版本未變更,則子層級不得降低 。

決定裝置的核心版本

如要查看完整的核心版本,請執行 uname -r,或使用下列程式碼片段執行 uname(2)

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

輸出內容範例如下:

5.4.42-android12-0-00544-ged21d463f856

為方便說明,本文件將在擷取核心資訊時忽略 KMI 產生後的所有內容。更正式來說,uname -r 的輸出結果是 使用以下規則運算式進行剖析 (假設 zzz 開頭一律是「android」):

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

系統會忽略的資訊包括 ci.android.com 版本號碼、基準核心的修補程式數量,以及 Git 版本的 SHA 雜湊。

Libkver

程式庫 libkver 提供 C++ 介面,可剖析核心版本或 KMI 版本字串。如需 libkver 公開的 API 清單,請參閱 packages/modules/Gki/libkver/include/kver

VINTF 檢查

對於 Android 11 以下版本,裝置製造商會在裝置資訊清單中手動指定 KMI 版本的 Android 版本部分。詳情 請參閱 VINTF 核心比對規則

從 Android S 可擷取 KMI 版本的 Android 版本部分 ,並在建構期間插入裝置資訊清單。

由於核心設定需求通常不會變更,因此不需要在相容性矩陣中編碼 k。不過,如果確實需要變更核心設定需求,請務必確保以下事項:

  • 相容性矩陣中的對應需求也已移除。
  • 新增了額外的 VTS 測試,以檢查新的條件條件 。

OTA 中繼資料中的啟動映像檔版本

即使啟動映像檔是透過 OTA 更新, 納入 OTA 酬載格式 payload.bin。OTA 酬載會為每個分區編碼 version 欄位。update_engine 處理 OTA 酬載時,會比較這個欄位,確保分區不會降級。

為避免混淆,OTA 中繼資料表中引導分區的 version 欄位稱為 boot image version

由於 ramdisk 一律是從頭開始建構,因此使用 ramdisk 時間戳記即可充分描述整個開機映像檔。因此不需要 編碼核心版本,除非您複製舊的 到未來新核心二進位檔。

OTA 更新前,OTA 用戶端會檢查開機映像檔版本 方法與任何其他分區相同