本頁介紹通用核心映像 (GKI) 的版本控制方案。通用核心映像 (GKI)有一個稱為核心版本的唯一識別碼。核心版本由核心模組介面(KMI)版本和子層級組成。核心版本特定於正在發布的映像,而 KMI 版本代表建置版本的介面。 KMI 版本可以支援多個核心版本。一個核心版本僅與一個 KMI 版本相關。萬一發生核心模組介面必須變更的情況,KMI 產生會迭代以反映 KMI 版本的變更。
條款摘要
下表總結了本頁和 GKI 更新中使用的重要術語。
姓名 | 象徵 | 例子 | 描述 |
---|---|---|---|
核心發布 | wxy-zzz-k-後綴 | 5.4.42-android12-0-foo | GKI 版本的唯一識別碼。這是uname 回傳的值。 |
KMI版本 | wx-zzz-k | 5.4-android12-0 | 描述 GKI 和動態可載入核心模組 (DLKM) 之間的核心模組介面 (KMI)。 |
次等級 | y | 42 | 描述同一 KMI 版本中核心版本的發布順序。 |
下表列出了其他相關術語以供參考。
姓名 | 象徵 | 例子 | 描述 |
---|---|---|---|
wxy | wxy | 5.4.42 | 有關詳細信息,請參閱Linux 內核 Makefiles (搜尋“KERNELRELEASE”)。 wxy在本文檔中直接使用。這通常也稱為由三個部分組成的版本號。 VINTF(核心版本)中使用的術語可能會導致與其他術語混淆,尤其是w 。 此變數在libkver中稱為kernel_version_tuple 。 該元組不得因任何更新而減少,包括 OTA 或主線。 |
核心分支 | zzz-wx | 安卓12-5.4 | 該術語用於通用內核分支類型。 |
版本 | w | 5 | 本文檔中未使用該術語。該變數在libkver中稱為版本。 |
補丁級別 | X | 4 | 本文檔中未使用該術語。此變數在libkver中稱為patch_level 。 |
安卓發布 | 茲茲 | 安卓12 | 這是與核心關聯的 Android(甜點)版本號。 比較 Android 版本號不得因任何更新(包括 OTA 或主線更新)而減少。 |
KMI生成 | k | 0 | 這是為了應對不太可能發生的事件而添加的額外數字。如果安全性錯誤修復需要在相同 Android 版本中變更 KMI,則會增加 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 版本的一部分。以Kernel release為例,KMI 版本為:
5.4-android12-0
描述
KMI 版本描述了 GKI 和動態可載入核心模組 (DLKM) 之間的核心模組介面 (KMI)。
如果兩個核心版本具有相同的 KMI 版本,則它們實作相同的核心模組介面。與其中一種相容的 DLKM 也與另一種相容。
KMI 版本不得因任何 OTA 更新而降低。
次等級
子級別y
描述同一 KMI 版本中核心版本的發布順序。
對於具有相同 KMI 版本但分別具有子層級 Y1 和 Y2 的兩個核心版本:
- 如果 Y1 小於或等於 Y2,則執行 Y1 的裝置可以接收 Y2 的更新。
- 如果 Y1 大於 Y2,則執行 Y1 的裝置無法更新為 Y2。
也就是說,如果 KMI 版本不變,則任何 OTA 更新都不得降低子等級。
確定設備的核心版本
可以透過使用以下程式碼片段執行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 函式庫提供了一個 C++ 介面來解析核心版本或 KMI 版本字串。有關 libkver 公開的 API 列表,請參閱packages/modules/Gki/libkver/include/kver
。
VINTF 檢查
對於 Android 11 或更低版本,KMI 版本的 Android 發行版部分由裝置製造商在裝置清單中手動指定。詳細資訊請參閱VINTF內核匹配規則。
從 Android S 開始,KMI 版本的 Android 發行版部分可以從核心中提取出來,並在建置時注入到裝置清單中。
由於核心配置要求通常不會改變,因此無需在相容性矩陣中對k
進行編碼。但是,在極少數情況下確實需要更改核心配置要求,請確保滿足以下條件:
- 相容性矩陣中的相應要求已被刪除。
- 新增了額外的 VTS 測試,以檢查 KMI 產生的新要求。
OTA 元資料中的啟動映像版本
即使啟動映像是透過 OTA 更新進行更新的,它也必須封裝在 OTA 有效負載格式中, payload.bin
。 OTA 有效負載對每個分區的version
本欄位進行編碼。當update_engine
處理 OTA 負載時,它會比較該欄位以確保分割區不會降級。
為了避免混淆,OTA 元資料中啟動分割區的version
本欄位稱為boot image version
。
由於 ramdisk 始終是從頭開始建立的,因此使用ramdisk 時間戳足以描述整個啟動映像。無需在啟動映像版本中對核心版本進行編碼,除非您將來要將舊啟動映像拼接到新的核心二進位檔案中。
在 OTA 更新之前,OTA 用戶端會以與任何其他分割區相同的方式檢查啟動映像版本。