GKI 版本管理架構

本頁說明通用核心映像檔 (GKI) 的版本管理架構。A 罩杯 通用核心映像檔 (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)。
子層級 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 欄位時,數值部分會 擷取的片段。

Android 版本編號不得因任何更新而減少,包括 OTA 或主要網路。

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 架構 timestamp 警示已足夠描述整個開機映像檔。因此不需要 編碼核心版本,除非您複製舊的 到未來新核心二進位檔。

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