运行时出现java.lang.NoClassDefFoundError错误,启用MultiDex仍未解决
解决
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/api/Api$zzf;错误 问题描述
我在运行Android应用时遇到了以下错误:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/api/Api$zzf;
已经在项目的build.gradle中设置了multiDexEnabled true,但错误依然存在,目前找不到问题根源和有效解决办法。
针对性解决方案
既然已经开启了MultiDex,我们可以从以下几个方向排查修复:
统一Google Play Services依赖版本
这个错误大概率是项目内不同模块的Google Play Services依赖版本不一致导致的。比如有的模块用了com.google.android.gms:play-services-auth:16.0.0,另一个模块却用了com.google.android.gms:play-services-maps:17.0.0,版本差异会触发这类类找不到的问题。
建议在项目根目录的build.gradle中统一定义版本变量,再在各模块中引用:// 根目录build.gradle ext { gms_version = "20.1.0" // 替换为当前稳定兼容的版本 } // 模块build.gradle implementation "com.google.android.gms:play-services-auth:${gms_version}" implementation "com.google.android.gms:play-services-maps:${gms_version}"补全MultiDex完整配置
仅开启multiDexEnabled true可能不够,还需要完成以下步骤:- 如果应用支持API级别低于21,需添加MultiDex依赖:
implementation 'androidx.multidex:multidex:2.0.1' - 自定义Application类继承
MultiDexApplication,或者在现有Application的attachBaseContext方法中初始化MultiDex:
或者:// 方式一:继承MultiDexApplication public class MyApp extends MultiDexApplication { // 你的其他代码 }
最后别忘了在// 方式二:在现有Application中初始化 public class MyApp extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }AndroidManifest.xml中指定这个自定义Application:<application android:name=".MyApp" <!-- 其他配置项 --> >
- 如果应用支持API级别低于21,需添加MultiDex依赖:
清理缓存并重建项目
缓存异常也可能引发这类奇怪问题,执行以下操作:- 点击Android Studio顶部菜单栏的
Build -> Clean Project - 接着点击
Build -> Rebuild Project - 也可以手动删除项目根目录的
.gradle、build文件夹,以及各模块下的build文件夹,再重新构建项目。
- 点击Android Studio顶部菜单栏的
排查并排除依赖冲突
使用Android Studio的Gradle -> app -> Tasks -> android -> dependencies任务查看完整依赖树,找出重复或冲突的Google Play Services依赖,通过排除规则清理冗余依赖:implementation('第三方依赖库:版本号') { exclude group: 'com.google.android.gms' }
内容的提问来源于stack exchange,提问作者Amar Giram
相关产品推荐
相关产品推荐

