Java Android测试生成错误:多个dex文件定义Landroid/support/test/BuildConfig

Java Android测试生成错误:多个dex文件定义Landroid/support/test/BuildConfig,java,android,android-gradle-plugin,build.gradle,android-espresso,Java,Android,Android Gradle Plugin,Build.gradle,Android Espresso,我正在尝试将Espresso 2添加到我的项目中(该项目还具有许多其他依赖项),但在尝试运行测试时遇到了以下错误: UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Landroid/support/test/BuildConfig; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.jav

我正在尝试将Espresso 2添加到我的项目中(该项目还具有许多其他依赖项),但在尝试运行测试时遇到了以下错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/test/BuildConfig;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
    ...
非测试构建工作正常

有人对调试这个的最佳方法有什么建议吗?

我试过运行
/gradlew-q::dependencies
,但我看不到任何明显的问题(尽管我对解释其输出不太了解):

更新:当我从
com.android.tools.build:gradle:1.0.0
更新到
com.android.tools.build:gradle:1.1
时,我收到以下警告:

Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (22.1.0) and test app (22.0.0) differ.

尝试从浓缩咖啡中排除以下内容(一次一个):


可能需要对runner执行相同的操作,我在尝试设置浓缩咖啡时也遇到了此错误。试用
espresso contrib:2.1
,而非
2.0

更新(2015年7月9日): 如果使用以下排除项,则可以继续使用22.2.1:

androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2') {
    exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile ('com.android.support.test:runner:0.3') {
    exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile ('com.android.support.test:rules:0.3') {
    exclude group: 'com.android.support', module: 'support-annotations'
}
如果您依赖于
意式浓缩咖啡
,则还需要排除

更新(8/03/2015): 在支持库22.2.1中,依赖关系再次被打破;在发布新的runner之前,请不要升级到22.2.1

更新(6/04/2015): 在最新版本的runner 0.3和rules 0.3中,不再需要这个答案。你可以简单地使用

androidTestCompile 'com.android.support.test:runner:0.3'
androidTestCompile 'com.android.support.test:rules:0.3'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
使用最新的支持库。(
22.2.0
撰写本文时)

更新(5/30/2015): …这一个也将如此(没有
'com.android.support.test:runner:0.2'
):

原始答复: 与此相反,您应该删除此依赖项:

androidTestCompile'com.android.support.test:runner:0.2'

因为它是库版本冲突的原因


您还应该更新到Android gradle插件1.1.1,因为该版本将告诉您确切的版本冲突,这在本例中非常有用。

另一个有用的提示是如何强制将依赖项解析为特定版本

这里有一个方法:

configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.0.0'
}
…还有一个:

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.group == 'com.android.support') {
            details.useVersion '22.0.0'
        }
    }
}
com.android.support.test.espresso:espresso-core:2.1
中使用这两个选项中的任何一个都可以

有关详细信息,请参阅中的强制一组库的一致版本部分。

我的解决方案:

compile 'com.android.support:appcompat-v7:22.1.0'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
androidTestCompile 'com.android.support:support-annotations:22.1.0'
androidTestCompile 'com.android.support.test:runner:0.2'
+


我最近在启用增量gradle构建后遇到了这个错误

dexOptions {
    javaMaxHeapSize "2g"
    incremental true
}
这可以通过禁用预先退出库来解决

dexOptions {
    javaMaxHeapSize "2g"
    incremental true
    preDexLibraries = false
}
根据,您还可以使用
解决方案策略

allprojects {
    repositories {
        mavenCentral()
        maven {
            url 'http://download.crashlytics.com/maven'
        }
    }
    configurations.all {
        resolutionStrategy.force 'com.android.support:support-annotations:22.2.0'
    }
}

这是一个适合我的解决方案,允许我使用最新版本的appcompat-v7和appcompat-v4。

发布您的
build.gradle。
还记得错误之前添加的最后一个依赖项吗?你有这么多。我们也不知道什么是
编译文件树(dir:'libs',包括:'*.jar')
编译项目(':CookbriteJava')
编译项目(':camera')
。我认为Gradle
依赖项任务的输出显示了你需要的一切?我也会用build.gradle更新这个问题。我最近在Espresso列表中添加了最后两个,为了克服一个非常类似的错误,我不得不更新我的支持库和Google Play Services依赖项,并删除AssertJ。espresso contrib:2.1包含对android支持库22.0.0的引用,在本例中,它与22.1.1冲突。不完全是,Gradle通常很聪明,可以使用新版本。为什么
espresso core
vs
espresso contrib
?@IgorGanapolsky espresso contrib 2.1用于包含test runner 0.2 jar文件,该文件与支持库22.1也存在兼容性问题。关于何时应该使用espresso contrib的更一般性讨论,请检查您是否需要使用removing
com.android.support.test:testing support lib:0.1
dependency解决了我的问题中列出的任何类。谢谢有什么消息吗
compile'com.android.support:support annotations:22.2.1'
也被破坏了:-/I在使用
espresso contrib:2.0
时仍然会遇到这种情况。如何修复此问题?使用
preDexLibraries=false
的缺点是什么?这对我来说是可行的,但是我会遇到性能问题吗?
configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.0.0'
}
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.group == 'com.android.support') {
            details.useVersion '22.0.0'
        }
    }
}
compile 'com.android.support:appcompat-v7:22.1.0'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
androidTestCompile 'com.android.support:support-annotations:22.1.0'
androidTestCompile 'com.android.support.test:runner:0.2'
android {
    packagingOptions {
        exclude 'LICENSE.txt'
   }
}
dexOptions {
    javaMaxHeapSize "2g"
    incremental true
}
dexOptions {
    javaMaxHeapSize "2g"
    incremental true
    preDexLibraries = false
}
allprojects {
    repositories {
        mavenCentral()
        maven {
            url 'http://download.crashlytics.com/maven'
        }
    }
    configurations.all {
        resolutionStrategy.force 'com.android.support:support-annotations:22.2.0'
    }
}