studio flavors defaultconfig android unit-testing gradle android-gradle proguard

android - flavors - DexIndexOverflowException solo cuando se ejecutan pruebas



gradle properties android studio (4)

Puedo crear y ejecutar con éxito mi aplicación de Android en mi depuración y lanzamiento de variantes sin ningún problema. Sin embargo, cuando intento 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 sí con mi depuración normal y lanzamiento de buildTypes.

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


La actualización a Gradle Plugin 3.1.1 solucionó el problema para mí, 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'' }


el error ocurre quizás debido a demasiadas funciones en sus proyectos y biblioteca. Usted puede:
- Habilite multiple dex como respuesta de @Intellij Amiya
- Verificar bibliotecas: especificando solo las API de servicios específicas de Google Play que usa su aplicación, en lugar de todas.

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

Encuentra y excluye dependencias duplicadas: abre tu terminal y ejecuta:

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 de exclusión funciona (la dex múltiple no funciona). Espero eso ayude.


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

Los archivos de la aplicación de Android (APK) contienen archivos ejecutables de bytecode en forma de archivos Dalvik Executable (DEX), que contienen el código compilado utilizado para ejecutar su aplicación. La especificación ejecutable Dalvik limita el número total de métodos a los que se puede hacer referencia dentro de un solo archivo DEX a 65.536, incluidos los métodos de marco 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 compilación de su aplicación para generar más de un archivo DEX, conocido como configuración multidex.

El complemento de Android para Gradle disponible en Android SDK Build Tools 21.1 y superior admite multidex como parte de su configuración de compilación. Asegúrese de actualizar las herramientas de Android SDK Build Tools y el repositorio de soporte de Android a la última versión usando el SDK Manager antes de intentar configurar su aplicación para multidex.

La configuración de 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 la configuración de compilación de Gradle para habilitar multidex
  2. Modifique su manifiesto para hacer referencia a la clase MultiDexApplication

Modifique la configuración del archivo de compilació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"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.multidex.myapplication"> <application android:name="android.support.multidex.MultiDexApplication"> </application> </manifest>

Leer documento oficial sobre MultiDex

Si su clase de aplicación está extendiendo 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"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.multidex.myapplication"> <application android:name=".MyApplication"> </application> </manifest>

Conclusión

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