本頁說明通用核心映像檔 (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 (甜點) 發布編號 。
比較 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 用戶端會檢查開機映像檔版本 方法與任何其他分區相同