android - Gradle离线同步问题

标签 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.

为什么在上次在线同步期间没有缓存此依赖项?我怎样才能在没有任何互联网连接的情况下构建这个项目?

最佳答案

该问题可能与来自您的构建的多个更高级别依赖项隐式需要的 com.google.android.gms:play-services-basement 依赖项版本冲突有关 .gradle.

以下步骤介绍了如何诊断相同的问题,但具有 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。

  • 接下来最重要要注意的是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。通过升级 com.google.android.gms:play-services-ads:15.0.1com.google.android.gms:play-services-ads:17.0.0 app 模块中的 build.gradle。这样做可以让 Gradle 在选择离线工作时成功同步。

    解决方案2
    保留依赖关系但排除冲突的模块。 IE。改变

    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

    关于android - Gradle离线同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54792730/

    相关文章:

    android - 执行 createChooser(context,intent,IntentSender) 后不调用 BroadcastReceiver

    java - 从 android.support.design.widget.FloatingActionButton 膨胀 float 操作按钮

    java - 当应用程序在后台时 Android 服务停止

    android - 无法获取未知属性 'android'

    android - 建立Android项目失败与gradle

    jar - 使用Gradle任务时出现编译错误

    java - 对于 IntelliJ,与仅导入 Gradle 项目相比,是否有任何理由导入 Eclipse 项目?

    azure - Application Insights 可以离线使用吗

    laravel-4 - 如何离线安装 Laravel 4

    rest - OneDrive API : Unauthenticated, 必须经过身份验证才能使用 '/drive' 语法