¿Cómo resolver el problema con la limitación del compilador de Dalvik en los métodos de 64K?

Mi equipo y yo hemos heredado un gran proyecto Android de otro equipo. Se informa que la aplicación completa con todas las bibliotecas incluidas tiene alrededor de 35000 métodos. Ahora tenemos la tarea de implementar un nuevo servicio en la aplicación donde necesitamos usar Buffers de Protocolo.

El problema es que el archivo .jar generado con todos los archivos .proto necesarios crea otro par de 35000 métodos, es decir 70000 métodos. Y si no eres consciente, el compilador de Android tiene una limitación de 65536 métodos por archivo .dex. Estamos claramente por encima de ese límite y estamos recibiendo el siguiente error al intentar compilar la aplicación:

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 

Sí, la arquitectura de la aplicación probablemente debería ser reestructurada, pero eso llevará tiempo. Y por ahora estamos tratando de encontrar una solución para resolver este problema temporalmente.

¿Alguna sugerencia?

Puede utilizar otro archivo DEX. Así es como lo haces:

http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

Habilite Proguard ( http://developer.android.com/tools/help/proguard.html ) para eliminar métodos no utilizados. El generador protobuf crea miles de métodos que nunca se utilizan realmente.

Los microprotobuffers ( https://code.google.com/p/micro-protobuf/ ) también pueden ser útiles.

Square tuvo problemas similares y construyeron Wire para hacer frente a la explosión de método causada por protobufs. Afirman haber matado 10.000 métodos.

En las versiones de los servicios de Google Play anteriores a 6.5, tuviste que compilar todo el paquete de API en tu aplicación. En algunos casos, hacerlo dificultó mantener el número de métodos en su aplicación (incluidas las API de marco, los métodos de biblioteca y su propio código) bajo el límite de 65.536.

Desde la versión 6.5, puede recopilar selectivamente las API de servicio de Google Play en su aplicación. Por ejemplo, para incluir sólo las API de Google Fit y Android Wear, reemplace la siguiente línea en su archivo build.gradle:

 compile 'com.google.android.gms:play-services:6.5.87' 

Con estas líneas:

 compile 'com.google.android.gms:play-services-fitness:6.5.87' compile 'com.google.android.gms:play-services-wearable:6.5.87' 

Para más referencia, puede hacer clic aquí

Si se trata del primer uso de los búferes de protocolo, puede buscar implementaciones alternativas de JavaME, por ejemplo

  • Protobuf-javame
  • Protobuf-j2me

Hay otros listados en complementos de terceros . Si no han utilizado ninguno de ellos, pero parecen ser más pequeños y no tienen todos los métodos creados por el protocolo estándar buffers.

Recientemente hemos añadido Nano Protobufs a Android, lo que reduce significativamente el número de métodos generados.

Si está utilizando eclipse este es el trabajo más fácil Haga clic aquí!

  • ¿Hay una manera de obtener la cuenta de los métodos numéricos utilizados en un archivo jar
  • Compilar el proyecto de Android desde la línea de comandos es lento
  • No se puede ejecutar dex debido a un espacio de montón de java en eclipse con una pequeña aplicación android
  • Diferencia entre AAR, JAR, DEX, APK en Android
  • ¿Cómo implementar un compilador Java y un convertidor DEX en una aplicación para Android?
  • Acelerar el tiempo de construcción del proyecto Android en IntelliJ IDEA
  • Carga dinámica de la biblioteca aar
  • ¿Es posible cargar dinámicamente una clase de actividad de una biblioteca jar en el sdCard y realmente usarla?
  • Cómo evitar el límite de 65k método al utilizar Google Play Services
  • Android app lento tiempo inicial de inicio
  • Gestión de proyectos de android desde la línea de comandos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.