crashlytics
を適用するとアプリがクラッシュする
FATAL EXCEPTION: main
Process: com.ehs.pk, PID: 20963
Java.lang.RuntimeException: Unable to get provider com.crashlytics.Android.CrashlyticsInitProvider: Java.lang.ClassNotFoundException: Didn't find class "com.crashlytics.Android.CrashlyticsInitProvider" on path: DexPathList[[Zip file "/data/app/com.ehs.pk-8.apk"],nativeLibraryDirectories=[/data/app-lib/com.ehs.pk-8, /vendor/lib, /system/lib]]
at Android.app.ActivityThread.installProvider(ActivityThread.Java:4993)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4585)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4499)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:157)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1307)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:157)
at Android.app.ActivityThread.main(ActivityThread.Java:5293)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1265)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.ClassNotFoundException: Didn't find class "com.crashlytics.Android.CrashlyticsInitProvider" on path: DexPathList[[Zip file "/data/app/com.ehs.pk-8.apk"],nativeLibraryDirectories=[/data/app-lib/com.ehs.pk-8, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:67)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:497)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:457)
at Android.app.ActivityThread.installProvider(ActivityThread.Java:4978)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4585)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4499)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:157)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1307)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:157)
at Android.app.ActivityThread.main(ActivityThread.Java:5293)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1265)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1081)
at dalvik.system.NativeStart.main(Native Method)
私は同じ問題に直面していました、64kの制限「multidex」に関連しています。
defaultConfig
ブロックの下のAndroid
ブロックでbuild.gradleのmultiDexEnabled true
プロパティを使用していました。
Googleドキュメント に記載されているとおり
21より前のAndroid APIを備えたデバイスの場合、multidexライブラリ(implementation 'com.Android.support:multidex:1.0.2'
)を含める必要があります
applicationクラスでMultiDexApplication
を拡張します
同じ問題が発生しており、Android Studioでインスタントランを無効にすると動作するように見えました。
Macの場合Android Studioの設定または設定->ビルド、実行、展開->インスタント実行。
私は次のことを行ってこの問題を解決しました。
Applicationクラスで:
@Override
public void attachBaseContext(Context base) {
super.attachBaseContext(base);
try {
MultiDex.install(this);
} catch (RuntimeException multiDexException) {
multiDexException.printStackTrace();
}
}
これは、インスタントランの問題である可能性があります。インスタントランをオフにして、ビルドを再度実行します。私は同じ問題に直面し、それを解決しました。
この部分を見て...
_Didn't find class ... on path: DexPathList ...
_ dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:67)
スタックトレースを見ると、テストデバイスはおそらくLollipop(Android 5.0)より前であり、64kの制限に達しているだけであることがわかります。説明に従って修正できます こちら
Firebaseまたはcrashlyticsの使用中にminifyEnabledがtrueの場合、この問題が発生する可能性があります。 minifyEnabledを有効にすると、メソッドとクラスの名前が可能な限り最小の文字に縮小されます(名前が変更され、ClassNotFoundExceptionが発生します)。残念ながら、firebaseおよびcrashlyticsバージョンには多くの問題がありました。これを解決するには、proguardファイル「proguard-rules.pro」に次の行を次のように記述して、これらのクラスを縮小しないようにproguardに指示します。
-keep class com.crashlytics.** { *; }
-keep class com.google.firebase.*.* { *; }
問題が解消されない場合、または他のクラスが見つからない場合は、ベースプロジェクトbuild.gradleのgradleなどの依存関係バージョンを確認してください。これらのバージョンにはそのエラーがないことがわかりました。
dependencies {
classpath 'com.Android.tools.build:gradle:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.google.gms:google-services:3.2.0'
classpath 'io.fabric.tools:gradle:1.25.1'
}
そのproguardファイルにクラスパスを配置して、minifyが有効になっているときに名前やメソッドが変更されないようにすることができます。これは、他のクラス「ClassNotFoundException」でも役立ちます。
また、デバッグでこれをテストするには、build.gradleのデバッグ設定を次のように調整できます。
buildTypes {
release {
debuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
もう1つのケース:
私の場合、インスタントランを無効にし、グラドルに_multiDexEnabled true
_を追加し、カスタムアプリケーションでMultiDex.install(this);
と呼ばれる_'com.Android.support:multidex:1.0.3'
_を依存関係に追加しましたが、同じエラー。エラーはシステムでのみ発生しますAndroid 4.4。すべてがAndroid 7.0および9.0で正常に動作します。
最後に、MultiDex.install(this);
をonCreate(Context)
メソッドからattachBaseContext(Context)
メソッドに移動すると、問題が解決しました。
したがって、MultiDexApplication
を直接拡張する予定がない場合は、MultiDex.install(this);
の代わりにattachBaseContext(Context)
でonCreate(Context)
を呼び出す必要があります。
minifyEnabled true
で実行したときにこれが発生した場合、proguard-rules.pro
ファイルに次のルールを追加します。
-keep public class com.crashlytics.Android.CrashlyticsInitProvider