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)。
子級42描述同一 KMI 版本中內核版本的發布順序。

下表列出了其他相關術語作為參考。

姓名象徵例子描述
西西西西5.4.42

有關詳細信息,請參閱Linux內核Makefile文件(搜索“KERNELRELEASE”)。

WXY為直接本文檔中使用。這通常也被稱為三部分組成的版本號。在VINTF,內核版本中使用的術語,可能會引起混淆與其他方面,特別是W上

這個變量被稱為在kernel_version_tuple libkver

此元組不得因任何更新而減少,包括 OTA 或主線。

內核分支zzz-wx android12-5.4這個術語在使用通用內核分支類型
版本5本文檔中未使用該術語。這個變量被稱為版本libkver
補丁級別X 4本文檔中未使用該術語。這個變量被稱為在patch_level libkver
安卓版安卓12

這是與內核相關聯的 Android(甜點)版本號。

當比較AndroidRelease字段,數字部分從字符串進行比較萃取。

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

KMI生成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版本的一部分。對於在例如內核版本中,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總是使用“機器人”):

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

被忽略的信息可以包括諸如ci.android.com版本號,混帳的基線上的內核之上的補丁,和SHA哈希的數量提交。

庫克維爾

庫 libkver 提供了一個 C++ 接口來解析內核版本或 KMI 版本字符串。對於API,這些API libkver自曝,請參閱列表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有效載荷,它這個字段進行比較,以確保分區不會降級。

為了避免混淆,該version的OTA中的元數據的引導分區字段被稱為boot image version

因為RAMDISK總是從頭開始建立,使用ramdisk的時間戳足以描述整個引導映像。無需在引導映像版本中對內核版本進行編碼,除非您將來要將舊的引導映像拼接到新的內核二進製文件中。

在 OTA 更新之前,OTA 客戶端以與任何其他分區相同的方式檢查啟動映像版本。