当我在其上应用 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(BaseDexClassLoader.java:67)
堆栈跟踪可以看出您的测试设备可能是 Lollipop 之前的设备 (Android 5.0),并且您刚刚达到 64k 限制。您可以按照说明修复它 here.
我遇到了同样的问题,与 64k 限制有关"multidex"。
我在 defaultConfig
块中的 build.gradle 中使用 multiDexEnabled true
属性,在 android
一个下。
所述
对于 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)
。
应用程序在我应用 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(BaseDexClassLoader.java:67)
堆栈跟踪可以看出您的测试设备可能是 Lollipop 之前的设备 (Android 5.0),并且您刚刚达到 64k 限制。您可以按照说明修复它 here.
我遇到了同样的问题,与 64k 限制有关"multidex"。
我在 defaultConfig
块中的 build.gradle 中使用 multiDexEnabled true
属性,在 android
一个下。
对于 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)
。