应用程序在我使用Crashlytics时崩溃

26
应用在我上面使用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) 

尝试清理和重建你的代码! - xbadal
4
你本可以只是达到64k的极限,“multidex”。 - Blundell
@Blundell 为什么你说它(64k限制)? - Paolo Mastrangelo
1
@PaoloMastrangelo 我认为这是因为出现了 在路径上未找到类...:DexPathListdalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67) 这一行。 - Peppermint Paddy
1
谢谢,它运行正常。 - Amir Jehangir
显示剩余9条评论
8个回答

37

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

我在defaultConfig块下使用了multiDexEnabled true属性,在android部分的build.gradle中。

Google文档所述,对于Android API低于21的设备,我们需要包含multidex库(implementation 'com.android.support:multidex:1.0.2'),并在我们的应用程序类中扩展MultiDexApplication


如果有人在API级别高于21的情况下遇到了这个问题,请查看https://dev59.com/z1YN5IYBdhLWcg3wJFT8#52813496。因为我在API 27 Android Pie上遇到了这个问题。 - Monish Kamble

10

我通过以下方法解决了这个问题:

在 Application 类中:

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

10

我们曾经遇到同样的问题,禁用 Android Studio 中的即时运行似乎可以解决问题。

在 Mac 上, Android Studio 设置或首选项 -> 构建、执行、部署 -> 即时运行。


7

这可能是即时运行(Instant Run)的问题。关闭即时运行,然后再次运行构建。我遇到了同样的问题,通过这样做解决了它。


7
通过查看堆栈跟踪中的这部分内容,您可以发现您的测试设备可能是Lollipop(Android 5.0)之前的版本,并且您刚刚达到了64k限制。 您可以按照此处描述的方式进行修复:此处

3
我在使用Android API 26及以上版本和Android Studio 3.1时遇到了问题。 - neobie
1
@neobie 我在更新时遇到了同样的问题,使用multidex似乎没有帮助。 你解决了吗? - emillime
实际上,它可能只会在25以上的版本上崩溃。 - emillime
1
@fuskaren 我正在为那些导致错误的库添加更多的Proguard规则...不确定为什么这只发生在Android Studio 3.1之后。 - neobie
这不是DEX限制问题。如果你达到了65000的限制,在编译时就会知道。你甚至无法进入运行时以查看 OP 分享的崩溃。这可能是一个multidex问题(即你已经设置了multidex,但这个类没有作为第一个dex文件的一部分被加载)。 - tir38
显示剩余6条评论

4

当使用firebase或crashlytics并启用minifyEnabled时,可能会出现此问题。启用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文件中,这样在启用缩小功能时,它不会更改名称或方法,并且这也将有助于处理其他类的“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
这些是过于宽泛的Proguard规则。我认为您不需要保留所有 Crashlytics和所有 Firebase来解决原始问题。 - tir38

1

再来一个案例:

在我的情况下,我禁用了即时运行,将multiDexEnabled true添加到我的gradle中,并将'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)方法解决了我的问题。

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


0
如果您在使用minifyEnabled true运行时遇到此问题,请在您的proguard-rules.pro文件中添加以下规则:
-keep public class com.crashlytics.android.CrashlyticsInitProvider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接