当我在其上应用crashlytics时应用程序崩溃

时间:2017-11-14 11:36:15

标签: android android-gradle crashlytics crashlytics-android

当我在其上应用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) 

8 个答案:

答案 0 :(得分:31)

我遇到了同样的问题,与64k限制“multidex”有关。

我在multiDexEnabled true块中的build.gradle中使用defaultConfig属性,位于android之下。

Google documentation

中所述

对于 21之前的Android API 的设备,我们需要包含multidex库(implementation 'com.android.support:multidex:1.0.2'

并在我们的Application类

中扩展MultiDexApplication

答案 1 :(得分:9)

我们遇到了同样的问题,在Android Studio中禁用即时运行似乎让它正常运行。

在mac上 Android Studio设置或首选项 - >构建,执行,部署 - >即时跑步。

答案 2 :(得分:8)

我通过执行以下操作解决了这个问题:

在Application类中:

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

答案 3 :(得分:7)

这可能与Instant Run有关。关闭即时运行,然后再次运行构建。我遇到了同样的问题,它解决了。

答案 4 :(得分:6)

看这部分......

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

堆栈跟踪的

你可以发现你的测试设备可能是Lollipop之前(Android 5.0)并且你只是达到了64k的限制。您可以按照here.

所述进行修复

答案 5 :(得分:4)

当使用firebase或crashlytics时minifyEnabled为true,可能会出现此问题。启用minifyEnabled会将方法和类名称缩小为可能的最低字符(更改名称并引发ClassNotFoundException)。不幸的是,firebase和crashlytics版本有很多问题。要解决这个问题,只需告诉proguard不要通过在proguard文件中编写下一行来缩小这些类" proguard-rules.pro"为:

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

}

答案 6 :(得分:1)

只有一种情况:

就我而言,我禁用了即时运行,在gradle中添加了multiDexEnabled true,并将'com.android.support:multidex:1.0.3'添加到了我的依赖项中,直接在我的自定义应用程序中将其称为MultiDex.install(this);,但我仍然有同样的错误。该错误仅发生在系统Android 4.4中。一切在Android 7.0和9.0上都能正常运行。

最后,将MultiDex.install(this);onCreate(Context)方法移到attachBaseContext(Context)解决了我的问题。

因此,当您不打算直接扩展MultiDex.install(this);时,应该在attachBaseContext(Context)中调用onCreate(Context)而不是MultiDexApplication

答案 7 :(得分:0)

如果在使用minifyEnabled true运行时发生这种情况,请将此规则添加到proguard-rules.pro文件中:

-keep public class com.crashlytics.android.CrashlyticsInitProvider