VuforiaSDKを用いてARカメラを実装したAndroidアプリをリリースしています。
今回、アプリのDBを流行のRealmに切り替えようとした際ハマりましたので紹介します。
VuforiaSDKは5.010のjarおよび.soファイルをダウンロードしてプロジェクトに含め、Realmはver0.87.5をbuild.gradleに記述し導入しました。
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'io.realm:realm-android:0.87.5'
一部の端末でVuforia初期化時にクラッシュするようになった
System.err﹕ The library libVuforia.so could not be loaded
Realmを導入後、上記のエラーが発生しアプリごとクラッシュする現象が発生しました。
全ての環境で発生するわけでなく、手持ち(Nexus7、MeMOPad7、XperiaZ4)のうちXperiaでのみ再現しました。
原因は64bit対応だった
Realmにはアーキテクチャごとのバイナリファイルが含まれており、これにはARM 64bit用ファイル(arm64-v8a)も入ります。
しかしVuforiaSDKでは32bit用の armeabi-v7aしか用意されておらず、結果としてアプリに32bitと64bitのバイナリが混在する状態になっていたためクラッシュしていたようです。
ARM 64bitに対応する端末が私の手持ちではXperiaZ4だけであるため納得です。
build.gradleでexcludeするようにした
JARを直接編集するなどの方法もあるようですが、今回はbuild.gradle上のオプションでこれら衝突するバイナリファイルをビルドから除外することにしました。
以下では armeabi-v7a以外全て除外していますが、 arm64-v8aのみ除外しても動作するかと思われます。
packagingOptions {
exclude 'lib/arm64-v8a/librealm-jni.so'
exclude 'lib/armeabi/librealm-jni.so'
exclude 'lib/x86_64/librealm-jni.so'
exclude 'lib/x86/librealm-jni.so'
exclude 'lib/mips/librealm-jni.so'
}