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

App crashes when i apply crashlytics on it

应用程序在我应用 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.access00(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.access00(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) 

通过查看这部分...

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

堆栈跟踪可以看出您的测试设备可能是 Lollipop 之前的设备 (Android 5.0),并且您刚刚达到 64k 限制。您可以按照说明修复它 here.

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

我在 defaultConfig 块中的 build.gradle 中使用 multiDexEnabled true 属性,在 android 一个下。

Google documentation

所述

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

并在我们的应用程序中扩展 MultiDexApplication class

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

在申请中class:

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

当使用 firebase 或 crashlytics 时 minifyEnabled 为真时,可能会发生此问题。启用 minifyEnabled 将方法和 类 名称缩减为尽可能低的字符(更改名称并引发 ClassNotFoundException)。不幸的是,firebase 和 crashlytics 版本有很多问题。要解决它,只需告诉混淆器不要通过在混淆器文件 "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'

}

记住,您可以将任何 类 路径放入该混淆文件中,这样当启用 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'
    }

}

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

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

这可能是 Instant 运行 的问题。再次关闭 Instant 运行 和 运行 构建。我遇到了同样的问题并解决了它。

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

-keep public class com.crashlytics.android.CrashlyticsInitProvider

还有一个案例:

在我的例子中,我禁用了即时 运行,在我的 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) 解决了我的问题。

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