VNDK スナップショットの生成

VNDK スナップショットは、Android リリースの VNDK-core ライブラリと VNDK-SP ライブラリのセットです。system.img に含まれる VNDK スナップショットが vendor.img に必要なバージョンと一致する場合は、システム パーティションのみをアップグレードできます。

正式な VNDK スナップショットは、Android ビルドサーバーで自動的にビルドされ、Android ソースツリーの /prebuilts/vndk にチェックインされます。開発目的のために、VNDK スナップショットをローカルでビルドできます。VNDK スナップショットは、arm、arm64、x86、x86_64 TARGET_ARCH のフレーバーでサポートされています。

スナップショットのビルド

Android ビルドサーバーは、次のビルド パラメータとビルドコマンドを使用して、ビルド アーティファクトと VNDK スナップショット ファイルを生成します。

ビルド パラメータ

ビルド ターゲット名は vndk です。ビルド ターゲット構成を以下に示します。

TARGET_PRODUCT TARGET_ARCH TARGET_ARCH_VARIANT
aosp_arm arm armv7-a-neon
aosp_arm64 arm64 armv8-a
aosp_x86 x86 x86
aosp_x86_64 x86_64 x86_64
  • TARGET_PRODUCT=aosp_$(TARGET_ARCH)
  • TARGET_BUILD_VARIANT=user
  • TARGET_ARCH は Generic System Image(GSI)のターゲット アーキテクチャarmarm64x86x86_64)と同じです。
  • TARGET_ARCH_VARIANT。スナップショット v28(Android 9)以降の場合は、上記の一般的な構成が含まれています。

ビルドコマンド

公式スナップショットの場合、Android 9 以降では vndk.mk にサンプルのターゲット(vndk)が含まれ、これにより VNDK スナップショットをビルドして $DIST_DIR に出力します。スナップショットの ZIP ファイルは android-vndk-$(TARGET_ARCH).zip の形式を使用します。次に例を示します。

lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]

Android ビルドサーバーは、build.sh スクリプトを使用して、サポートされているすべての arch フレーバーを次のコマンドでビルドします。

DIST_DIR=dist_dir development/vndk/snapshot/build.sh

Android バージョンの VNDK スナップショットは、そのバージョンのリリース ブランチから生成されます。

ローカルでのビルド

開発時に、ローカルのソースツリーから VNDK スナップショットをビルドするには、次のコマンドを使用します。

  • サポートされているすべての arch を一度にビルドするには、次のビルド スクリプト(build.sh)を実行します。
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • 特定の TARGET_ARCH をビルドするには、次のコマンドを実行します。
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist
    

対応する android-vndk-$(TARGET_ARCH).zip ファイルは、$DIST_DIR に作成されます。

スナップショット ファイル

VNDK スナップショットには、以下のファイルが含まれます。

  • VNDK-core と VNDK-SP の共有ライブラリのベンダー バリアント。
    • LL-NDK 共有ライブラリは、下位互換性があるため不要です。
    • 64 ビット ターゲットの場合は、TARGET_ARCHTARGET_2ND_ARCH の両方のライブラリがビルドされ、含まれます。
  • VNDK-core、VNDK-SP、LL-NDK、VNDK-private のライブラリのリストは [vndkcore|vndksp|llndk|vndkprivate].libraries.txt にあります。
  • ライセンス ファイル。
  • module_paths.txt。すべての VNDK ライブラリのモジュールパスを記録します。このファイルは、GPL プロジェクトが特定の Android ソースツリーでソースをリリースしたことを確認するために必要になります。

VNDK スナップショットの ZIP ファイル、android-vndk-$(TARGET_ARCH).zip では、VNDK のビルド済みライブラリが ABI ビットに応じてグループ化され、arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) と名付けられた別のディレクトリに置かれます。たとえば、android-vndk-arm64.zip の場合、64-bit ライブラリは arch-arm64-armv8-a、32-bit ライブラリは arch-arm-armv8-a に置かれます。次の例は、arm64(TARGET_ARCH=arm64)の VNDK スナップショットの ZIP ファイル(android-vndk-arm64.zip)のディレクトリ構造を示しています。

VNDK スナップショットのディレクトリ構造
図 1. VNDK スナップショットのディレクトリ構造(例)

ベンダー スナップショット向けのビルド

Android 11 ではベンダー スナップショットをサポートしているため、ソースツリーの Android バージョンに関係なく vendor.img をビルドできます。デフォルトの VNDK スナップショットには、デバイスにインストールして実行時にベンダー C++ バイナリからリンクできる共有ライブラリ ファイル(.so)が含まれています。この VNDK スナップショットに対してビルドするには、ヘッダー ファイルやエクスポートされたフラグなどの追加のアーティファクトが必要です。

