Tengo una aplicación de Android bastante grande que se basa en muchos proyectos de biblioteca. El compilador de Android tiene una limitación de 65536 métodos por archivo .dex y estoy superando ese número.
Básicamente, hay dos caminos que puede elegir (al menos que yo sepa) cuando alcanza el límite del método.
1) Reduzca su código
2) Cree varios archivos dex ( consulte esta publicación de blog )
Miré en ambos y traté de averiguar qué estaba causando que el recuento de mi método fuera tan alto. La API de Google Drive toma la mayor parte con la dependencia de Guava en más de 12,000. El total de bibliotecas para Drive API v2 supera las 23.000.
Mi pregunta, supongo, es, ¿qué crees que debería hacer? ¿Debo eliminar la integración de Google Drive como una función de mi aplicación? ¿Hay alguna forma de reducir la API (sí, uso proguard)? ¿Debería seguir la ruta dex múltiple (que parece bastante dolorosa, especialmente al tratar con API de terceros)?
fuente
apk
forma? Personalmente, me gustaría ver la integración de DriveRespuestas:
Parece que Google finalmente ha implementado una solución / solución para superar el límite de método de 65K de archivos dex.
Consulte: Creación de aplicaciones con más de 65.000 métodos
Aún debe evitar alcanzar el límite de métodos de 65K usando activamente proguard y revisando sus dependencias.
fuente
puede usar la biblioteca de soporte multidex para eso, para habilitar multidex
1) inclúyelo en dependencias:
2) Habilítelo en su aplicación:
3) si tiene una clase de aplicación para su aplicación, anule el método attachBaseContext como este:
4) Si no tiene una clase de aplicación para su aplicación, registre android.support.multidex.MultiDexApplication como su aplicación en su archivo de manifiesto. Me gusta esto:
¡y debería funcionar bien!
fuente
Play Services
6.5+ ayudas: http://android-developers.blogspot.com/2014/12/google-play-services-and-dex-method.html...
Esta es una buena noticia, para un juego simple, por ejemplo, probablemente solo necesite el
base
,games
y tal vezdrive
.fuente
En las versiones de los servicios de Google Play anteriores a la 6.5, tenía que compilar todo el paquete de API en su aplicación. En algunos casos, hacerlo hizo que fuera más difícil mantener la cantidad de métodos en su aplicación (incluidas las API de marco, los métodos de biblioteca y su propio código) por debajo del límite de 65.536.
A partir de la versión 6.5, puede compilar selectivamente las API del servicio Google Play en su aplicación. Por ejemplo, para incluir solo las API de Google Fit y Android Wear, reemplace la siguiente línea en su archivo build.gradle:
con estas líneas:
para más referencias, puede hacer clic aquí
fuente
Use proguard para aligerar su apk ya que los métodos que no se utilizan no estarán en su compilación final. Verifique que tiene lo siguiente en su archivo de configuración proguard para usar proguard con guava (mis disculpas si ya tiene esto, no se sabía al momento de escribir este artículo):
Además, si está usando ActionbarSherlock, cambiar a la biblioteca de soporte de appcompat v7 también reducirá mucho el recuento de métodos (según la experiencia personal). Las instrucciones se encuentran:
fuente
Warning: butterknife.internal.ButterKnifeProcessor: can't find superclass or interface javax.annotation.processing.AbstractProcessor
cuando corría./gradlew :myapp:proguardDevDebug
Podrías usar Jar Jar Links para reducir enormes bibliotecas externas como Google Play Services (¡métodos de 16K!)
En su caso, simplemente extraerá todo del jar de Google Play Services excepto
common
internal
ydrive
los subpaquetes.fuente
Para los usuarios de Eclipse que no usan Gradle, existen herramientas que descompondrán el frasco de Google Play Services y lo reconstruirán solo con las partes que desee.
Yo uso strip_play_services.sh de dextorer .
Puede ser difícil saber exactamente qué servicios incluir porque hay algunas dependencias internas, pero puede comenzar poco a poco y agregar a la configuración si resulta que faltan cosas necesarias.
fuente
Creo que, a la larga, romper tu aplicación en múltiples dex sería la mejor manera.
fuente
El soporte multi-dex
serála solución oficial para este problema. Vea mi respuesta aquí para más detalles.fuente
Si no se usa multidex, lo que hace que el proceso de construcción sea muy lento. Puede hacer lo siguiente. Como mencionó yahska, use la biblioteca de servicios de Google Play específica. En la mayoría de los casos, solo se necesita esto.
Aquí están todos los paquetes disponibles compilan API selectivamente en su ejecutable
Si esto no es suficiente, puede usar el script gradle. Pon este código en el archivo 'strip_play_services.gradle'
}
Luego aplique este script en su build.gradle, así
fuente
Si usa Google Play Services, es posible que sepa que agrega más de 20k métodos. Como ya se mencionó, Android Studio tiene la opción de inclusión modular de servicios específicos, pero los usuarios que se quedan con Eclipse tienen que tomar la modularización en sus propias manos :(
Afortunadamente hay un script de shell que facilita bastante el trabajo. Simplemente extraiga al directorio jar de los servicios de Google Play, edite el archivo .conf suministrado según sea necesario y ejecute el script de shell.
Un ejemplo de su uso está aquí .
fuente
Como dijo, reemplacé
compile 'com.google.android.gms:play-services:9.0.0'
solo con las bibliotecas que necesitaba y funcionó.fuente