Android Studio运行应用报错:Program type already exists及Firebase版本冲突警告
嘿,这个问题我之前也踩过坑!本质上这俩问题是同一个根源导致的——Google Play Services(GMS)和Firebase相关库的版本不统一。你看到的Program type already present: com.google.android.gms.common.api.zzf是版本混用引发的类重复冲突,而那个警告也明明白白提示了:你项目里同时存在12.0.1和10.0.1两个版本的GMS/Firebase库(比如play-services-basement:12.0.1和play-services-ads:10.0.1),版本不一致肯定会出兼容性问题。
下面是一步步的解决方法:
1. 统一所有GMS/Firebase库的版本
首先建议在项目根目录的build.gradle(注意是Project级别的那个文件)里定义统一的版本变量,后续维护起来更省心:
buildscript { ext { // 选一个稳定版本,比如用警告里提到的12.0.1,或者更高的兼容稳定版 gms_version = '12.0.1' firebase_version = '12.0.1' } repositories { google() // 优先用Google Maven仓库,能获取到最新稳定版 jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' // 确保Gradle插件版本和GMS版本兼容 classpath "com.google.gms:google-services:4.0.1" // Google Services插件版本也要对应上 } }
然后在Module级别的build.gradle里,把所有用到的GMS/Firebase库都替换成这个统一变量:
dependencies { // 比如原来的play-services-ads改成统一版本 implementation "com.google.android.gms:play-services-ads:$gms_version" // 其他GMS库同理,比如定位、认证等 implementation "com.google.android.gms:play-services-location:$gms_version" // Firebase库也要统一版本 implementation "com.google.firebase:firebase-core:$firebase_version" implementation "com.google.firebase:firebase-auth:$firebase_version" }
⚠️ 一定要仔细检查所有依赖,包括你自己手动加的和第三方库间接引入的,别漏掉任何一个GMS/Firebase相关的库。
2. 排查并排除冲突的间接依赖
有时候第三方库会偷偷引入不同版本的GMS/Firebase库,这时候需要用Gradle依赖树找出这些"隐藏"的冲突:
在Android Studio的Terminal里运行(Windows用户去掉前面的./):
./gradlew app:dependencies
运行后会列出所有依赖的层级关系,找到那些版本不统一的GMS/Firebase依赖,然后在Module的build.gradle里排除掉冲突的版本。比如如果某个第三方库引入了10.0.1的play-services-ads,就这么写:
implementation('com.example:third-party-lib:1.0.0') { exclude group: 'com.google.android.gms', module: 'play-services-ads' }
排除后记得手动添加统一版本的play-services-ads依赖哦。
3. 清理缓存并重建项目
做完上面的操作后,一定要清理旧的编译缓存,避免残留文件干扰:
- 点击顶部菜单栏的
Build→Clean Project - 然后点击
Build→Rebuild Project - 如果还是有问题,可以手动删除项目根目录的
.gradle文件夹和Module里的build文件夹,再重启Android Studio
额外小提示
- 尽量把
google()仓库放在repositories的最前面,这样能优先获取到Google官方的最新稳定版库。 - Google Services插件的版本要和GMS/Firebase版本兼容,一般插件4.x对应GMS/Firebase 12.x及以上版本,如果不确定,Android Studio的提示或者官方文档里会有兼容说明。
内容的提问来源于stack exchange,提问作者TurkC

