android - multiple - multidex 1.0 3
Aplicación demasiado grande? No se puede ejecutar dex: no se puede fusionar el nuevo índice en una instrucción no jumbo (5)
Algunas observaciones interesantes El mismo error puede aparecer si tiene un proyecto de sabores múltiples. Es confuso. Resultó que intenté ejecutar la aplicación con el comando genérico: gradlew installDebug
. Cuando he cambiado la línea de comando para que parezca, este problema se ha ido. No te olvides de reemplazar la parte de sabor con la real.
gradlew installFlavorDebug
Recibo el siguiente error cuando compilo mi aplicación:
[2014-05-07 21:48:42 - Dex Loader] Unable to execute dex: Cannot merge new index 65536 into a non-jumbo instruction!
Estoy en el punto de que si declaro un nuevo método en cualquier parte de mi paquete , obtengo este error. Si no lo hago, la aplicación compila.
Me gustaría saber qué significa exactamente (y con precisión) este error. Mi aplicación es grande, ¡pero no creo que sea tan grande! Asi que:
- ¿El error significa que tengo demasiados métodos? ¿público? ¿estático? ¿paquete? miembros?
- ¿Está relacionado con los métodos / miembros de mi paquete raíz, o también con las bibliotecas JAR incluidas?
- ¿Hay alguna manera de obtener más información de depuración sobre esto?
Ya sé acerca de la bandera de habilitación "jumbo" abordada en las preguntas similares aquí en SO, sin embargo, creo que el modo jumbo no está disponible en el nivel de API al que estoy apuntando (ICS).
Está relacionado con la cantidad de métodos de bibliotecas incluidos en el proyecto. Por ejemplo, si tiene un seguimiento en su aplicación, solo Google Analytics tiene ~ 7000 métodos. En uno de mis proyectos usando Lombok (2MB de JAR) me dio estos problemas. Resuelto deshacerse de esta biblioteca.
Para la compilación gradle, simplemente agrega dexOptions en build.gradle para habilitar el modo jumbo:
android {
dexOptions {
jumboMode = true
}
}
Recuerde ejecutar "gradle clean" antes de su nuevo edificio.
Parece que el problema ocurre porque todos los archivos de clase de su proyecto y archivos JAR se empaquetan antes de DEXing. Esto puede no ser del todo cierto, pero cualquier forma de controlar esto en nuestro proyecto ha demostrado ser bastante difícil. Incluso la eliminación de las cosas que inicialmente causaron este problema, la limpieza y la reconstrucción no solucionaron el problema para nosotros de manera consistente.
Así que aprovechamos esta oportunidad para cambiar nuestro proyecto a Android Studio y logramos resolver el problema activando ProGuard para compilaciones de depuración también. Más precisamente, solo usamos la fase de contracción de la cadena de procesamiento de ProGuard.
Gradle hace que sea muy fácil activar ProGuard para compilaciones de depuración:
buildTypes {
debug {
runProguard true
proguardFile ''proguard-project-debug.txt''
}
}
Y aquí está la configuración de ProGuard de depuración que usamos:
-keep class com.your.code.**
# Use -keep to explicitly keep any other classes shrinking would remove
-dontoptimize
-dontobfuscate
-ignorewarnings
Esto aumenta el tiempo de compilación del proyecto, pero lo bueno es que el depurador aún funciona.
La única alternativa más rápida que puedo pensar es que cualquier archivo JAR se elimine manualmente de los archivos de clase no utilizados. Pero esto no solo es difícil de hacer, también es inconveniente cuando desea utilizar una parte ligeramente mayor de una biblioteca en un momento posterior.
Espero que esto ayude a otros desarrolladores que luchan con este problema. Y quizás en el futuro, Google pueda mejorar el compilador que hace esta poda por defecto. Nuestro archivo APK DEX pasó de 8MB a 2.9MB.
Versiones gradle más nuevas (1.0.0+)
En las versiones más nuevas de Android studio (1.0+), el paquete Gradle se actualizó. Hubo algunos cambios en la forma en que funciona el mecanismo de compilación, por lo que su proyecto del archivo Gradle ahora puede aprovechar los parámetros minifyEnabled y shrinkResources . La versión actual es 1.1.0.
Mantenerse al día con los cambios en una plataforma rápida como Android requiere un esfuerzo, pero a menudo se recompensa con nuevas funciones, herramientas y tiempos de compilación más rápidos. Por lo tanto, actualizar Android Studio y actualizar (cuidadosamente) sus proyectos vale la pena el tiempo que invierte.
buildTypes {
debug {
proguardFile ''proguard-project-debug.txt''
minifyEnabled true
shrinkResources true
}
}
Su error es por la cantidad de cadenas (métodos, miembros, etc.) en un único archivo dex.
Necesitas compilar tu aplicación usando jumbo en dex con:
dex.force.jumbo=true
en project.properties
Esto incrementa el límite para cadenas en un archivo dex . Y su proyecto probablemente compilará.
También con jumbo set, el es otro límite de 64 K solo para los métodos en un solo dex. Si obtiene este límite en el futuro, deberá eliminar algunas dependencias.
ACTUALIZACIÓN : para construir con Gradle : en Gradle puede habilitar jumboMode también en el archivo build.gradle con:
dexOptions {
jumboMode = true
}
Comprobar: Android Build: Dex Jumbo Mode en Gradle
También con Gradle puede evitar el límite de 64 KB para los métodos que usan compilación multidex, tutorial aquí: https://developer.android.com/tools/building/multidex.html