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=userTARGET_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-usermake -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_TOPdevelopment/vndk/snapshot/build.sh - 特定の
TARGET_ARCHをビルドするには、次のコマンドを実行します。lunch aosp_TARGET_ARCH-userm -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に格納されます。