このようなアーティファクトを(VNDK スナップショットとともに)ローカル ソースツリーから生成するには、次のコマンドを使用します。

VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh

このコマンドは $DIST_DIRandroid-vndk-$(TARGET_ARCH).zip ファイルを作成します。以下の例は、ビルド アーティファクトを含む arm64 VNDK スナップショットの ZIP ファイルです。太字のファイルは、通常の VNDK スナップショット(図 1 を参照)に新しく追加されたファイルで、JSON ファイル(各ライブラリの cflags を格納するファイル)やすべてのエクスポートされたヘッダー ファイルなどがあります。

android-vndk-arm64.zip
├── arch-arm64-armv8-a
│   └── shared
│       ├── vndk-core  -> *.so files, *.json files
│       └── vndk-sp    -> *.so files, *.json files
├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)
├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files

VNDK スナップショットのアップロード

VNDK スナップショットはソースツリーの /prebuilts/vndk/vVER にチェックインします。この VER は、VNDK スナップショットのバージョンと同じです(つまり、対応する Android リリースの SDK バージョンに従います)。たとえば、Android 8.1 VNDK スナップショットのバージョンは 27 です。

update.py スクリプトの使用

update.py スクリプト(/development/vndk/snapshot/update.py)は、ビルド済みの VNDK スナップショットをソースツリーに追加するプロセスを自動化します。ビルド アーティファクトが自動的に検出され、生成された Android.bp の関連するプロパティに適切な値が入力されます。このスクリプトは、以下のタスクを実行します。

  1. /prebuilts/vndk/vVER で、repo start を使用して新しい Git ブランチを作成します。
  2. VNDK スナップショットのビルド アーティファクトを取得して解凍します。
  3. gen_buildfiles.py を実行して、ビルドファイル(Android.bp)を自動生成します。
  4. check_gpl_license.py を実行し、General Public License(GPL)に基づいてライセンスを付与されたビルド済みライブラリが現在のソースツリーでソースをリリースしていることを確認します。
  5. git commit を使用して新しい変更を commit します。

ローカルでビルドした VNDK スナップショットの使用

ローカルでビルドした VNDK スナップショットを使用することもできます。--local オプションを指定すると、update.py スクリプトは(Android ビルドサーバーではなく)、development/vndk/snapshot/build.sh から生成された android-vndk-$(TARGET_ARCH).zip ファイルが格納された指定のローカル ディレクトリから VNDK スナップショットのビルド アーティファクトを取得します。--local オプションを指定すると、update.py スクリプトは GPL ライセンスのチェックと git commit の手順をスキップします。

構文:

python update.py VER --local local_path

/path/to/local/dir のローカルビルドのアーティファクトで Android 8.1 VNDK スナップショットを更新するコマンドの例を以下に示します。

python update.py 27 --local /path/to/local/dir

ローカルでビルドした VNDK スナップショットのディレクトリ構造の例は以下のとおりです。

prebuilts/vndk
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (prebuilt libs)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   └── Android.bp         -> (VNDK modules with cflags)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   ├── x86                    -> (same as above)
│   ├── common
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (license file modules)
│   └── Android.bp             -> (*.libraries.30.txt modules)
└── (other VNDK versions)      -> (same as above)
ローカルビルドのアーティファクトは、アーティファクトが VNDK_SNAPSHOT_BUILD_ARTIFACTS=true でビルドされた場合に自動的に追加されます。

VNDK スナップショットのインストール

システム イメージは、ビルド時に BOARD_VNDK_VERSIONPRODUCT_EXTRA_VNDK_VERSIONSro.vndk.version の情報を使用して VNDK スナップショット ライブラリをインストールします。次のいずれかの方法を使用して、ビルド済みの VNDK スナップショット ディレクトリ(/prebuilts/vndk/v29/prebuilts/vndk/v30 など)からどの VNDK スナップショットをインストールするかを制御できます。

  • 方法 1: BOARD_VNDK_VERSION。現在のベンダー モジュールをビルドするためのスナップショット モジュールを使用し、ベンダー モジュールに必要なスナップショット モジュールのみをインストールします。
  • 方法 2: PRODUCT_EXTRA_VNDK_VERSIONS。 現在のベンダー モジュールに関係なく、VNDK スナップショット モジュールをインストールします。 これにより、ビルド時に他のモジュールにリンクされることなく、PRODUCT_EXTRA_VNDK_VERSIONS に記載されたビルド済み VNDK スナップショットがインストールされます。

