具有Androidtesting的Android应用程序中的依赖冲突错误

我正在使用AndroidStudio和Gradle在“androidTest”源代码目录中使用testing来构build我的Android应用程序。 我添加了一个新的依赖关系,现在通过AndroidStudio或“./gradlew connectedCheck”运行Androidtesting时会出现以下问题。 什么是解决这个问题的首选方法?

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

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

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

要解决这个冲突,你首先需要弄清楚两个冲突的版本。 如果您尚未使用Android Gradle Plugin v1.1.1 +,那么如果升级到该版本,则错误消息会给您提供相冲突的版本号。 select你需要的一个。

*在冲突数字之间进行select时,请记住,除非您重写默认的Gradle依赖关系parsing策略( failOnVersionConflict ),否则应用程序和testing版本(单独)内部的冲突将通过select更高版本。

现在你需要决定如何解决冲突。 如果您需要强制使用库的较低版本(1.2),则需要强制将应用程序和testing版本的依赖关系parsing为特定版本的库,如下所示:

// 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版本,那么您也可以使用上面的代码片段,但不pipe传递性依赖项更新是否需要,您都不会开始使用较新版本的库。 或者,你也可以添加一个新的正常依赖到应用程序或testing版本(无论是试图使用1.2版本的依赖)。 这将强制应用程序或testing版本依赖于(先前提到的)gradle依赖关系parsing策略,因此使用该版本库的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' 

在这个解决scheme中,如果说版本3.3开始只用于testing版本或应用程序版本中的一个,那么错误可能会重新出现,但这通常是可以的,因为在构build时您会收到另一个不兼容的通知,并且可以采取行动。

更新:这个问题的一些新的解决scheme现在也列出从声明的依赖项中排除特定的传递依赖项。 这是一个有效的解决scheme,但是对开发者提出更多的责任。 与上面的强制依赖解决schemebuild议一样,强制性地将版本编码到构build中,排除 – 传递 – 依赖性解决scheme明确地覆盖了库的陈述要求。 有时候,图书馆开发人员在各种其他图书馆中存在错误或解决错误的问题,所以当你实施这些解决scheme时,你可能需要冒一些风险来追查那些晦涩难懂的错误。

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

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

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

 com.android.support:support-annotations:21.0.3 

而testing应用指的是:

 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' 

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

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

Gradle有解决策略机制 。

您可以通过将以下行添加到应用程序级别的build.gradle文件来解决此冲突:

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

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