升级Firebase依赖后编译失败:Program type already present异常
Program type already present: android.arch.core.util.Function编译错误 看起来你遇到的是典型的依赖冲突问题——多个依赖库引入了相同的android.arch.core.util.Function类,导致D8合并dex时冲突。结合你的情况(无法回退旧依赖、已启用MultiDex),可以按以下步骤解决:
1. 定位冲突来源
首先运行Gradle命令查看项目的依赖树,找出重复引入android.arch.core的依赖:
# Mac/Linux ./gradlew app:dependencies # Windows gradlew.bat app:dependencies
在输出中搜索android.arch.core,你会看到哪些依赖(比如LeakCanary或者其他第三方库)和Firebase/Play Services同时引入了这个模块。
2. 排除重复依赖
找到冲突的依赖后,在对应的依赖声明中排除android.arch.core组。比如如果是LeakCanary导致的冲突,修改你的依赖配置:
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') debugImplementation ('com.squareup.leakcanary:leakcanary-android:1.5.4') { exclude group: 'android.arch.core' } releaseImplementation ('com.squareup.leakcanary:leakcanary-android-no-op:1.5.4') { exclude group: 'android.arch.core' } // 你的Firebase/Play Services依赖... }
3. 统一Firebase/Play Services版本
Google官方强烈建议所有Firebase和Play Services依赖使用相同的版本号,这能避免内部依赖冲突。你可以在根项目的build.gradle中统一管理版本:
// 根build.gradle buildscript { ext { firebase_version = "24.0.0" // 替换为你使用的最新兼容版本 play_services_version = "18.0.0" } // ...其他配置 }
然后在app模块的build.gradle中引用这些版本:
// app/build.gradle implementation "com.google.firebase:firebase-functions:$firebase_version" implementation "com.google.firebase:firebase-auth:$firebase_version" // 其他Firebase/Play Services依赖都使用统一版本号
4. (可选)升级LeakCanary到AndroidX版本
旧版本的LeakCanary(1.x)依赖旧的Android Architecture Components,和最新Firebase的AndroidX依赖容易冲突。如果你的项目已经迁移到AndroidX,可以直接升级LeakCanary到2.x版本:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.12'
同时确保gradle.properties中启用AndroidX和Jetifier:
android.useAndroidX=true android.enableJetifier=true
Jetifier会自动将旧的支持库依赖转换为AndroidX,进一步减少冲突概率。
完成以上步骤后,再次执行Clean-Rebuild,应该就能解决编译错误了。
内容的提问来源于stack exchange,提问作者Dorkmania

