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

Pau*_*ulR 34 testing android

我正在使用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)的已解决版本不同".

Pau*_*ulR 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'
}
Run Code Online (Sandbox Code Playgroud)

如果您需要使用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'
Run Code Online (Sandbox Code Playgroud)

要么

// Force the use of 2.1 because the Android Tests require that version in libraryz.
compile 'org.somelibrary:library-core:2.1'
Run Code Online (Sandbox Code Playgroud)

在这个解决方案中,错误可能重新出现,如果说版本3.3,开始只在测试或应用程序版本之一中使用,但这通常是正常的,因为您将在构建时通知另一个不兼容并可以采取行动.

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


小智 20

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

classpath 'com.android.tools.build:gradle:1.1.1'
Run Code Online (Sandbox Code Playgroud)

这让我意识到问题是应用程序指的是:

com.android.support:support-annotations:21.0.3
Run Code Online (Sandbox Code Playgroud)

虽然测试应用程序指的是:

com.android.support:support-annotations:20.0.0  
Run Code Online (Sandbox Code Playgroud)

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

通过指定来解决它:

androidTestCompile 'com.android.support:support-annotations:21.0.3'
Run Code Online (Sandbox Code Playgroud)


Gio*_*fas 6

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

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


Sag*_*hod 5

Gradle有决议战略机制.

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

configurations.all {
    resolutionStrategy {
        force 'com.google.code.findbugs:jsr305:1.3.9', 'com.google.code.findbugs:jsr305:2.0.1'
    }
}
Run Code Online (Sandbox Code Playgroud)