DexIndexOverflowException solo cuando se ejecutan pruebas

Puedo construir y ejecutar satisfactoriamente mi aplicación de Android en mis variantes de depuración y lanzamiento sin ningún problema. Sin embargo, cuando trato de ejecutar mis nuevas pruebas unitarias (nunca las tuve antes), recibo la temida DexIndexOverflowException . Sospecho que ProGuard no se está ejecutando con mis pruebas unitarias, pero es con mis depuración y lanzamiento normales buildTypes.

¿Qué debo hacer para ejecutar ProGuard en la configuración de ejecución de prueba de mi unidad? Busqué a través de la documentación de Gradle , la documentación de ProGuard y la documentación de Android Studio para resolver esto, pero no encontré nada.

     com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 

    Los archivos de la aplicación Android (APK) contienen archivos ejecutables bytecode en forma de archivos ejecutables Dalvik (DEX), que contienen el código comstackdo utilizado para ejecutar su aplicación. La especificación del ejecutable de Dalvik limita el número total de métodos a los que se puede hacer referencia en un único archivo DEX a 65.536, incluidos los métodos de Framework de Android, los métodos de biblioteca y los métodos en su propio código. Superar este límite requiere que configure el proceso de comstackción de su aplicación para generar más de un archivo DEX, conocido como configuración multidex.

    El complemento Android para Gradle disponible en Android SDK Build Tools 21.1 y versiones posteriores admite multidex como parte de su configuración de comstackción. Asegúrese de actualizar las herramientas de Herramientas de comstackción de Android SDK y el Repositorio de soporte de Android a la última versión utilizando el Administrador de SDK antes de intentar configurar su aplicación para multidex.

    Configurar su proyecto de desarrollo de aplicaciones para usar una configuración multidex requiere que realice algunas modificaciones en su proyecto de desarrollo de aplicaciones. En particular, debe realizar los siguientes pasos:

    1. Cambie su configuración de comstackción de Gradle para habilitar multidex
    2. Modifique su manifiesto para hacer referencia a la clase MultiDexApplication

    Modifique la configuración de archivos de construcción de Gradle de su aplicación para incluir la biblioteca de soporte y habilitar la salida multidex.

      android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { ... minSdkVersion 14 targetSdkVersion 25 ... // Enabling multidex support. multiDexEnabled true } ... } dependencies { compile 'com.android.support:multidex:1.0.3' } 

    En su manifiesto, agregue la clase MultiDexApplication de la biblioteca de soporte multidex al elemento de la aplicación.

     < ?xml version="1.0" encoding="utf-8"?>     

    Lea el documento oficial sobre MultiDex

    Si su clase de Aplicación extiende alguna otra clase y no desea o no puede cambiarla, override attachBaseContext() como se muestra a continuación:

     public class MyApplication extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } 

    Entonces

     < ?xml version="1.0" encoding="utf-8"?>     

    Conclusión

    Si bien la biblioteca corrige el problema DEX 64K en la mayoría de los casos, debe tratarse como último recurso. Antes de intentar usarlo, debe auditar su proyecto para detectar dependencias no deseadas y eliminar la mayor cantidad de código no utilizado posible con ProGuard.

    el error ocurre tal vez debido a demasiadas funciones en sus proyectos y biblioteca. Usted puede:
    – Habilitar multiple dex como la respuesta de @Intellij Amiya
    – Comprobar bibliotecas: especifica solo las API de servicios de Google Play específicas que usa tu aplicación, en lugar de todas.

     compile 'com.google.android.gms:play-services-ads:7.5.0' 

    Buscar y excluir dependencias duplicadas: abra su terminal y ejecute:

    gradle -q dependencies

    Mostrará una lista como el siguiente ejemplo:

     +--- com.android.support:appcompat-v7:23.0.1 | \--- com.android.support:support-v4:23.0.1 | \--- com.android.support:support-annotations:23.0.1 +--- :dputility_library-1.1.2: +--- com.google.android.gms:play-services-ads:7.5.0 | +--- com.google.android.gms:play-services-base:7.5.0 | | \--- com.android.support:support-v4:22.0.0 -> 23.0.1 (*) | \--- com.google.android.gms:play-services-analytics:7.5.0 | \--- com.google.android.gms:play-services-base:7.5.0 (*) +--- com.jakewharton:butterknife:7.0.1 +--- com.afollestad:material-dialogs:0.7.6.0 | +--- com.android.support:support-v4:22.2.0 -> 23.0.1 (*) | +--- com.android.support:appcompat-v7:22.2.0 -> 23.0.1 (*) | +--- com.android.support:recyclerview-v7:22.2.0 | | +--- com.android.support:support-annotations:22.2.0 -> 23.0.1 | | \--- com.android.support:support-v4:22.2.0 -> 23.0.1 (*) | \--- com.android.support:support-annotations:22.2.0 -> 23.0.1 

    Puede ver algunas dependencias con (*), puede excluirlo de sus dependencias gradle:

     compile('com.google.android.gms:play-services-ads:7.5.0') { exclude module: 'support-v4' exclude module: 'play-services-base' } 

    En realidad, para mí, el método excluyente funciona (dex múltiple no). Espero eso ayude.

    La actualización al plugin de gradle 3.1.1 me solucionó el problema, como se sugiere en esta respuesta

    Si solo necesita soporte multidex para pruebas, puede habilitarlo solo para pruebas con una línea como la siguiente en su build.gradle :

     dependencies { ... androidTestCompile 'com.android.support:multidex:1.0.1' }