添加Google Maps至Android应用时遭遇java.lang.NoClassDefFoundError错误
NoClassDefFoundError错误 我正在给连接Parse服务器的Android应用添加Google Maps Activity,已经完成了地图Activity的添加并创建了对应的API key,但运行应用时出现了如下致命错误:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.parse.starter, PID: 14204 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/internal/zzbq; at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source:2) at android.app.ActivityThread.installProvider(ActivityThread.java:6285) at android.app.ActivityThread.installContentProviders(ActivityThread.java:5851) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5772) at android.app.ActivityThread.-wrap1(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.internal.zzbq" on path: DexPathList[[zip file "/data/app/com.parse.starter-pGR71qLVNb0LE-PnOSAJaA==/base.apk"],nativeLibraryDirectories=[/data/app/com.parse.starter-pGR71qLVNb0LE-PnOSAJaA==/lib/x86, /system/lib, /vendor/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 11 more
我怀疑问题出在Gradle脚本里(相关代码行已经标红),下面是我的两个Gradle文件内容:
顶层build.gradle文件
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { mavenCentral() maven { url 'https://maven.google.com/' name 'Google' } google() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' } } allprojects { repositories { mavenCentral() maven { url 'https://maven.google.com/' name 'Google' } } } ext { compileSdkVersion = 22 buildToolsVersion = "23.0.1" minSdkVersion = 14 targetSdkVersion = 23 }
模块级build.gradle文件
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion '27.0.3' defaultConfig { applicationId "com.parse.starter" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" multiDexEnabled true } dexOptions { javaMaxHeapSize "4g" } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation 'com.android.support.constraint:constraint-layout:1.1.0' implementation 'com.google.android.gms:play-services-maps:15.0.1' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.parse.bolts:bolts-tasks:1.3.0' compile 'com.parse:parse-android:1.13.0' compile 'com.google.android.gms:play-services:9.4.0' compile 'com.android.support:multidex:1.0.0' }
我尝试过更新部分依赖版本(比如compile 'com.android.support:appcompat-v7:23.4.0'这行),但错误还是没解决。我是Android开发新手,对这些文件的逻辑不太熟悉。
补充说明:当我注释掉implementation 'com.google.android.gms:play-services-maps:15.0.1'后,应用能正常运行,但Google Maps功能就用不了了。请问这是不是依赖版本和Gradle版本不兼容导致的?
你的问题确实是Google Play Services依赖版本不兼容导致的——你同时引入了play-services:9.4.0(完整包)和play-services-maps:15.0.1(单独模块),这两个版本差距太大,引发了类找不到的错误。另外,你的Gradle插件版本、支持库版本也和这些服务版本有匹配问题,下面是一步步的修复步骤:
1. 统一Google Play Services依赖版本
首先,移除旧的完整play-services依赖,保留单独的play-services-maps,并且确保所有Google相关依赖使用同一大版本(选一个和你的Gradle插件3.1.2兼容的稳定版本,比如17.0.0)。
修改模块级build.gradle的dependencies块:
dependencies { implementation 'com.android.support.constraint:constraint-layout:1.1.0' // 使用统一的Play Services版本 implementation 'com.google.android.gms:play-services-maps:17.0.0' // 支持库版本和compileSdkVersion保持一致,当前是23.4.0,无需修改 implementation 'com.android.support:appcompat-v7:23.4.0' implementation 'com.parse.bolts:bolts-tasks:1.3.0' implementation 'com.parse:parse-android:1.13.0' // 移除冲突的旧版完整Play Services包 // compile 'com.google.android.gms:play-services:9.4.0' implementation 'com.android.support:multidex:1.0.0' }
2. 对齐compileSdkVersion和支持库版本
你的模块级build.gradle里compileSdkVersion是23,所以所有com.android.support开头的依赖版本都应该是23.x.x,你当前的appcompat-v7:23.4.0是正确的,不用改动。如果后续升级compileSdk,记得同步更新支持库版本。
3. 优化顶层build.gradle配置
确保顶层build.gradle的仓库配置正确,google()仓库优先加载,同时可以统一管理依赖版本,方便后续维护:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() // 优先使用Google官方仓库 mavenCentral() maven { url 'https://maven.google.com/' name 'Google' } } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' } } allprojects { repositories { google() mavenCentral() maven { url 'https://maven.google.com/' name 'Google' } } } ext { compileSdkVersion = 23 // 和模块级配置保持一致 buildToolsVersion = "27.0.3" minSdkVersion = 14 targetSdkVersion = 23 playServicesVersion = "17.0.0" // 统一Play Services版本变量 supportLibVersion = "23.4.0" // 统一支持库版本变量 }
之后模块级可以用变量引用依赖,更简洁:
implementation "com.google.android.gms:play-services-maps:${rootProject.ext.playServicesVersion}" implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
4. 清理并重建项目
做完上述修改后,执行以下操作确保缓存清理干净:
- 点击Android Studio菜单栏的
Build > Clean Project - 然后点击
Build > Rebuild Project - 必要时重启Android Studio(缓存问题有时候需要重启才能彻底解决)
额外注意事项
- 不要同时引入
play-services完整包和单个功能模块(比如maps、location),完整包体积庞大,而且极易和单独模块版本冲突 - 保持所有Google相关依赖(Play Services、Firebase等)版本一致,这是避免类似类找不到错误的核心原则
- 如果后续需要其他Play Services功能,比如定位,直接引入对应的单个模块即可,例如
implementation 'com.google.android.gms:play-services-location:17.0.0'
内容的提问来源于stack exchange,提问作者Jayyunit

