我在离线模式下使用gradle时遇到了问题: 当脱机时,我的项目运行良好,然后,我需要脱机工作(因为我要坐火车),并且在不触摸任何gradle文件的情况下,抛出此错误:
> Could not resolve com.google.android.gms:play-services-basement:[15.0.1,16.0.0).
Required by:
project :app > com.google.android.gms:play-services-ads:15.0.1
project :app > com.google.android.gms:play-services-ads-lite:15.0.1
project :app > com.google.android.gms:play-services-gass:15.0.1
> No cached version listing for com.google.android.gms:play-services-basement:[15.0.1,16.0.0) available for offline mode.
为什么上次在线同步期间未缓存此依存关系?如何在没有任何互联网连接的情况下构建该项目?
答案 0 :(得分:1)
问题可能与来自您的 build.gradle 的多个更高级别依赖项隐式要求的com.google.android.gms:play-services-basement
依赖项版本冲突有关。
以下步骤描述了如何诊断相同问题,但具有com.google.android.gms:play-services-ads-identifier
(在下面的示例中使用)相关性。
“ app”为例,因此用您的app_module的实际名称替换 app 。
先决条件(最初有问题的情况):
我的 build.gradle 具有以下内容:
...
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
...
步骤进行诊断:
./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。
由于我知道那两个依赖项是我的顶级依赖项(即在 build.gradle 中明确指定)。现在,我有以下解决方案。
解决方案1
我可以避免版本冲突e。 G。通过升级
在 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'
到
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