我的 Android 应用中有 Android 测试的依赖冲突错误

Dependency conflict error in my Android app which has Android Tests

我正在使用 AndroidStudio 和 Gradle 构建我的 Android 应用程序,并在 'androidTest' 源目录中进行测试。我添加了一个新的依赖项,现在在 运行 Android 测试 AndroidStudio 或通过 './gradlew connectedCheck' 时遇到以下问题。解决此问题的首选方法是什么?

'警告:与依赖项冲突 'org.somelibrary:library-core'。应用和测试应用的解析版本不同。'

从 Android Gradle 插件 1.1.1 开始,错误显示如下: "Warning:Conflict with dependency 'com.google.code.findbugs:jsr305'. Resolved versions for app (1.3.9) and test app (2.0.1) differ."

当您为您的应用构建和 运行 Android 测试时,Android Gradle 插件会构建两个 APK(应用和测试 APK)。在 gradle 运行 期间,比较应用程序和测试版本的依赖关系。当版本号相同时,两者中存在的依赖项将从测试构建中删除。当使用相同的依赖项,但版本号不同时,您将需要手动解决依赖项冲突并出现此错误。

要解决冲突,您首先需要找出冲突的两个版本。如果您还没有使用 Android Gradle 插件 v1.1.1+,那么如果您升级到该版本,错误消息将为您提供冲突的版本号。选择你需要的那个。

*在冲突编号之间进行选择时,请务必记住,除非您覆盖了默认的 gradle 依赖项解决策略 (failOnVersionConflict),否则会在应用程序内部发生冲突,并且测试版本(单独)将通过选择更大的版本来解决。

现在您需要决定如何解决冲突。如果您需要强制使用较低版本 (1.2) 的库,您需要强制将应用程序和测试构建的依赖项解析为特定版本的库,如下所示:

// Needed to resolve app vs test dependencies, specifically, transitive dependencies of
// libraryq and libraryz. Forcing the use of the smaller version after regression testing.
configurations.all {
    resolutionStrategy.force 'org.somelibrary:library-core:1.2'
}

如果您需要使用 2.1 版本的依赖项,那么您也可以使用上面的代码片段,但是无论传递性依赖项更新是否需要它,您都永远不会开始使用更新版本的库。或者,您也可以向应用程序或测试构建添加新的正常依赖项(以尝试使用 1.2 版本的依赖项为准)。这将强制应用程序或测试构建依赖于(前面提到的)gradle 依赖项解析策略,因此为该构建使用 2.1 版本的库。

// Force the use of 2.1 because the app requires that version in libraryq transitively.
androidTestCompile 'org.somelibrary:library-core:2.1'

// Force the use of 2.1 because the Android Tests require that version in libraryz.
compile 'org.somelibrary:library-core:2.1'

在此解决方案中,错误可能会再次出现,如果说版本 3.3 开始仅用于测试或应用程序构建之一,但这通常没问题,因为您会在构建时收到另一个不兼容的通知时间,可以采取行动。

更新:这个问题的一些新解决方案现在还列出了从声明的依赖项中排除特定的传递依赖项。这是一个有效的解决方案,但给开发人员带来了更多的责任。与上面的强制依赖项解析建议将版本硬编码到构建中的方式相同,排除传递依赖项解决方案明确地覆盖了库的规定要求。有时库开发人员会遇到错误或解决其他各种库中的错误,因此当您实施这些解决方案时,您可能会冒一些风险,因为可能不得不追查非常隐蔽的错误。

如果您查看(生成的).iml 文件,您可以很容易地看到冲突的版本号。就我而言:

<orderEntry type="library" exported="" scope="TEST" name="support-annotations-20.0.0" level="project" />
<orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />

回到 gradle 插件的 1.0.1 版本可以解决问题。

有类似的问题。 首先 - 我将 gradle 插件升级到 1.1.1(在项目的 gradle 中):

classpath 'com.android.tools.build:gradle:1.1.1'

这帮助我意识到问题出在应用程序指的是:

com.android.support:support-annotations:21.0.3

测试应用指的是:

com.android.support:support-annotations:20.0.0  

(由于指定 androidTestCompile 'com.squareup.assertj:assertj-android-appcompat-v7:1.0.0'

通过指定解决问题:

androidTestCompile 'com.android.support:support-annotations:21.0.3'

或者,可以使用以下方法排除由测试应用依赖项(例如 assertj-android)引入的冲突依赖项(例如支持注释库):

testCompile('com.squareup.assertj:assertj-android:1.0.0') { exclude group: 'com.android.support', module: 'support-annotations' }

Gradle 有 Resolution Strategy Mechanism.

您可以通过在应用级别 build.gradle 文件中添加以下行来解决此冲突:

configurations.all {
    resolutionStrategy {
        force 'com.google.code.findbugs:jsr305:1.3.9', 'com.google.code.findbugs:jsr305:2.0.1'
    }
}