VNDK スナップショットの設計

システム イメージとベンダー イメージが異なるバージョンの Android からビルドされた場合でも、システム イメージは VNDK スナップショットを使用して、ベンダー イメージに正しい VNDK ライブラリを提供できます。VNDK スナップショットを作成するには、VNDK ライブラリをスナップショットとしてキャプチャし、バージョン番号を付けます。ベンダー イメージは、ベンダー イメージ内のモジュールに必要な ABI を提供する特定の VNDK バージョンをリンクできます。ただし、同じ VNDK バージョン内で VNDK ライブラリは ABI 安定性を維持する必要があります。

VNDK スナップショットの設計作業には、現在のシステム イメージから VNDK スナップショットの事前ビルドを生成する手順と、新しい Android バージョンのシステム パーティションにこれらのビルド済みライブラリをインストールする手順が含まれます。

VNDK ライブラリについて

Android 8.0 で導入された HIDL-HAL では、システム パーティションとベンダー パーティションを別々にアップグレードできます。VNDK は、ベンダーコードがリンクできるライブラリのセット(VNDK-core、VNDK-SP、LL-NDK)を定義します。これにより、VNDK セットに含まれないライブラリをベンダーが使用することが防止されます。その結果、システム イメージ上の適切な VNDK セットがベンダー イメージに提供された場合にのみ、ベンダー イメージをビルドおよび実行できるようになります。

VNDK-core

ライブラリの VNDK-core セットは /system/lib[64]/vndk-${VER} にインストールされ、${VER} と等しい API レベルのベンダー プロセスでのみ利用できます。システム プロセスはこれらのライブラリを使用できないので、代わりに /system/lib[64] にインストールされたライブラリを使用する必要があります。各プロセスには厳格な名前空間の制限があるため、VNDK-core ライブラリでは二重読み込みを防止できます。

VNDK-core にライブラリを含めるには、以下の行を Android.bp に追加します。

vendor_available: true,
vndk: {
    enabled: true,
},

VNDK-SP

VNDK-SP ライブラリは /system/lib[64]/vndk-sp-${VER} にインストールされ、(ベンダー パーティションにインストールされた SP-HAL ライブラリを介して)ベンダー プロセスとシステム プロセスから利用できます。VNDK-SP ライブラリでは、二重読み込みが可能です。

VNDK-SP にライブラリを含めるには、以下の行を Android.bp に追加します。

vendor_available: true,
vndk: {
    enabled: true,
    support_system_process: true,
},

LL-NDK

LL-NDK ライブラリは、/system/lib[64] にインストールされます。ベンダー モジュールは、LL-NDK のスタブ ライブラリを使用して、LL-NDK ライブラリの事前選択済みシンボルにアクセスできます。古いバージョンのベンダー モジュールが新しいバージョンの LL-NDK ライブラリを使用できるように、LL-NDK ライブラリは下位互換性と ABI 安定性を維持する必要があります。LL-NDK には ABI 安定性という特性があるので、VNDK スナップショットに古いベンダー イメージ用の LL-NDK ライブラリを含める必要はありません。

VNDK スナップショットについて

Android 8.1 には、ソースコードからビルドされた VNDK ライブラリが含まれていました。しかし、新しいバージョンの Android では、各 VNDK バージョンをスナップショットとしてキャプチャし、古いベンダー イメージへのリンクを可能にする事前ビルドとして提供する必要があります。

Android 9 以降、新しいバージョンの Android には、Android ソースコードの古いバージョン用の VNDK-core ディレクトリと VNDK-SP ディレクトリのスナップショットが少なくとも 1 つ含まれます。ビルド時に、必要なスナップショットが /system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER}(ベンダー パーティションで使用できるディレクトリ)にインストールされます。ここで、${VER} は、VNDK スナップショットのバージョン名を表す文字列変数です。

VNDK スナップショット ライブラリは VNDK バージョンによって異なる可能性があるため、VNDK スナップショットにはリンカー名前空間構成も含まれており、etc/ld.config.${VER}.txt/etc/llndk.libraries.${VER}.txt/etc/vndksp.libraries.${VER}.txt としてインストールされています。

