The problem may be caused by conflicting versions of the
com.google.android.gms:play-services-basement
dependency, which is implicitly required by more than one higher-level dependencies in your
build.gradle.
The following steps describe how to diagnose a similar issue with the
com.google.android.gms:play-services-ads-identifier
dependency (used in the examples below).
"App" is used as an example, so please replace it with the actual name of your app module.
Prerequisites (initial problematic case):
My
build.gradle file contains the following:
...
implementation 'com.google.android.gms:play-services-ads:15.0.1'
implementation 'com.google.android.gms:play-services-analytics:17.0.0'
...
当未选择“离线工作”时,运行Gradle同步正常。但是一旦我打开“离线工作”,在gradle同步期间会弹出以下错误:
:app@debug/compileClasspath': Could not resolve com.google.android.gms:play-services-ads-identifier:[15.0.1,16.0.0).
Disable offline mode and sync project
Show Details
Affected Modules: app
...
诊断步骤:
- 打印所有引用 play-services-ads-identifier 依赖项的位置
./gradlew :app:dependencyInsight --configuration releaseRuntimeClasspath --dependency "com.google.android.gms:play-services-ads-identifier"
在我的情况下,我看到了所有输出中的以下行:
...
com.google.android.gms:play-services-ads-identifier:17.0.0
+--- com.google.android.gms:play-services-analytics-impl:17.0.0
| +--- com.google.android.gms:play-services-analytics:17.0.0 (requested com.google.android.gms:play-services-analytics-impl:[17.0.0])
| |
...
...
com.google.android.gms:play-services-ads-identifier:[15.0.1,16.0.0) -> 17.0.0
\--- com.google.android.gms:play-services-ads:15.0.1
+--- releaseRuntimeClasspath
...
这行代码
com.google.android.gms:play-services-ads-identifier:[15.0.1,16.0.0) -> 17.0.0
这句话的意思是发生了冲突,
play-services-ads-identifier 的版本被解析为17.0.0,而最初请求的版本是15.0.1。
2. 接下来最重要的事情是查看
play-services-ads-identifier的引用来源。在依赖项名称之后的下一行中指定了这一点,在我特定的情况下,这些源是:
- com.google.android.gms:play-services-analytics-impl:17.0.0
- com.google.android.gms:play-services-ads:15.0.1
由于我知道这两个依赖项是我的顶级依赖项(即明确指定在build.gradle中),现在我有以下解决问题的选项。
解决方案1
我可以通过在app模块的build.gradle中将com.google.android.gms:play-services-ads:15.0.1
升级到com.google.android.gms:play-services-ads:17.0.0
来避免版本冲突。这样做可以使Gradle在选择离线工作时成功同步。
解决方案2
保留依赖但排除冲突的模块。即更改
implementation 'com.google.android.gms:play-services-ads:15.0.1'
to
implementation ('com.google.android.gms:play-services-ads:15.0.1') {
exclude group: 'com.google.android.gms', module: 'play-services-ads-identifier'
}
完成这个步骤后,我将面临更多的同步错误,因为更多的底层依赖项存在冲突。因此,最终结果如下:
implementation ('com.google.android.gms:play-services-ads:15.0.1') {
exclude group: 'com.google.android.gms', module: 'play-services-ads-identifier'
exclude group: 'com.google.android.gms', module: 'play-services-base'
exclude group: 'com.google.android.gms', module: 'play-services-basement'
}
这使得Gradle也可以
离线工作。
注意:在您的情况下,导致冲突的源依赖项可能会在上面显示的
dependencyInsight命令的类似树形输出中被找到。
我使用的开发环境是:
macOS 上的 Android Studio v3.5.2,Gradle 插件版本为 v3.5.2,Gradle 版本为 v5.6.4。