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:
- Cambie la configuración de compilación de Gradle para habilitar multidex
- 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.