如何解决由Gradle插件创建的依赖冲突?

4
我正在尝试更新我的Android O应用程序,为此需要更新以支持库版本26。
我的compileSdkVersion是26,targetSdkVersion是26,buildToolsVersion是26.0.1,支持库版本是26.0.1,play services/firebase messaging版本是11.0.4。我使用的Android Studio 3.0 b2和android gradle插件3.0.0-beta2。看起来这个版本对支持库的冲突更加敏感。
由于play services和firebase链接旧版本的支持库,因此我不得不手动排除支持依赖项以解决冲突:
implementation("com.google.android.gms:play-services-auth:$playServicesVersion",{
    exclude group: 'com.android.support'
})

implementation("com.google.android.gms:play-services-identity:$playServicesVersion",{
    exclude group: 'com.android.support'
})

implementation("com.google.android.gms:play-services-base:$playServicesVersion",{
    exclude group: 'com.android.support'
})

implementation("com.google.android.gms:play-services-analytics:$playServicesVersion",{
    exclude group: 'com.android.support'
})

implementation("com.google.firebase:firebase-messaging:$playServicesVersion",{
    exclude group: 'com.android.support'
})

implementation("com.google.firebase:firebase-analytics:$playServicesVersion",{
    exclude group: 'com.android.support'
})

这个解决了我除了一个之外的所有依赖冲突。

Google Play服务/Firebase需要使用google-services gradle插件来解析生成的.json文件并在应用程序中包含必要的密钥/密码。我的build.gradle文件有一个类似于以下的buildscript块:

buildscript {
    repositories {
        maven { url "https://maven.google.com" }
        jcenter()
    }

    dependencies {
        classpath "com.google.gms:google-services:3.1.0"
    }
}

在脚本的末尾,我应用了插件。当apply和classpath被注释掉时,一切都可以正常编译。然而,似乎google-services 3.1.0添加了对支持库版本25.2.0的依赖,我还没有找到如何覆盖它的方法。提示信息是:“Android依赖项'com.android.support:support-v4'在编译(25.2.0)和运行时(26.0.1)类路径中具有不同的版本。您应该通过DependencyResolution手动设置相同的版本。”请注意,我甚至无法降级到support库25.4.0, 因为我会得到相同的错误(只需将上面消息中的26.0.1替换为25.4.0)。唯一可行的版本是25.2.0。使用包含classpath依赖项的命令./gradlew app:dependencies,可以看到如下结果:
compile - Compile dependencies for 'main' sources (deprecated: use 'implementation' instead).
\--- com.google.firebase:firebase-core:11.0.4
     \--- com.google.firebase:firebase-analytics:[11.0.4] -> 11.0.4
          +--- com.google.firebase:firebase-analytics-impl:[11.0.4] -> 11.0.4
          |    +--- com.google.android.gms:play-services-basement:[11.0.4] -> 11.0.4
          |    |    \--- com.android.support:support-v4:25.2.0
          |    |         +--- com.android.support:support-compat:25.2.0
          |    |         |    \--- com.android.support:support-annotations:25.2.0
          |    |         +--- com.android.support:support-media-compat:25.2.0
          |    |         |    +--- com.android.support:support-annotations:25.2.0
          |    |         |    \--- com.android.support:support-compat:25.2.0 (*)
          |    |         +--- com.android.support:support-core-utils:25.2.0
          |    |         |    +--- com.android.support:support-annotations:25.2.0
          |    |         |    \--- com.android.support:support-compat:25.2.0 (*)
          |    |         +--- com.android.support:support-core-ui:25.2.0
          |    |         |    +--- com.android.support:support-annotations:25.2.0
          |    |         |    \--- com.android.support:support-compat:25.2.0 (*)
          |    |         \--- com.android.support:support-fragment:25.2.0
          |    |              +--- com.android.support:support-compat:25.2.0 (*)
          |    |              +--- com.android.support:support-media-compat:25.2.0 (*)
          |    |              +--- com.android.support:support-core-ui:25.2.0 (*)
          |    |              \--- com.android.support:support-core-utils:25.2.0 (*)
          |    +--- com.google.firebase:firebase-iid:[11.0.4] -> 11.0.4
          |    |    +--- com.google.android.gms:play-services-basement:[11.0.4] -> 11.0.4 (*)
          |    |    \--- com.google.firebase:firebase-common:[11.0.4] -> 11.0.4
          |    |         +--- com.google.android.gms:play-services-basement:[11.0.4] -> 11.0.4 (*)
          |    |         \--- com.google.android.gms:play-services-tasks:[11.0.4] -> 11.0.4
          |    |              \--- com.google.android.gms:play-services-basement:[11.0.4] -> 11.0.4 (*)
          |    +--- com.google.firebase:firebase-common:[11.0.4] -> 11.0.4 (*)
          |    \--- com.google.android.gms:play-services-tasks:[11.0.4] -> 11.0.4 (*)
          +--- com.google.android.gms:play-services-basement:[11.0.4] -> 11.0.4 (*)
          \--- com.google.firebase:firebase-common:[11.0.4] -> 11.0.4 (*)

为什么你需要排除任何东西?它应该可以正常工作。 - creativecreatorormaybenot
看起来安卓Gradle插件(3.0.0-beta2)对于支持库冲突更加严格。所以它并不能“完美运行”。移除classpath "com.google.gms:google-services:3.1.0"(和apply那一行),应用程序就可以编译,但如果保留这行代码,则无法编译。 - Mark
你能发布一下你的应用级别依赖吗? 我使用Firebase-UI和google-services插件时遇到了类似的错误。 我通过单独添加我使用的所有Firebase依赖项来解决了这个问题。 之后它就正常工作了,我不需要排除任何东西。 - Ro Ra
2个回答

5
configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            def requested = details.requested
            if (requested.group == 'com.android.support') {
                if (!requested.name.startsWith("multidex")) {
                    details.useVersion '26.0.1'
                }
            }
        }
    }

像这样,您的支持库应该都使用相同的版本进行编译。只需在模块级别的Gradle构建脚本中添加代码片段到依赖项中即可。

0

看起来问题实际上与通过子模块包含的依赖项有关。支持库是通过一个常见的子模块包含的,例如:

implementation project(':common')

我也尝试过:

implementation(project(':common'),{transitive = true})

但这没有任何影响。

唯一有效的方法是直接在我的顶级 build.gradle 中包含支持库。


看来我的其他模块依赖都没有被包括在内 - 每个模块都必须明确定义 - 无论传递是否打开。 - Mark
为了将依赖项向上传递,而不是使用“implementation”,请使用“api”。 - Mark

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