Error de comstackción de las pruebas de Android: varios archivos dex definen Landroid / support / test / BuildConfig

Intento agregar Espresso 2 a mi proyecto (que también tiene muchas otras dependencias), pero estoy intentando encontrar este error al intentar ejecutar pruebas:

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) ... 

La construcción sin prueba funciona bien.

¿Alguien tiene algún consejo sobre la mejor manera de depurar esto?

He intentado ejecutar ./gradlew -q ::dependencies , pero no puedo ver ningún problema obvio (aunque no sé mucho acerca de cómo interpretar su resultado):

  androidTestCompile - Classpath for compiling the androidTest sources. +--- com.squareup.spoon:spoon-client:1.1.2 +--- com.google.dexmaker:dexmaker-mockito:1.0 | +--- com.google.dexmaker:dexmaker:1.0 | \--- org.mockito:mockito-core:1.9.5 | +--- org.hamcrest:hamcrest-core:1.1 | \--- org.objenesis:objenesis:1.0 +--- com.google.dexmaker:dexmaker:1.0 +--- org.mockito:mockito-core:1.9.5 (*) +--- com.jayway.android.robotium:robotium-solo:5.3.1 +--- com.android.support.test.espresso:espresso-core:2.0 | +--- com.squareup:javawriter:2.1.1 | +--- org.hamcrest:hamcrest-integration:1.1 | | \--- org.hamcrest:hamcrest-core:1.1 | +--- org.hamcrest:hamcrest-library:1.1 | | \--- org.hamcrest:hamcrest-core:1.1 | +--- javax.inject:javax.inject:1 | +--- com.android.support.test.espresso:espresso-idling-resource:2.0 | +--- com.android.support.test:testing-support-lib:0.1 | | \--- junit:junit-dep:4.10 | | \--- org.hamcrest:hamcrest-core:1.1 | +--- com.google.code.findbugs:jsr305:2.0.1 | +--- javax.annotation:javax.annotation-api:1.2 | \--- org.hamcrest:hamcrest-core:1.1 \--- com.android.support.test:runner:0.2 +--- junit:junit-dep:4.10 (*) +--- com.android.support.test:exposed-instrumentation-api-publish:0.2 \--- com.android.support:support-annotations:22.0.0  compile - Classpath for compiling the main sources. +--- com.android.support:appcompat-v7:22.1.0 | \--- com.android.support:support-v4:22.1.0 | \--- com.android.support:support-annotations:22.1.0 +--- com.android.support:support-v4:22.1.0 (*) +--- com.afollestad:material-dialogs:0.7.2.4 | +--- com.android.support:support-v4:22.0.0 -> 22.1.0 (*) | +--- com.android.support:appcompat-v7:22.0.0 -> 22.1.0 (*) | +--- com.android.support:support-annotations:22.0.0 -> 22.1.0 | \--- com.android.support:recyclerview-v7:22.0.0 | +--- com.android.support:support-v4:22.0.0 -> 22.1.0 (*) | \--- com.android.support:support-annotations:22.0.0 -> 22.1.0 +--- com.google.android.gms:play-services-base:7.0.0 | \--- com.android.support:support-v4:22.0.0 -> 22.1.0 (*) +--- com.google.android.gms:play-services-gcm:7.0.0 | \--- com.google.android.gms:play-services-base:7.0.0 (*) +--- de.greenrobot:greendao:1.3.7 +--- de.greenrobot:eventbus:2.2.0 +--- com.squareup.wire:wire-runtime:1.4.0 | \--- com.squareup.okio:okio:0.6.0 -> 1.0.1 +--- com.squareup.okio:okio:1.0.1 +--- com.squareup.okhttp:okhttp-urlconnection:2.0.0 | \--- com.squareup.okhttp:okhttp:2.0.0 | \--- com.squareup.okio:okio:1.0.0 -> 1.0.1 +--- com.squareup.retrofit:retrofit:1.6.0 | \--- com.google.code.gson:gson:2.2.4 +--- com.squareup.retrofit:converter-wire:1.6.0 | +--- com.squareup.retrofit:retrofit:1.6.0 (*) | \--- com.squareup.wire:wire-runtime:1.2.0 -> 1.4.0 (*) +--- com.squareup.okhttp:okhttp:2.0.0 (*) +--- com.squareup.picasso:picasso:2.4.0 +--- com.path:android-priority-jobqueue:1.1.2 | \--- com.google.android:android:2.2.1 | +--- commons-logging:commons-logging:1.1.1 | +--- org.apache.httpcomponents:httpclient:4.0.1 | | +--- org.apache.httpcomponents:httpcore:4.0.1 | | +--- commons-logging:commons-logging:1.1.1 | | \--- commons-codec:commons-codec:1.3 | +--- org.khronos:opengl-api:gl1.1-android-2.1_r1 | +--- xerces:xmlParserAPIs:2.6.2 | +--- xpp3:xpp3:1.1.4c | \--- org.json:json:20080701 +--- com.netflix.rxjava:rxjava-android:0.16.1 | \--- com.netflix.rxjava:rxjava-core:0.16.1 +--- com.nineoldandroids:library:2.4.0 +--- it.sephiroth.android.library.horizontallistview:hlistview:1.2.2 | \--- com.android.support:support-v4:19.1.+ -> 22.1.0 (*) +--- com.joooonho:selectableroundedimageview:1.0.1 +--- com.crashlytics.sdk.android:crashlytics:2.0.1 | +--- com.crashlytics.sdk.android:answers:1.0.1 | | \--- io.fabric.sdk.android:fabric:1.0.1 | +--- io.fabric.sdk.android:fabric:1.0.1 | \--- com.crashlytics.sdk.android:beta:1.0.1 | \--- io.fabric.sdk.android:fabric:1.0.1 +--- com.mixpanel.android:mixpanel-android:4.5.3 \--- com.facebook.android:facebook-android-sdk:4.0.0 +--- com.android.support:support-v4:[21,22) -> 22.1.0 (*) \--- com.parse.bolts:bolts-android:1.1.4  

