私は少し珍しい問題を抱えています-私のAndroidアプリにはネイティブライブラリが含まれており、armeabi-v7aとx86のネイティブライブラリを構築しています。しかし、サードパーティのライブラリをアプリに統合する必要があります。ネイティブライブラリが含まれています(サードパーティライブラリは Crashlytics です。build.gradleからMavenを介してインクルードしました。)問題は、サードパーティライブラリのAARがすべてのアーキテクチャ(armeabi、arm64-v8a、armeabi-v7aを提供することです) 、mips、mips64、x86、x86_64)と私のアプリはarmeabi-v7aとx86(arm64-v8aは近い将来に計画されています)のみをサポートしているため、最終的なAPKがビルドされると、サードパーティライブラリのすべてのABIとx86とarmeabi-v7aのみが含まれます私のネイティブコードのABIが原因で、Galaxy S6などのarm64デバイスでアプリを起動すると、アプリがクラッシュします。
私の質問は、サードパーティのAARから選択したABIのみを含めることは可能ですか?
私は APK分割 を知っていますが、これは私の問題を部分的にしか解決しないことに注意してください。つまり、Playストア経由でアプリを配布した場合にのみ機能します。 Playストアはベータテスト配布をサポートしていますが、更新されたAPKの伝播はかなり遅いため、アプリのPlayストアベータチャネルに更新をプッシュする前に、Crashlyticsのベータ配布システムを介して更新をプッシュします。問題は、Crashlyticsの配布システムがAPK分割をサポートしていないことです(または私は間違っていますか?)。したがって、実際には、選択したABIのみを含む「ユニバーサル」APKを構築する必要があります。それを達成する方法は?
Crashlytics固有の回答(たとえば、ベータチャネルを介してAPK分割を配布する方法など)でも満足しますが、選択されたABIのみを含む「ユニバーサル」APKを構築するためのソリューションにはるかに満足します。当社では、サポートされているアーキテクチャのみを含むAARアーカイブとしてSDKをクライアントに提供しており、異なるABIがサポートされている他のSDKとSDKを統合する場合の処理方法をクライアントに指示します。
最新の安定版Android studio(1.2.1.1)、gradle 2.4およびAndroid gradleプラグインバージョン1.2.3を使用しています。
packagingOptions {
exclude 'lib/arm64-v8a/libcrashlytics-envelope.so'
exclude 'lib/arm64-v8a/libcrashlytics.so'
exclude 'lib/armeabi/libcrashlytics-envelope.so'
exclude 'lib/armeabi/libcrashlytics.so'
exclude 'lib/mips64/libcrashlytics-envelope.so'
exclude 'lib/mips64/libcrashlytics.so'
exclude 'lib/mips/libcrashlytics-envelope.so'
exclude 'lib/mips/libcrashlytics.so'
exclude 'lib/x86_64/libcrashlytics-envelope.so'
exclude 'lib/x86_64/libcrashlytics.so'
}
これは私にとってはうまくいきます:
(例:armeabi&armeabi-v7aのみ)
build.gradle
Android{
defaultConfig{
ndk{
abiFilters "armeabi", "armeabi-v7a"
}
}
}
ファブリックおよびCrashlyticsのマイクはこちら。現在、スプリットでは、テスターに提供する密度が事前にわからないため、この行を特定のフレーバーまたはバリアントに追加して、生成されるユニバーサルAPKを使用します。
ext.betaDistributionApkFilePath = "ユニバーサルスプリットAPKへのパス"
また、NDKクラッシュレポートを使用している場合、表示されているクラッシュと一致する場合は このリンクを確認してください。