Gradle传递依赖版本未生效:play-services-tasks超出设定范围
为什么版本范围没起作用?
你遇到的核心问题是Maven的版本范围约束在Gradle依赖解析中不具备强制性。Gradle默认的依赖解析策略是选择所有依赖路径中版本最高的那个,哪怕某个库指定了版本范围,只要有其他依赖(比如firebase-crashlytics)引入了更高版本的play-services-tasks,Gradle就会优先选高版本,而且不会触发报错——因为版本范围只是“建议”,不是“强制要求”。
另外,你的库用Maven(pom.xml)构建,但应用用Gradle,两者对版本范围的处理逻辑有差异:Maven的范围在依赖传递时只是给下游一个版本建议,Gradle不会严格遵守这个范围,除非你显式添加强制约束。
解决办法
1. 在你的库中添加强制版本约束
如果希望所有依赖你的库的应用都必须使用[17.2,17.3)范围内的版本,可以在库的pom.xml中通过dependencyManagement块来强制约束:
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.android.gms</groupId> <artifactId>play-services-tasks</artifactId> <version>[17.2,17.3)</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
2. 在应用端主动锁定版本
如果无法修改库的配置,可以在应用的build.gradle.kts中用resolutionStrategy锁定play-services-tasks的版本:
configurations.all { resolutionStrategy { force("com.google.android.gms:play-services-tasks:17.2.1") } }
也可以用Gradle版本目录(libs.versions.toml)统一管理,确保所有依赖都指向指定范围:
[versions] gmsTasks = "[17.2,17.3)" [libraries] gms-tasks = { group = "com.google.android.gms", name = "play-services-tasks", version.ref = "gmsTasks" }
3. 对齐Firebase与GMS服务版本
注意:Firebase依赖和Google Play Services依赖通常需要版本对齐,firebase-crashlytics引入18.1.0的play-services-tasks,说明你使用的Crashlytics版本对应的GMS服务版本就是18.x。强行降级tasks版本可能出现兼容性问题,这种情况下可以:
- 升级你的库,将play-services-tasks的版本范围调整为兼容18.x的版本(比如
[18.0,19)) - 降级firebase-crashlytics的版本,使其引入的tasks版本落在
[17.2,17.3)范围内
内容的提问来源于stack exchange,提问作者Edmund Johnson