BOARD_VNDK_VERSION の設定

BOARD_VNDK_VERSION は、現在のベンダー モジュールがビルドに必要とする VNDK のバージョンを示します。BOARD_VNDK_VERSION の使用可能な VNDK スナップショット バージョンが /prebuilts/vndk ディレクトリにある場合、BOARD_VNDK_VERSION が示す VNDK スナップショットがインストールされます。その VNDK スナップショットがディレクトリにない場合は、ビルドエラーが発生します。

BOARD_VNDK_VERSION を定義することで、VNDK モジュールのインストールも可能になります。ベンダー モジュールは、ビルド時に BOARD_VNDK_VERSION で定義された VNDK スナップショットのバージョンとリンクします(システムソースに現在の VNDK モジュールはビルドされません)。リポジトリから完全なソースツリーをダウンロードする場合、システムソースとベンダーソースの両方が同じ Android リリースに基づいています。

PRODUCT_EXTRA_VNDK_VERSIONS の設定

PRODUCT_EXTRA_VNDK_VERSIONS は、インストール対象となるその他の VNDK バージョンのリストです。通常、現在のベンダー パーティションに VNDK スナップショットが 1 つあれば十分です。ただし、1 つのシステム イメージに複数のスナップショットが必要になる場合もあります。たとえば、GSI には 1 つのシステム イメージで複数のベンダー バージョンをサポートするための複数のスナップショットがあります。PRODUCT_EXTRA_VNDK_VERSIONS を設定することで、BOARD_VNDK_VERSION の VNDK バージョンに加えて、VNDK のスナップショット モジュールをインストールできます。

PRODUCT_EXTRA_VNDK_VERSIONS に特定のバージョンのリストがある場合、ビルドシステムは prebuilts/vndk ディレクトリでバージョン リストのビルド済みスナップショットを探します。ビルドシステムがリストされたすべてのスナップショットを見つけると、それらのスナップショット ファイルが各 VNDK APEX(out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER)にインストールされます。バージョンが見つからない場合は、ビルドエラーが発生します。

VNDK モジュールは、ビルド時にベンダー モジュールにリンクされませんが、ベンダー パーティションのベンダー モジュールにインストールされている VNDK バージョンのいずれかが必要な場合は実行時に使用できます。PRODUCT_EXTRA_VNDK_VERSIONS は、BOARD_VNDK_VERSION が定義されている場合にのみ有効です。

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION は、システムソース内の現在の VNDK モジュールの VNDK バージョンを定義します。値は自動的に設定されます。

  • リリース前は、PLATFORM_VNDK_VERSIONPLATFORM_VERSION_CODENAME として設定されます。
  • リリース時には、PLATFORM_SDK_VERSIONPLATFORM_VNDK_VERSION にコピーされます。

Android のバージョンがリリースされると、現在の VNDK ライブラリは VNDK APEX(/system/apex/com.android.vndk.vVER)にインストールされます。この VERPLATFORM_VNDK_VERSION に保存されているバージョンです。

BOARD_VNDK_VERSIONcurrent に設定されると、PLATFORM_VNDK_VERSIONro.vndk.version に保存されます。それ以外の場合は、BOARD_VNDK_VERSIONro.vndk.version に保存されます。PLATFORM_VNDK_VERSION は、Android がリリースされたときに SDK バージョンに設定されます。リリース前は、PLATFORM_VNDK_VERSION に英数字の Android コードネームが使用されます。

VNDK バージョン設定の概要

下記の表に、VNDK のバージョン設定をまとめます。

ベンダー
ビルド
ボード
バージョン
SDK
リリース
プラットフォーム
バージョン
バージョンの
プロパティ
インストール ディレクトリ
現在の VNDK モジュール current 以前 CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
今後 SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
ビルド済みのスナップショット モジュール スナップショット: VNDK_VER
以前または今後 CODE_NAME
または SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • ボード バージョンBOARD_VNDK_VERSION)。ベンダー モジュールがビルドに必要とする VNDK のバージョン。ベンダー モジュールが現在のシステム モジュールとリンクできる場合は、current に設定します。
  • プラットフォーム バージョンPLATFORM_VNDK_VERSION)。現在のシステム モジュールがビルドしている VNDK バージョン。BOARD_VNDK_VERSION が current の場合のみビルドされます。
  • バージョン プロパティro.vndk.version)。vendor.img のバイナリとライブラリの実行に必要な VNDK のバージョンを指定するプロパティ。/vendor/default.propvendor.img に格納されます。