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