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

时间:2015-02-21 02:39:23

标签: android testing

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

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

从Android Gradle Plugin 1.1.1开始,错误显示如下: “警告:与依赖项冲突'com.google.code.findbugs:jsr305'。应用程序(1.3.9)和测试应用程序(2.0.1)的已解决版本不同。”

5 个答案:

答案 0 :(得分:63)

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

要解决冲突,首先需要弄清楚两个有冲突的版本。如果您尚未使用Android Gradle Plugin 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,开始只在测试或应用程序版本中的一个中使用,但这通常是正常的,因为您将在构建时通知另一个不兼容性,可以采取行动。

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

答案 1 :(得分:20)

有类似的问题。 首先 - 我将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'

答案 2 :(得分:6)

或者,可以通过使用以下内容排除测试应用程序依赖项(例如assertj-android)引入的冲突依赖项(例如支持注释库):

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

答案 3 :(得分:5)

Gradle有Resolution Strategy Mechanism

您可以通过在app level build.gradle文件中添加以下行来解决此冲突:

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

答案 4 :(得分:2)

如果查看(生成的).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版可以解决问题。