升级Gradle及Firebase插件后出现任务循环依赖问题
问题描述
将依赖版本从:
androidGradlePlugin = "8.2.2" firebaseBom = "32.8.1" firebaseCrashlyticsPlugin = "2.9.9"
升级至:
androidGradlePlugin = "8.4.0" firebaseBom = "33.0.0" firebaseCrashlyticsPlugin = "3.0.0"
之后项目无法构建,报错信息如下:
Circular dependency between the following tasks: :app:dataBindingGenBaseClassesDebug \--- :app:mergeDebugResources +--- :app:generateDebugLocaleConfig | \--- :app:extractDebugSupportedLocales | \--- :app:injectCrashlyticsMappingFileIdDebug | +--- :app:dataBindingGenBaseClassesDebug (*) | \--- :app:kspDebugKotlin | +--- :app:dataBindingGenBaseClassesDebug (*) | \--- :app:processDebugResources | +--- :app:mapDebugSourceSetPaths | | \--- :app:injectCrashlyticsMappingFileIdDebug (*) | +--- :app:mergeDebugResources (*) | +--- :app:processDebugManifest | | \--- :app:processDebugMainManifest | | \--- :app:extractDeepLinksDebug | | \--- :app:injectCrashlyticsMappingFileIdDebug (*) | \--- :app:processDebugManifestForPackage | \--- :app:processDebugManifest (*) \--- :app:injectCrashlyticsMappingFileIdDebug (*)
注意到injectCrashlyticsMappingFileIdDebug多次出现,请问这是什么原因?
另外,使用firebaseCrashlyticsPlugin = "2.9.9"配合以下最新版本依赖时项目可正常构建:
androidGradlePlugin = "8.4.0" firebaseBom = "33.0.0"
但当时为解决使用最新Gradle插件版本时的清单合并问题,需在Manifest中添加以下配置:
<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/gma_ad_services_config" tools:replace="android:resource" />
问题分析与解决方案
循环依赖原因
这是Firebase Crashlytics 3.0.0插件与AGP 8.4.0的任务依赖兼容性bug。
injectCrashlyticsMappingFileIdDebug是Crashlytics 3.0.0新增的任务,作用是将映射文件ID注入构建流程。但该版本插件错误地配置了任务依赖:它依赖dataBindingGenBaseClassesDebug,而dataBindingGenBaseClassesDebug又依赖mergeDebugResources,最终绕回injectCrashlyticsMappingFileIdDebug,形成闭环依赖链。
这类问题通常是插件适配新版AGP时,任务依赖的顺序或关联关系未调整到位导致的。
解决办法
- 降级Crashlytics插件到兼容版本:
暂时保留firebaseCrashlyticsPlugin = "2.9.9"搭配AGP 8.4.0和Firebase BOM 33.0.0使用,这是已验证的可行方案,只需保留Manifest中的AD服务配置即可正常构建。 - 等待官方修复:
这类兼容性bug属于插件自身问题,Firebase团队通常会在后续小版本更新中修复。可关注Firebase发布日志,待Crashlytics插件推出3.0.x修复版本后再升级。 - 临时调整任务依赖(不推荐):
如果必须使用3.0.0版本,可尝试在Gradle脚本中手动打破循环依赖,但可能引发其他构建问题,仅作应急使用:tasks.named("injectCrashlyticsMappingFileIdDebug") { dependsOn.remove("dataBindingGenBaseClassesDebug") }
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

