GKIバージョニング

このページでは、Generic Kernel Images(GKI)のバージョン管理スキームについて説明します。 Generic Kernel Image(GKI)には、カーネルリリースと呼ばれる一意の識別子があります。カーネルリリースは、カーネルモジュールインターフェイス(KMI)バージョンとサブレベルで構成されています。カーネルリリースはリリースされるイメージに固有ですが、KMIバージョンはリリースのビルド元のインターフェイスを表します。 KMIバージョンは、複数のカーネルリリースをサポートできます。カーネルリリースは、1つの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 Kernel Makefilesを参照してください(「KERNELRELEASE」を検索してください)。

wxyは、このドキュメント全体で直接使用されています。これは、一般に3部構成のバージョン番号とも呼ばれます。 VINTF、カーネルバージョンで使用される用語は、他の用語、特にwと混同する可能性があります。

この変数は、 libkverではkernel_version_tupleと呼ばれます。

このタプルは、OTAやメインラインを含む更新によって減少してはなりません。

カーネルブランチzzz-wx android12-5.4この用語は、一般的なカーネルブランチタイプで使用されます。
バージョンw 5この用語は、このドキュメントでは使用されていません。この変数は、 libkverではバージョンと呼ばれます。
パッチレベルバツ4この用語は、このドキュメントでは使用されていません。この変数は、 libkverではpatch_levelと呼ばれます。
Androidリリースzzz android12

これは、カーネルが関連付けられている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です。 2つの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)を記述します。

2つのカーネルリリースのKMIバージョンが同じである場合、それらは同じカーネルモジュールインターフェイスを実装します。一方と互換性のあるDLKMは、もう一方とも互換性があります。

KMIバージョンは、OTAアップデートによって減少させてはなりません。

サブレベル

サブレベルyは、同じKMIバージョン内のカーネルリリースのリリース順序を示します。

同じKMIバージョンを持ちながら、それぞれサブレベルY1とY2を持つ2つのカーネルリリースの場合:

  • 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のビルド番号、ベースラインカーネル上のパッチの数、gitcommitのSHAハッシュなどの情報が含まれる可能性があります。

libkver

ライブラリlibkverは、カーネルリリースまたはKMIバージョン文字列を解析するためのC ++インターフェイスを提供します。 libkverが公開するAPIのリストについては、 packages/modules/Gki/libkver/include/kverを参照してください。

VINTFチェック

Android 11以下の場合、KMIバージョンのAndroidリリース部分は、デバイスメーカーによってデバイスマニフェストで手動で指定されます。詳細については、 VINTFカーネル一致ルールを参照してください。

Android Sから、KMIバージョンのAndroidリリース部分をカーネルから抽出し、ビルド時にデバイスマニフェストに挿入できます。

カーネル構成要件は通常変更されないため、互換性マトリックス内でkをエンコードする必要はありません。ただし、カーネル構成要件を変更する必要があるというまれなケースでは、次のことを確認してください。

  • 互換性マトリックスから対応する要件が削除されます。
  • KMIの生成を条件とする新しい要件を確認するために、追加のVTSテストが追加されています。

OTAメタデータのブートイメージバージョン

ブートイメージがOTA更新によって更新された場合でも、OTAペイロード形式payload.binでラップする必要があります。 OTAペイロードは、各パーティションのversionフィールドをエンコードします。 update_engineがOTAペイロードを処理するとき、このフィールドを比較して、パーティションがダウングレードされていないことを確認します。

混乱を避けるために、OTAメタデータのブートパーティションのversionフィールドは、 boot image versionと呼ばれます。

ramdiskは常にゼロから構築されるため、 ramdiskタイムスタンプを使用するだけで、ブートイメージ全体を記述できます。将来、古いブートイメージを新しいカーネルバイナリにつなぎ合わせる場合を除いて、ブートイメージバージョンでカーネルリリースをエンコードする必要はありません。

OTAアップデートの前に、OTAクライアントは他のパーティションと同じ方法でブートイメージのバージョンをチェックします。