Gradle离线同步问题

3

我在离线模式下使用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.

为什么这个依赖在上次在线同步时没有被缓存?我该怎么做才能在没有网络连接的情况下构建这个项目?

你找到解决方案了吗? - Mariusz
1
@Mariusz,请检查我下面的答案:https://dev59.com/vLHma4cB1Zd3GeqPUP8P#59121559 - vladZams
1个回答

1
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
...

诊断步骤:

  1. 打印所有引用 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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接