¿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:
- Uso de SimpleXML con Android y Gradle
- No se puede ejecutar dex: varios archivos dex definen Lcom / myapp / R $ array;
- Golpear el límite del método Dex 65k, pero las herramientas de dex-method-count dicen que hay mucho menos
- Reemplazar el nuevo método dexlib2 fallando
- ¿Qué es dex en Gradle?
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?
- Transformación automática del código dex de Android
- Usando .aar NoClassDefFoundError pero la clase existe y es Dexed
- ¿Aplicación demasiado grande? No se puede ejecutar dex: No se puede fusionar el nuevo índice en una instrucción no jumbo
- Cómo convertir .jar o .class a .dex?
- Android Studio APK Analyzer para las compilaciones de depuración
- La compilación de Android funciona en Eclipse pero no en Ant ("ya agregado")
- Uso de Groovy en Android
- Reflexión de Java que maneja cambios de la biblioteca
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í!