He visto varias versiones de los dex erros antes, pero esta es nueva. limpiar / reiniciar, etc. no ayudará. Los proyectos de la biblioteca parecen intactos y la dependencia parece estar vinculada correctamente.
Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
o
Cannot merge new index 65950 into a non-jumbo instruction
o
java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
tl; dr : ¡La solución oficial de Google finalmente está aquí!
http://developer.android.com/tools/building/multidex.html
Solo un pequeño consejo, es probable que tengas que hacer esto para evitar la falta de memoria al hacer la desintoxicación.
dexOptions {
javaMaxHeapSize "4g"
}
También hay un modo jumbo que puede solucionar esto de una manera menos confiable:
dexOptions {
jumboMode true
}
Actualización: si su aplicación es gorda y tiene demasiados métodos dentro de su aplicación principal, es posible que deba reorganizar su aplicación según
http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
esa que no llama a esta función si no está disponible?Respuestas:
Actualización 3 (11/3/2014)
Google finalmente lanzó la descripción oficial .
Actualización 2 (31/10/2014)
El complemento de Gradle v0.14.0 para Android agrega soporte para multi-dex. Para habilitar, solo tiene que declararlo en build.gradle :
Si su aplicación es compatible con Android anterior a 5.0 (es decir, si
minSdkVersion
tiene 20 o menos), también debe parchear dinámicamente la aplicación ClassLoader , para que pueda cargar clases desde dexes secundarios. Afortunadamente, hay una biblioteca que hace eso por ti. Agréguelo a las dependencias de su aplicación:Debe llamar al código de parche de ClassLoader lo antes posible.
MultiDexApplication
La documentación de la clase sugiere tres formas de hacerlo (elija una de ellas , la que sea más conveniente para usted):1 - Declara la
MultiDexApplication
clase como la aplicación en tu AndroidManifest.xml :2 - Haga que su
Application
clase extienda la clase MultiDexApplication :3 - Llama
MultiDex#install
desde tuApplication#attachBaseContext
método:Actualización 1 (17/10/2014):
Como se anticipó, el soporte multidex se incluye en la revisión 21 de la Biblioteca de soporte de Android. Puede encontrar android-support-multidex.jar en la carpeta / sdk / extras / android / support / multidex / library / libs.
El soporte multi-dex resuelve este problema. dx 1.8 ya permite generar varios archivos dex.
Android L admitirá multi-dex de forma nativa, y la próxima revisión de la biblioteca de soporte cubrirá versiones anteriores a API 4.
Fue declarado en este episodio de podcast de Android Developers Backstage por Anwar Ghuloum. He publicado una transcripción (y una explicación general de multi-dex) de la parte relevante.
fuente
java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
). Resultó que mi error fue que no estaba aplicando los pasos adicionales para el soporte de Android antes de 5.0. Dicho esto, la opción # 3 lo resolvió, y no tuve másClassNotFoundException
problemas. Gracias, @Alex Lipov!Como ya se dijo, tiene demasiados métodos (más de 65k) en su proyecto y libs.
Prevenga el problema: reduzca la cantidad de métodos con Play Services 6.5+ y support-v4 24.2+
Dado que a menudo los servicios de Google Play son uno de los principales sospechosos en los métodos de "desperdicio" con sus más de 20k métodos . Servicios de Google Play versión 6.5 o posterior, es posible que incluya servicios de Google Play en su aplicación utilizando varias bibliotecas de clientes más pequeñas. Por ejemplo, si solo necesita GCM y mapas, puede elegir usar solo estas dependencias:
La lista completa de sub bibliotecas y sus responsabilidades se puede encontrar en el documento oficial de Google .
Actualización : desde Support Library v4 v24.2.0 se dividió en los siguientes módulos:
Sin embargo, tenga en cuenta que si lo usa
support-fragment
, tendrá dependencias de todos los demás módulos (es decir, si lo usa,android.support.v4.app.Fragment
no hay beneficio)Consulte aquí las notas de la versión oficial de support-v4 lib
Habilitar MultiDexing
Desde Lollipop (también conocido como herramientas de construcción 21+) es muy fácil de manejar. El enfoque es solucionar los métodos de 65k por problema de archivo dex para crear múltiples archivos dex para su aplicación. Agregue lo siguiente a su archivo de compilación de gradle ( esto está tomado del documento oficial de google en aplicaciones con más de 65k métodos ):
El segundo paso es preparar su clase de Aplicación o, si no extiende la Aplicación, use el
MultiDexApplication
en su Manifiesto de Android:Agregue esto a su Application.java
o use la aplicación provista desde la biblioteca mutlidex
Prevenir OutOfMemory con MultiDex
Como consejo adicional, si se encuentra con
OutOfMemory
excepciones durante la fase de construcción, puede ampliar el montón conque establecería el montón a 4 gigabytes.
Consulte esta pregunta para obtener más detalles sobre el problema de la memoria de almacenamiento dinámico de dex.
Analiza la fuente del problema
Para analizar la fuente de los métodos, el complemento de Gradle https://github.com/KeepSafe/dexcount-gradle-plugin puede ayudar en combinación con el árbol de dependencias proporcionado por Gradle con, p. Ej.
Consulte esta respuesta y pregunta para obtener más información sobre el recuento de métodos en Android
fuente
Tu proyecto es demasiado grande. Tienes demasiados métodos. Solo puede haber 65536 métodos por aplicación. ver aquí https://code.google.com/p/android/issues/detail?id=7147#c6
fuente
El siguiente código ayuda, si usa Gradle. Le permite eliminar fácilmente los servicios innecesarios de Google (suponiendo que los esté usando) para volver a estar por debajo del umbral de 65k. Todo el crédito a esta publicación: https://gist.github.com/dmarcato/d7c91b94214acd936e42
Editar 2014-10-22 : Ha habido mucha discusión interesante sobre la esencia mencionada anteriormente. TLDR? mira este: https://gist.github.com/Takhion/10a37046b9e6d259bb31
Pegue este código en la parte inferior de su archivo build.gradle y ajuste la lista de servicios de google que no necesita:
fuente
clean
cada vez que hice el mono con las exclusiones (usamos análisis).He compartido un proyecto de muestra que resuelve este problema usando el script de compilación custom_rules.xml y algunas líneas de código.
Lo utilicé en mi propio proyecto y funciona sin problemas en dispositivos 1M + (desde android-8 hasta el último android-19). Espero eso ayude.
https://github.com/mmin18/Dex65536
fuente
Enfrenté el mismo problema y lo resolví editando mi archivo build.gradle en la sección de dependencias, eliminando:
Y reemplazándolo con:
fuente
Intente agregar el siguiente código en build.gradle, funcionó para mí:
fuente
La solución perfecta para esto sería trabajar con Proguard. como aleb mencionó en el comentario. Disminuirá el tamaño del archivo dex a la mitad.
fuente
Puede analizar el problema (referencias de archivos dex) con Android Studio:
Compilación -> Analizar APK ..
En el panel de resultados, haga clic en el archivo classes.dex
Y verás:
fuente
solución gradle + proguard:
fuente
Elimine algún archivo jar de la carpeta Libs y cópielo en otra carpeta, y vaya a _Project Properties> Seleccione Java Build Path, Seleccione Libraries, Seleccione Add External Jar, Seleccione el Jar eliminado a su proyecto, haga clic en guardar, esto se agregará en Referenciado Biblioteca en lugar de la carpeta Libs. Ahora limpia y ejecuta tu proyecto. No necesita agregar ningún código para MultDex. Simplemente funcionó para mí.
fuente
Estaba enfrentando el mismo problema hoy, lo que funcionó es abajo
Para ANDROID STUDIO ... Habilite la ejecución instantánea
En Archivo-> Preferencias-> Compilación, ejecución, implementación-> Ejecución instantánea-> Marque Habilitar ejecución instantánea para intercambio en caliente ...
Espero eso ayude
fuente