web-dev-qa-db-ja.com

crashlyticsを適用するとアプリがクラッシュする

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) 
24
Amir Jehangir

私は同じ問題に直面していました、64kの制限「multidex」に関連しています。

defaultConfigブロックの下のAndroidブロックでbuild.gradleのmultiDexEnabled trueプロパティを使用していました。

Googleドキュメント に記載されているとおり

21より前のAndroid APIを備えたデバイスの場合、multidexライブラリ(implementation 'com.Android.support:multidex:1.0.2')を含める必要があります

applicationクラスでMultiDexApplicationを拡張します

34

同じ問題が発生しており、Android Studioでインスタントランを無効にすると動作するように見えました。

Macの場合Android Studioの設定または設定->ビルド、実行、展開->インスタント実行。

10
Alistair Sykes

私は次のことを行ってこの問題を解決しました。

Applicationクラスで:

@Override
public void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    try {
        MultiDex.install(this);
    } catch (RuntimeException multiDexException) {
        multiDexException.printStackTrace();
    }
}
8
user2796148

これは、インスタントランの問題である可能性があります。インスタントランをオフにして、ビルドを再度実行します。私は同じ問題に直面し、それを解決しました。

この部分を見て...

_Didn't find class ... on path: DexPathList ..._ dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoade‌​r.Java:67)

スタックトレースを見ると、テストデバイスはおそらくLollipop(Android 5.0)より前であり、64kの制限に達しているだけであることがわかります。説明に従って修正できます こちら

7

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'
    }

}
4
MohammadL

もう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)を呼び出す必要があります。

1
Shouheng Wang

minifyEnabled trueで実行したときにこれが発生した場合、proguard-rules.proファイルに次のルールを追加します。

-keep public class com.crashlytics.Android.CrashlyticsInitProvider
0
Minas Mina