Ошибка сборки тестов для Android: несколько файлов dex определяют Landroid / support / test / BuildConfig

Я пытаюсь добавить 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) ... 

Не-тестовая assembly работает нормально.

Есть ли у кого-нибудь советы по наилучшему способу отладки этого?

Я попытался запустить ./gradlew -q ::dependencies , но я не вижу никаких очевидных проблем (хотя я мало знаю об интерпретации его вывода):

  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  

Я также попытался найти вложенные папки моего каталога build/intermediates , но я не видел никаких курящих пушек (хотя я не уверен, что правильно искал все JAR с внешней зависимостью).

Вот раздел зависимостей моего 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:[email protected]') { 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' } 

Обновление: когда я обновляюсь с com.android.tools.build:gradle:1.0.0 до com.android.tools.build:gradle:1.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. 

Обновление (9/07/2015):

Вы можете продолжить работу с 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' } 

Если вы зависите от espresso-contrib , вам тоже нужен исключение.

Обновление (8/03/2015):

В библиотеке поддержки 22.2.1 зависимости снова разбиваются; не обновляйте до 22.2.1 до тех пор, пока не будет выпущен новый бегун.

Обновление (6/04/2015):

С последней версией runner 0.3 и правилами 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):

 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 

Обновление (4/24/2015):

Проблема в том, что com.android.support:support-v4:22.1.1 сталкивается с com.android.support.test:runner:0.2 (так как это зависит от com.android.support:support-v4:22.0.0 ) ,

com.android.support.test.espresso:espresso-core:2.1 имеет зависимость от com.android.support.test:runner:0.2 , поэтому он также вызывает ту же ошибку.

Таким образом, эта комбинация будет работать:

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

... и так будет это ( без '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' 

Оригинальный ответ:

Вопреки тому, что говорит документация Espresso , вы должны удалить эту зависимость:

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 должно работать.

Дополнительную информацию см. В статье «Форсирующая Forcing consistent version for a group of libraries в документации Gradle .

Я недавно столкнулся с этой ошибкой после того, как мы включили инкрементные построения gradleиентов.

 dexOptions { javaMaxHeapSize "2g" incremental true } 

Это было разрешено путем отключения предварительных библиотек.

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

Мое решение:

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

Я получил эту ошибку, пытаясь настроить Espresso. Попробуйте использовать espresso-contrib:2.1 , а не 2.0

Попробуйте исключить следующее из эспрессо (по одному за раз):

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

Вероятно, нужно сделать то же самое с runner

Согласно этому отчету об ошибке , вы также можете использовать resolutionStrategy :

 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.

  • Получить объект JSON из ответа HTTP
  • Показывать только две цифры после десятичной
  • Создание приложения Android Lock Screen.
  • Android: навигационная панель для всех видов деятельности
  • Android onConfigurationChanged не вызывается
  • Оберните строку после нескольких слов по-разному в Java
  • Как разбирать массив JSON с помощью Gson
  • Сравнение значений Integer в Java, странное поведение
  • Android Studio не может разрешить символ, но код выполняется правильно
  • Как удалить все обратные вызовы из обработчика?
  • Поиск количества ядер в Java
  • Давайте будем гением компьютера.