例: システム イメージとベンダー イメージをアップグレードする

スナップショットは必要ありません。VNDK スナップショット用の追加構成なしでビルドされます。

例: システム イメージのみをアップグレードする

ベンダー イメージ用の VNDK スナップショットとリンカー名前空間構成ファイルをシステム イメージに含める必要があります。リンカー名前空間構成ファイルは、/system/lib[64]/vndk-${VER}/system/lib[64]/vndk-sp-${VER} の VNDK ライブラリを検索するように自動的に構成されます。

図 1. システム イメージのみのアップグレード

例: システム イメージのアップグレードとベンダー イメージのマイナー変更

VNDK スナップショットに対するベンダー イメージのビルドはまだサポートされていないため、ベンダー イメージを元のソースコードとは別にビルドしてから、上記の例のようにシステム イメージをアップグレードする必要があります。

VNDK スナップショットのアーキテクチャ

Android 9 のシステム イメージで Android 8.1 のベンダー イメージとの互換性を維持するには、次の図に示すように、Android 8.1 のベンダー イメージに一致する VNDK スナップショットを Android 9 のシステム イメージに提供する必要があります。

図 2. VNDK スナップショットのアーキテクチャ

VNDK スナップショットの設計には、以下の手順が含まれます。

  • VNDK-core ライブラリと VNDK-SP ライブラリのスナップショットを生成します。Android 9 には、現在の VNDK ビルドのスナップショットを作成するために使用できるスクリプトが用意されています。このスクリプトは、現在のソースで VNDK スナップショットとしてビルドされた /system/lib[64]/vndk-28 および /system/lib[64]/vndk-sp-28 のすべてのライブラリをバンドルします(ここで、28 は Android 9 の VNDK バージョンです)。スナップショットには、リンカー名前空間構成ファイル /etc/ld.config.28.txt/etc/llndk.libraries.28.txt/etc/vndksp.libraries.28.txt も含まれています。生成されたスナップショットは、Android 9 より新しいバージョンの Android で使用されます。
  • スナップショットからビルド済み VNDK-core ライブラリと VNDK-SP ライブラリをインストールします。Android 9 では、ビルド済み VNDK-core ライブラリのセットと VNDK-SP ライブラリのセットに加えて、リンカー名前空間構成ファイルも VNDK スナップショットに含まれています。インストールする VNDK スナップショット バージョンのリストを指定した場合、システム イメージはビルド時に VNDK スナップショット ライブラリを /system/lib[64]/vndk-${VER} ディレクトリと /system/lib[64]/vndk-sp-${VER} ディレクトリにインストールし、VNDK スナップショット用のリンカー名前空間構成ファイルを /etc ディレクトリにインストールします。

VNDK のバージョニング

VNDK スナップショットは Android リリースごとに 1 つだけ存在し、SDK バージョンが VNDK バージョンとして使用されます。つまり、VNDK バージョンは 27(Android 8.1 の場合)のような整数です。Android バージョンがリリースされると、VNDK バージョンが修正されます。ベンダー パーティションで使用される VNDK バージョンは、ro.vndk.version プロパティに自動的に保存され、実行時に読み取ることができます。その後、このバージョンは、一部のライブラリのベンダー VNDK バージョンの識別と、名前空間構成の VNDK スナップショット バージョンの識別に使用されます。

VNDK ライブラリをビルドする

make vndk コマンドは、vndk: { enabled: true, … } が指定されたライブラリ(依存関係と名前空間構成ファイルを含む)をビルドします。BOARD_VNDK_VERSION := current を設定した場合、これらのライブラリは make コマンドでビルドされます。

このビルドでは VNDK ライブラリがスナップショットからインストールされないため、インストールされた VNDK ライブラリには ABI 安定性がありません。ただし、Android バージョンがリリースされると、現在の VNDK バージョンの ABI が修正されます。この時点で、ABI の破損はすべてビルドエラーとなるため、Android バージョンに対するパッチは VNDK ライブラリの ABI を変更してはなりません。