studio que from decompilar code classes android gradle android-studio android-gradle

que - Android Gradle DexException: Múltiples archivos dex definen Lorg/hamcrest/Descripción



smali que es (4)

Mi proyecto dependía de la versión 1.1.1 de json-simple , que por alguna razón tiene una dependencia en tiempo de ejecución en la versión 4.1.0 de junit, que a su vez depende de Hamcrest . Podría ver esto si gradle dependencies o, alternativamente, inspeccionando el joma-simple POM.xml .

// compile - Classpath for compiling the main sources. /--- com.googlecode.json-simple:json-simple:1.1.1 /--- junit:junit:4.10 /--- org.hamcrest:hamcrest-core:1.1

Excluir el artefacto junit de json-simple me permitió construir.

dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) compile (''com.googlecode.json-simple:json-simple:1.1.1'') { exclude module: ''junit'' } }

com.android.dex.DexException: Múltiples archivos dex definen Lorg / hamcrest / Descripción

que ocurre al intentar hacer una compilación / prueba de depuración, ya sea a través de Android Studio o a través de la línea de comandos de Gradle en mi aplicación.

La versión de lanzamiento (sin pruebas) funciona bien, pero tan pronto como se incluyen las pruebas ( hamcrest es una biblioteca de prueba), la construcción falla con el error anterior.

Revisé las dependencias de mi módulo y no hay requisitos duplicados que las dependencias gradle -q corroboren.

Proyecto settings.gradle

include '':[library module]'' include '':[main module]''

Proyecto build.gradle

buildscript { repositories { mavenCentral() } dependencies { classpath ''com.android.tools.build:gradle:0.9.+'' classpath ''org.robolectric.gradle:gradle-android-test-plugin:0.9.+'' } } allprojects { repositories { mavenCentral() } }

[módulo de biblioteca] build.gradle

apply plugin: ''android-library'' android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersion 14 targetSdkVersion 19 } packagingOptions { exclude ''META-INF/LICENSE.txt'' exclude ''META-INF/NOTICE.txt'' } } dependencies { compile ''com.google.zxing:core:3.0.+'' compile ''com.bugsnag:bugsnag-android:2.1.1+'' }

[módulo principal] build.gradle

apply plugin: ''android'' android { signingConfigs { release { [...] } } sourceSets { main { manifest.srcFile ''src/main/AndroidManifest.xml'' res.srcDirs = [''src/main/res''] } androidTest { setRoot(''src/test'') } instrumentTest { } } compileSdkVersion 19 buildToolsVersion ''19.0.0'' defaultConfig { minSdkVersion 14 targetSdkVersion 19 testPackageName "[main.packageName].tests" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.txt'' } } packagingOptions { exclude ''META-INF/LICENSE.txt'' exclude ''META-INF/NOTICE.txt'' } } apply plugin: ''android-test'' androidTest { // configure the set of classes for JUnit tests include ''**/*Test.class'' // configure max heap size of the test JVM maxHeapSize = "2048m" } repositories { maven { url ''https://repo.commonsware.com.s3.amazonaws.com'' } maven { url ''https://oss.sonatype.org/content/repositories/snapshots/'' } } dependencies { androidTestCompile ''junit:junit:4.10'' androidTestCompile ''org.robolectric:robolectric:2.3-SNAPSHOT'' androidTestCompile ''com.squareup:fest-android:1.0.+'' compile project('':[library module]'') compile ''com.github.gabrielemariotti.changeloglib:library:1.4.+'' compile ''com.google.code.gson:gson:2.2.4'' compile ''com.google.android.gms:play-services:+'' compile ''com.android.support:appcompat-v7:+'' compile (''de.keyboardsurfer.android.widget:crouton:1.8.+'') { exclude group: ''com.google.android'', module: ''support-v4'' } compile files(''libs/CWAC-LoaderEx.jar'') compile ''com.squareup.okhttp:okhttp:1.5.+'' compile ''com.octo.android.robospice:robospice:1.4.11'' compile ''com.octo.android.robospice:robospice-cache:1.4.11'' compile ''com.octo.android.robospice:robospice-retrofit:1.4.11'' compile ''com.commonsware.cwac:security:0.1.+'' compile ''com.readystatesoftware.sqliteasset:sqliteassethelper:+'' }


Resolví el error buscando en Android Studio la clase exacta llamada ''Descripción''. Resultó estar presente en 3 jarras. Uno de junit, uno de una dependencia directa y el otro de mockito.

Resulta que junit, en lugar de una dependencia normal, incluye las clases de Hamcrest en junit jar.

Para poder resolver el problema, incluya junit-dep en lugar de junit.

así que cambia

androidTestCompile (''junit: junit: 4.8. +'')

a

androidTestCompile (''junit: junit-dep: 4.8. +'')

Mockito tiene el mismo problema / solución: use mockito-core.1.9.5.jar en lugar de mockito-all.1.9.5.jar


Robolectric 2.3 depende de JUnit 4.8.1 (versión explícita). Está importando JUnit 4.10 (versión explícita). Es probable que Hamcrest sea simplemente el primero de muchos duplicados que dex se está ahogando: intente cambiar su versión de requisito de JUnit a 4.8+ (o excluyendo a JUnit de la dependencia de Robolectric).


excluir módulo: junit

si está usando json:simple dependencia json:simple