Android 应用crashlytics时应用程序崩溃
当我对应用程序应用Android 应用crashlytics时应用程序崩溃,android,android-gradle-plugin,crashlytics,crashlytics-android,Android,Android Gradle Plugin,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.crashlyti
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)
通过看这部分
未找到类。。。在路径上:DexPathList…
dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader、 java:67)
在堆栈跟踪中,您可以发现您的测试设备可能是pre-Lollipop(Android 5.0),并且您刚刚达到64k限制。您可以按所述进行修复我遇到了相同的问题,与64k限制“multidex”有关 我在
defaultConfig
块的android
one下的build.gradle中使用了multiDexEnabled true
属性
如中所述
对于使用21之前的Android API的设备,我们需要包括multidex库(implementation'com.Android.support:multidex:1.0.2'
)
并在我们的应用程序类中扩展
MultiDexApplication
我通过执行以下操作解决了此问题:
在应用程序类中:
@Override
public void attachBaseContext(Context base) {
super.attachBaseContext(base);
try {
MultiDex.install(this);
} catch (RuntimeException multiDexException) {
multiDexException.printStackTrace();
}
}
使用firebase或crashlytics时,如果minifyEnabled为true,则可能会发生此问题。启用minifyEnabled会将方法和类名称收缩到尽可能少的字符(更改名称并引发ClassNotFoundException)。不幸的是,firebase和crashlytics版本在这方面有很多问题。要解决这个问题,只需告诉proguard不要收缩这些类,方法是在proguard文件“proguard rules.pro”中写入以下行: 现在,如果问题没有消失,或者找不到与您类似的其他类,那么请检查您的基本项目build.gradle dependencies版本的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'
}
}
我们也遇到了同样的问题,在Android Studio中禁用instant run似乎可以让它正常工作 在mac上
Android Studio设置或首选项->构建、执行、部署->即时运行。这可能是即时运行的问题。关闭即时运行,然后再次运行生成。我面对同样的问题,它解决了它 如果在使用
minifyEnabled true
运行时发生这种情况,请将此规则添加到proguard rules.pro
文件中:
-keep public class com.crashlytics.android.CrashlyticsInitProvider
再举一个例子:
在我的例子中,我禁用了instant run,在我的gradle中添加了multidex enabled true
,并将'com.android.support:multidex:1.0.3'
添加到我的依赖项中,称为multidex.install(此)代码>直接在我的自定义应用程序中,但我仍然得到相同的错误。该错误仅发生在Android 4.4系统中。在安卓7.0和9.0上一切都运行良好
最后,移动MultiDex.install(这个)
从onCreate(Context)
方法到attachBaseContext(Context)
解决了我的问题
因此,您应该调用MultiDex.install(this)当您不打算直接扩展MultiDexApplication
时,请在attachBaseContext(Context)
中进行编码,而不是在onCreate(Context)
中进行编码。添加更多信息,如编码或如何包含Crashlytics。例如,发布build.gradle文件。尝试清理并重建代码!你可能已经达到了64k的极限“multidex”@paolomastangelo我想正是因为这个没有找到类。。。路径:DexPathList
和这个dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
行谢谢你的工作。我对Android API 26及以上版本、Android Studio 3有这样的问题。1@neobie我更新时也得到了同样的结果,使用multidex似乎没有帮助。你解决了吗?@fuskren你的最小API级别是多少?@PeppermintPaddyIts它是15,但它在任何版本上都会在开始时直接崩溃。@fuskren我正在为那些导致错误的库添加更多的proguard规则。。不知道为什么只有在Android Studio 3.1之后才会发生这种情况。这些都是过于宽泛的proguard规则。我不认为你需要保留所有Crashlytics和所有Firebase来解决原始问题。如果有人在API级别高于21的情况下面临此问题,请查看。当我在API 27 Android Pie上面对这个问题时
-keep public class com.crashlytics.android.CrashlyticsInitProvider