当我在其上应用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)
答案 0 :(得分:31)
我遇到了同样的问题,与64k限制“multidex”有关。
我在multiDexEnabled true
块中的build.gradle中使用defaultConfig
属性,位于android
之下。
对于 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(BaseDexClassLoader.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