También intenté buscar subcarpetas en mi directorio de build/intermediates , pero no pude ver pistolas humeantes (aunque no estoy seguro de estar buscando todas las JAR de dependencia externa de la manera correcta).

Aquí está la sección de dependencia de mi build.gradle:

 dependencies { compile 'com.android.support:appcompat-v7:22.1.0' compile 'com.android.support:support-v4:22.1.0' compile 'com.afollestad:material-dialogs:0.7.2.4' compile 'com.google.android.gms:play-services-base:7.0.0' compile 'com.google.android.gms:play-services-gcm:7.0.0' compile 'de.greenrobot:greendao:1.3.7' compile 'de.greenrobot:eventbus:2.2.0' compile 'com.squareup.wire:wire-runtime:1.4.0' compile 'com.squareup.okio:okio:1.0.1' compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' compile 'com.squareup.retrofit:retrofit:1.6.0' compile 'com.squareup.retrofit:converter-wire:1.6.0' compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.picasso:picasso:2.4.0' compile 'com.path:android-priority-jobqueue:1.1.2' compile 'com.netflix.rxjava:rxjava-android:0.16.1' compile 'com.nineoldandroids:library:2.4.0' compile 'it.sephiroth.android.library.horizontallistview:hlistview:1.2.2' compile 'com.joooonho:selectableroundedimageview:1.0.1' compile('com.crashlytics.sdk.android:crashlytics:2.0.1@aar') { transitive = true; } compile "com.mixpanel.android:mixpanel-android:4.5.3" compile "com.facebook.android:facebook-android-sdk:4.0.0" // For the Rollbar JAR, as it is not available in Maven central compile fileTree(dir: 'libs', include: '*.jar') androidTestCompile 'com.squareup.spoon:spoon-client:1.1.2' androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0' androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile 'org.mockito:mockito-core:1.9.5' androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.3.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' androidTestCompile 'com.android.support.test:runner:0.2' } 

Actualización: cuando actualizo desde com.android.tools.build:gradle:1.0.0 a com.android.tools.build:gradle:1.1.1 , com.android.tools.build:gradle:1.1.1 esta advertencia:

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

Actualización (07/07/2015):

Puede continuar trabajando con 22.2.1 si usa las siguientes exclusiones:

 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' } 

Si usted depende de espresso-contrib , también necesita la exclusión.

Actualización (8/03/2015):

Con la biblioteca de soporte 22.2.1, las dependencias se vuelven a romper; por favor no actualice a 22.2.1 hasta que se libere un nuevo corredor.

Actualización (6/04/2015):

Con la última versión de runner 0.3 y reglas 0.3, esta respuesta ya no es necesaria. Puedes simplemente usar

 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' 

con las últimas bibliotecas de soporte. ( 22.2.0 al momento de escribir esto)

Actualización (30/05/2015):

 compile 'com.android.support:appcompat-v7:22.2.0' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2' // com.android.support.test:testing-support-lib:0.1 // < -- causes issue 

Actualización (4/24/2015):

El problema es que com.android.support:support-v4:22.1.1 está chocando con com.android.support.test:runner:0.2 (ya que eso depende de com.android.support:support-v4:22.0.0 ) .

com.android.support.test.espresso:espresso-core:2.1 tiene una dependencia en com.android.support.test:runner:0.2 , por lo que también causa el mismo error.

Entonces, esta combinación funcionará:

 compile 'com.android.support:support-v4:22.0.0' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1' 

... y este también ( sin 'com.android.support.test:runner:0.2' ):

 compile 'com.android.support:support-v4:22.1.0' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' 

Respuesta Original:

Al contrario de lo que dice la documentación de Espresso , debe eliminar esta dependencia:

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

Como es la causa del conflicto de la versión de la biblioteca.

También debe actualizar a Android gradle plugin 1.1.1, ya que esa versión le dirá el conflicto de versión exacta, que es útil en este caso.

Otro consejo útil es cómo forzar la resolución de dependencia a una versión específica.

Aquí hay una manera:

 configurations.all { resolutionStrategy.force 'com.android.support:support-annotations:22.0.0' } 

… y aquí hay otro:

 configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'com.android.support') { details.useVersion '22.0.0' } } } 

Usando cualquiera de estos con com.android.support.test.espresso:espresso-core:2.1 debería funcionar.

Consulte la sección Forcing consistent version for a group of libraries en la documentación de Gradle para obtener más información.

Recientemente me encontré con este error después de habilitar las comstackciones incrementales de gradle.

 dexOptions { javaMaxHeapSize "2g" incremental true } 

Esto se resolvió desactivando las bibliotecas predefinidas.

 dexOptions { javaMaxHeapSize "2g" incremental true preDexLibraries = false } 

Mi solución:

 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' } } 

Recibí este error al intentar configurar Espresso también. Intente usar espresso-contrib:2.1 , no 2.0

Intente excluir lo siguiente de espresso (uno a la vez):

 androidTestCompile('com.android.support.test.espresso:espresso-core:2.1') { exclude group: 'javax.inject' exclude group: 'com.google.code.findbugs' exclude group: 'com.android.support', module: 'support-annotations' } 

Probablemente necesite hacer lo mismo con el runner

De acuerdo con este informe de error , también puedes usar resolutionStrategy :

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

Esta es la solución que funcionó para mí y me permitió usar la versión más reciente de appcompat-v7 y appcompat-v4.