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)のターゲット アーキテクチャ(arm
、arm64
、x86
、x86_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_ARCH
とTARGET_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
)のディレクトリ構造を示しています。
ベンダー スナップショット向けのビルド
Android 11 ではベンダー スナップショットをサポートしているため、ソースツリーの Android バージョンに関係なく vendor.img
をビルドできます。デフォルトの VNDK スナップショットには、デバイスにインストールして実行時にベンダー C++ バイナリからリンクできる共有ライブラリ ファイル(.so
)が含まれています。この VNDK スナップショットに対してビルドするには、ヘッダー ファイルやエクスポートされたフラグなどの追加のアーティファクトが必要です。
このようなアーティファクトを(VNDK スナップショットとともに)ローカル ソースツリーから生成するには、次のコマンドを使用します。
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh
このコマンドは $DIST_DIR
に android-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
の関連するプロパティに適切な値が入力されます。このスクリプトは、以下のタスクを実行します。
/prebuilts/vndk/vVER
で、repo start
を使用して新しい Git ブランチを作成します。- VNDK スナップショットのビルド アーティファクトを取得して解凍します。
gen_buildfiles.py
を実行して、ビルドファイル(Android.bp
)を自動生成します。check_gpl_license.py
を実行し、General Public License(GPL)に基づいてライセンスを付与されたビルド済みライブラリが現在のソースツリーでソースをリリースしていることを確認します。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_VERSION
、PRODUCT_EXTRA_VNDK_VERSIONS
、ro.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_VERSION
がPLATFORM_VERSION_CODENAME
として設定されます。 - リリース時には、
PLATFORM_SDK_VERSION
がPLATFORM_VNDK_VERSION
にコピーされます。
Android のバージョンがリリースされると、現在の VNDK ライブラリは VNDK APEX(/system/apex/com.android.vndk.vVER
)にインストールされます。この VER
は PLATFORM_VNDK_VERSION
に保存されているバージョンです。
BOARD_VNDK_VERSION
が current
に設定されると、PLATFORM_VNDK_VERSION
が ro.vndk.version
に保存されます。それ以外の場合は、BOARD_VNDK_VERSION
が ro.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.prop
のvendor.img
に格納されます。