Android 5以下版本使用Fabric崩溃收集遇ClassNotFoundException求助
我太懂这个坑了!Android 5.0以下的Dalvik虚拟机对多DEX的支持有局限,导致Crashlytics的初始化类没被放进主DEX里,系统启动时就找不到它了。给你一套稳的解决步骤:
1. 先确认启用MultiDex支持
你的项目方法数大概率已经超过65536了,必须开启MultiDex才能让Dalvik加载多个DEX文件。在模块级的build.gradle里做这些配置:
- 在
defaultConfig块中添加:
multiDexEnabled true
- 在
dependencies中引入MultiDex依赖(根据你是否用AndroidX选择):
// AndroidX版本 implementation 'androidx.multidex:multidex:2.0.1' // 若还在用support库 // implementation 'com.android.support:multidex:1.0.3'
2. 强制把Crashlytics核心类放进主DEX
Dalvik只会优先加载主DEX里的类,所以必须把Crashlytics的初始化相关类强制打包进主DEX,有两种方式可选:
方式一:用multiDexKeepFile配置
在app/src/main目录下新建multidex-config.txt文件,写入需要放入主DEX的类全路径:
com/crashlytics/android/CrashlyticsInitProvider.class com/crashlytics/android/Crashlytics.class com/crashlytics/core/CrashlyticsCore.class io/fabric/sdk/android/Fabric.class
然后在build.gradle的android块里关联这个文件:
android { buildTypes { release { multiDexKeepFile file('src/main/multidex-config.txt') } debug { // 调试模式也加上,避免调试时踩同样的坑 multiDexKeepFile file('src/main/multidex-config.txt') } } }
方式二:用ProGuard规则配置(更推荐)
如果你项目用了ProGuard混淆,直接在proguard-rules.pro里添加:
-keep class com.crashlytics.android.CrashlyticsInitProvider { *; } -keep class com.crashlytics.android.** { *; } -keep class io.fabric.sdk.android.** { *; }
然后在build.gradle里指定用这个ProGuard文件来筛选主DEX类:
android { buildTypes { release { multiDexKeepProguard file('proguard-rules.pro') } debug { multiDexKeepProguard file('proguard-rules.pro') } } }
3. 配置Application类支持MultiDex
如果你的项目没有自定义Application类,就新建一个继承MultiDexApplication;如果已经有自定义Application,就重写attachBaseContext方法:
情况1:无自定义Application
新建MyApplication.java:
public class MyApplication extends MultiDexApplication { @Override public void onCreate() { super.onCreate(); // 如果之前没开启自动初始化,在这里手动初始化Fabric // Fabric.with(this, new Crashlytics()); } }
然后在AndroidManifest.xml的application标签里指定这个类:
<application android:name=".MyApplication" <!-- 其他属性 --> >
情况2:已有自定义Application
修改你的Application类,添加MultiDex初始化逻辑:
public class MyApplication extends YourBaseApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // 必须在super之后调用,确保MultiDex正确初始化 MultiDex.install(this); } @Override public void onCreate() { super.onCreate(); // 按需初始化Fabric // Fabric.with(this, new Crashlytics()); } }
4. 清理缓存重新构建
最后一定要执行清缓存+重构建操作,避免旧的编译产物干扰:
- Android Studio里点击
Build -> Clean Project,再点Build -> Rebuild Project - 或者用命令行:
./gradlew clean assembleDebug(Windows用gradlew clean assembleDebug)
另外提一句:现在Fabric已经整合到Firebase Crashlytics了,如果是旧版本的Fabric依赖,建议升级到最新的Firebase版本;如果坚持用旧Fabric,确保依赖版本正确:
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'io.fabric.sdk.android:fabric:1.4.0'
测试的时候一定要用Android 5.0以下的真机或模拟器验证,确保问题彻底解决。
内容的提问来源于stack exchange,提问作者Ali Modarres

