Gradle离线同步问题

时间:2019-02-20 18:08:41

标签: android gradle offline

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

为什么上次在线同步期间未缓存此依存关系?如何在没有任何互联网连接的情况下构建该项目?

1 个答案:

答案 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
...

步骤进行诊断:

  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。

  1. 接下来要看的也是最重要的是引用 play-services-ads-identifier 的地方。这是在输出中在依赖项名称之后的下一行中指定的,在我的特定情况下,这些源是
    1. com.google.android.gms:play-services-analytics-impl:17.0.0
    2. com.google.android.gms:play-services-ads:15.0.1

由于我知道那两个依赖项是我的顶级依赖项(即在 build.gradle 中明确指定)。现在,我有以下解决方案。

解决方案1 ​​
我可以避免版本冲突e。 G。通过升级 在 app 模块的 build.gradle 中从com.google.android.gms:play-services-ads:15.0.1com.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