GKI 版本控制

本頁介紹通用核心映像 (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(甜點)版本號。

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

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 -runame(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 用戶端會以與任何其他分割區相同的方式檢查啟動映像版本。