このページでは、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(デザート)のリリース番号です。 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クライアントは他のパーティションと同じ方法でブートイメージのバージョンをチェックします。