web-dev-qa-db-fra.com

Erreur de création de tests Android: plusieurs fichiers dex définissent Landroid/support/test/BuildConfig

J'essaie d'ajouter Espresso 2 à mon projet (qui comporte également de nombreuses autres dépendances), mais je rencontre cette erreur en essayant d'exécuter des tests:

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 version non testée fonctionne bien. 

Quelqu'un at-il des conseils sur la meilleure façon de déboguer cela?

J'ai essayé d'exécuter ./gradlew -q :<my_project>:dependencies, mais je ne vois aucun problème évident (bien que je ne sache pas grand chose à propos de l'interprétation de sa sortie):

<snip>

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

<snip>

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

<snip>

J'ai également essayé de chercher dans les sous-dossiers de mon répertoire build/intermediates, mais je ne voyais pas d'armes à fumer (bien que je ne sois pas sûr de chercher dans tous les fichiers JAR de dépendance externe de la bonne façon).

Voici la section de dépendance de mon 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'
}

Mise à jour: lors de la mise à jour de com.Android.tools.build:gradle:1.0.0 à com.Android.tools.build:gradle:1.1.1, je reçois cet avertissement:

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

Mise à jour (09/07/2015):

Vous pouvez continuer à travailler avec 22.2.1 si vous utilisez les exclusions suivants:

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 vous dépendez de espresso-contrib, vous aurez également besoin de l'exclusion.

Mise à jour (8/03/2015):

Avec la bibliothèque de support 22.2.1, les dépendances sont à nouveau rompues; veuillez ne pas passer à 22.2.1 tant qu'un nouveau coureur n'est pas publié.

Mise à jour (6/04/2015):

Avec la dernière version de Runner 0.3 et les règles 0.3, cette réponse n’est plus nécessaire. Vous pouvez simplement utiliser

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'

avec les dernières bibliothèques de support. (22.2.0 au moment de l'écriture)

Mise à jour (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

Mise à jour (24/04/2015):

Le problème est que com.Android.support:support-v4:22.1.1 se heurte à com.Android.support.test:runner:0.2 (car cela dépend de com.Android.support:support-v4:22.0.0). 

com.Android.support.test.espresso:espresso-core:2.1 a une dépendance sur com.Android.support.test:runner:0.2, de sorte qu'il provoque également la même erreur. 

Donc, cette combinaison fonctionnera:

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

... et celui-ci aussi (sans'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'

Réponse originale:

Contrairement à ce que dit la documentation Espresso , vous devez supprimer cette dépendance:

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

Comme c'est la cause du conflit de version de bibliothèque.

Vous devez également mettre à jour Android gradle plugin 1.1.1, car cette version vous indiquera le conflit de version exact, ce qui est utile dans ce cas.

46
Yenchi

Une autre astuce utile consiste à forcer la résolution des dépendances vers une version spécifique.

Voici un moyen:

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

... et en voici un autre:

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

L'utilisation de l'un ou l'autre avec com.Android.support.test.espresso:espresso-core:2.1 devrait fonctionner.

Voir la section Forcing consistent version for a group of libraries dans la documentation Gradle pour plus d'informations.

6
Dan J

J'ai récemment rencontré cette erreur après que nous ayons activé les versions de gradation incrémentielles.

dexOptions {
    javaMaxHeapSize "2g"
    incremental true
}

Ce problème a été résolu en désactivant les bibliothèques de prédexage.

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

Ma solution:

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'
   }
}
3
Max Kammerer

J'ai eu cette erreur en essayant de configurer Espresso aussi. Essayez d'utiliser espresso-contrib:2.1, pas 2.0

1
c2knaps

Essayez d’exclure ce qui suit de l’espresso (un à la fois):

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

Probablement besoin de faire la même chose avec runner

0
Eric

Selon ce rapport de bogue , vous pouvez également utiliser resolutionStrategy:

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

C’est la solution qui a fonctionné pour moi et m’a permis d’utiliser les versions les plus récentes d’appcompat-v7 et d’appcompat-v4.

0
Code-Apprentice