環境
- NDK r21(検証レイヤーがひとつにまとまって便利)
- Android9 or later(Android 10(Pixel4) で動作確認)
.so を apk に含めるか, Android9 以降では .so をアプリ固有ストレージに置いて, 実行時に validation layer(.so) をロードすることができます.
gradle に指定して apk にパッケージングする設定
特段問題なくできるかと思います.
gradle で ndk のディレクトリは android.ndkDirectory で取得できます.
Android Studio を使っている場合, local.gradle
に NDK のパスを自動で設定してくれると思いますが, gradle 直でビルドする場合はこのファイルで NDK のパスを設定しておく必要があると思われます.
NDK から prebuild をコピってくる場合
ドキュメントにあるように, jniLibs フォルダをコピってくれば apk に含んでくれます.
git などでアプリを管理したいときはこの方法が管理が楽になりいいかもしれません.
ただ, arm64-v8a だけで 40MB あります. 全てのアーキテクチャを含めると 140MB くらいになるので, 必要なものだけ追加しましょう. 2020/01 時点では実質 arm64-v8a 一択でよいでしょう(x86, x86-64 で Vulkan 動く Android 実機はあるのかしらん...? x86 系はエミュレータでのデバッグ用?)
NDK のバージョンが上がったりしたらアップデートが必要です.
きちんと apk にファイルが含まれているかどうかは, Android Studio 使っている場合 Build
-> Analyze APK
でパッケージ内容を確認することができます.
自前でビルド
ソースコードからビルドしたいときもあります.
の build-android
で build_all.sh
を叩くのが楽でしょう.
ANDROID_SDK_HOME, ANDROID_NDK_HOME 環境変数を設定し,
aapt, zipalign, jarsigner など build-tools と, ndk-build へのパスを設定しておきます.
あとはスクリプト実行すればそのまま .so などビルドされるはずです.
(ちなみにこのスクリプトは gradle を使わずに apk を作っており本当に素晴らしいですね)
validation layer .so をアプリ固有ストレージから読む(Android9 or later)
にあるように, いったん /data/local/tmp
にファイルを置いてからアプリ固有ストレージに push します.
一度アプリの apk をインストールしておく必要があるかと思います.
いったん /data/local/tmp
にファイルを置く必要がある理由は, こちらを参照ください.
Android C/C++ でアクセスできるストレージのメモ
https://qiita.com/syoyo/items/f3919209b5355a57fd88
他の APK から validation layer を読む(Android 10)
この方法は adb install するだけなので, 多少手間が減って便利... かもしれません.
もしくは, リリースに近い APK でテストするため, validation layers .so を含めたくないときなど.
Android の Developer options などで validation layers を有効にします.
T.B.W.
動作確認
validation layers の利用は PC と同じです.
C/C++ コード側で明示的に有効にする必要があります.
Android Vulkan document や, Vulkan tutorial
あたりを参照ください.
.so を APK に含める場合は, Developer options などで validation layer 有効は不要です.
NDK r21 以上では, VK_LAYER_KHRONOS_validation
だけ指定で OK です.
うまくロードできると(APK jniLibs に追加する方法で試しました), adb logcat で
I/vulkan: Loaded layer VK_LAYER_KHRONOS_validation
というのを確認できるはずです.
そのままでは error などあっても logcat に表示されないようなので, https://developer.android.com/ndk/guides/graphics/validation-layer#debug を参考に debug log を出す必要があります.
Sascha 先生の Vulakn サンプルが参考になると思います.
また, Validation layers が有効で, Vulkan API が適切に呼ばれてエラーやワーニングが無ければ I/vulkan: Loaded layer
以外はなにも出力されません.
TODO
- debug callback https://developer.android.com/ndk/guides/graphics/validation-layer#debug を利用して, validation layer のエラーを logcat に渡す.