Consejos para desarrolladores de Android para reducir el tamaño del archivo APK
Publicado: 2015-10-281) Guardia Pro
Una herramienta para reducir el código, como ProGuard, reducirá significativamente el tamaño del archivo APK. La herramienta está disponible en sourceforge. Tenga en cuenta que es muy importante volver a probar toda la aplicación después de aplicar ProGuard, ya que a veces puede cambiar el comportamiento de la aplicación. Como ProGuard reemplaza los símbolos de la aplicación, para que el código sea difícil de leer, es importante que conserve la asignación de símbolos, de modo que pueda traducir un seguimiento de pila a los símbolos originales si tiene que investigar un bloqueo en su aplicación.
2) Eliminación de la información de depuración
Le recomiendo que elimine todas las funciones relacionadas con la depuración de la aplicación. La aplicación generalmente no ve ni usa estos datos, y el sistema operativo Android no los requiere para ejecutar la aplicación. Por lo tanto, la información de depuración solo desperdicia espacio y debe eliminarse.
Para lograr esto, toda la funcionalidad relacionada con la depuración debe encerrarse en bloques condicionales, como se muestra a continuación:
depuración final estática = falso; si (depurar) { v(ETIQUETA, "Depurar...") }
Es importante que el indicador de depuración se establezca en el momento de la compilación (es decir, se declare como final estático) para que el compilador pueda eliminar por completo toda la funcionalidad de depuración. Crear su propio método de depuración como el que se muestra a continuación no es una buena idea porque la llamada a myDebugPrint() no está encerrada en un bloque condicional, lo que significa que el compilador debe retener información sobre myDebugPrint() en la clase que llama.
vacío público myDebugPrint() si (depurar) v(ETIQUETA, "Depurar..."); } } … miDebugPrint()
3) Eliminación de símbolos de depuración de bibliotecas nativas El uso de símbolos de depuración tiene sentido si su aplicación aún está en desarrollo y aún requiere depuración. Pero si los símbolos de depuración aún aparecen cuando compila una compilación de lanzamiento y desea eliminarlos, le recomendamos que los símbolos de depuración se eliminen de las bibliotecas nativas (archivos .so). Esto se hace usando el comando arm-eabi-strip, del NDK de Android.
4) Formatos de medios recomendados Si su aplicación depende en gran medida de imágenes, audio o video, otra forma de reducir el tamaño del archivo APK es mediante el uso de ciertos formatos de medios. Le recomendamos que utilice los siguientes formatos de medios para imágenes, audio y video:
- Vídeo: Utilice H264 AVC. Codifique el video a una resolución no mayor que la resolución de pantalla del dispositivo de destino (si se conoce).
- Audio : se recomienda audio AAC para todos los recursos de audio. AAC logra una mejor compresión en una calidad determinada, en comparación con mp3 u Ogg Vorbis. Nunca se deben utilizar formatos sin formato como WAV. La lógica común para usar el formato WAV es que la decodificación de secuencias de audio comprimidas generalmente significa una alta latencia en la reproducción. Sin embargo, Android proporciona la API Sound Pool que permite que las aplicaciones utilicen secuencias de audio comprimidas sin la penalización de una alta latencia.
- Imágenes : PNG o JPEG. Usa PNG; dado que es un formato sin pérdidas, es muy adecuado para texturas y obras de arte, ya que no habrá artefactos visuales de la compresión. Si hay limitaciones de espacio, use archivos JPEG o una combinación de PNG y JPEG. Una imagen JPEG de alta calidad puede funcionar bien para imágenes fotorrealistas grandes, para las cuales está optimizado el esquema de compresión JPEG.
- Optimiza los tamaños PNG sin perder calidad
Si usa el formato PNG, las imágenes PNG se pueden reducir en tamaño de archivo sin perder calidad. Para hacer esto, use una herramienta como OptiPNG o PNGCrush. Ambos son excelentes para reducir el tamaño de los archivos PNG y, al mismo tiempo, garantizar la calidad de la imagen. PNGcrush es un programa de código abierto que itera sobre filtros PNG y parámetros zlib (Deflate), comprime la imagen repetidamente usando cada configuración de parámetro y elige la configuración que produce la salida comprimida más pequeña (IDAT). Por otro lado, OptiPNG realiza las pruebas completamente en la memoria y escribe solo el archivo de salida final en el disco. Además, ofrece múltiples ajustes preestablecidos de optimización para el usuario.
5) Eliminar recursos no utilizados Otro grupo potencial de desperdicios de espacio a considerar para la eliminación de su archivo APK son los recursos no utilizados en su directorio res, como diseños, elementos de diseño y colores no utilizados. Para detectar recursos no utilizados en su APK que podrían eliminarse, use la herramienta Android-unused-resources. Android Unused Resources es una aplicación Java que escaneará su proyecto en busca de recursos no utilizados.
6) Evite la duplicación Asegurarse de que su aplicación no tenga funciones duplicadas o activos duplicados es una forma obvia de evitar tener archivos innecesarios en su APK. Es importante comprender qué API de Android utiliza y la funcionalidad completa que proporciona cada una. Podría ser que una API de Android ya esté haciendo el trabajo de otra API. Los activos duplicados (cadenas, mapas de bits, etc.) también son una pérdida de espacio y se pueden evitar fácilmente. En menor medida, el código duplicado también aumentará innecesariamente el tamaño del binario entregado.
7) Reduzca su número de métodos Los desarrolladores de Avid Android se han enfrentado durante mucho tiempo a un problema que provoca dolor de cabeza con sus aplicaciones. La cantidad de métodos que puede tener una aplicación es limitada. Bueno, solía ser limitado. Por fin, la buena gente de Google proporcionó una solución en octubre pasado, pero estaba lejos de ser ideal. Aunque es muy fácil de implementar, la solución multidex complicó y prolongó significativamente el tiempo de compilación. Sin parar, a partir de Lollipop (Android 5.0), se revolucionó toda la Máquina Virtual Android para ofrecer una solución mucho más duradera, de esas que incluso mejoran el tiempo de compilación habitual. Sin embargo, por el momento, la solución Lollipop tampoco es ideal. Requiere que los desarrolladores desarrollen solo contra Lollipop, lo que podría ser problemático ya que la mayoría de las aplicaciones quieren ser compatibles con rangos más amplios de audiencias y pueden temer usar funciones que no están disponibles en versiones anteriores de Android. Entonces, en este momento, la solución Lollipop es una buena solución futura para Android, pero es posible que no tenga mucho impacto en el presente previsible. Entonces, ¿qué se puede hacer mientras tanto? Todos estamos de acuerdo en que no debe renunciar a las funciones y capacidades, solo para evitar alcanzar el límite de 65K. Pero no hay duda de que la mejor práctica aún sería reducir el número de métodos de aplicación. Entonces, ¿cómo puede intentar reducir el número de métodos sin perder esa pequeña chispa que hace que su aplicación sea especial?
Una breve descripción general: "¿De dónde vienen todos estos métodos?"
El límite de recuento de métodos se sitúa aproximadamente en 65 000 métodos (65 536 para ser exactos). Eso suena como un gran número. Si es un desarrollador de Android novato, podría estar pensando "¿cómo demonios pueden tantas aplicaciones alcanzar este número tan rápido?" Probablemente estaría algo en lo cierto. No es fácil escribir tantos métodos por su cuenta. Pero los desarrolladores de aplicaciones no escriben toda su aplicación por su cuenta. Los desarrolladores de aplicaciones utilizan cada vez más bibliotecas de terceros (SDK, kits de desarrollo de software), que les ayudan a lograr ciertos objetivos y funciones que, de lo contrario, tendrían que desarrollar completamente por su cuenta. Desde anuncios a través de mejoras de GUI hasta redes sociales, informes de fallas y mucho más, los SDK ofrecen una amplia gama de capacidades y API que ahorran un valioso tiempo de desarrollo y ayudan a que su aplicación esté disponible más rápido. Pero cada SDK se suma a la cantidad de métodos, y algunos SDK incluso están haciendo más de lo que esperaba. No es necesariamente algo malo, por supuesto. Sin embargo, el golpe de gracia vino de los mismos Google. Su kit de Google Play Services es un gran SDK que contiene más de 28 000 métodos. Con un límite de 65K, ese número no es exactamente bajo. Y a muchos desarrolladores de aplicaciones les gustaría usar este SDK, ya que abre la puerta al reino mágico de Google, una capacidad muy deseada que agrega mucho valor a la aplicación. En esta publicación, no solo explicaré cómo utilizar de forma selectiva los paquetes de Servicios de Google Play, sino que también le explicaré cuántos métodos agrega cada uno de estos paquetes a su aplicación. Así que agárrense a sus asientos, va a ser un viaje lleno de baches.
El patio de recreo de los servicios de Google Play
Entonces, ¿cuántos métodos agrega realmente Google Play Services? Bueno, como con todo en la vida, es mucho más complicado que solo un número final. Pero vamos a dar un paso a la vez. El SDK de Google Play Services en realidad contiene 19 SDK diferentes. Con Gradle, puede elegir selectivamente cuáles usar. Todo lo que tiene que hacer es agregar la siguiente dependencia al archivo build.gradle del módulo de su aplicación:
dependencias { compila 'com.google.android.gms:play-services:7.5.0' }
Siendo la 7.5.0 la última versión de GPS lanzada en este momento. Está etiquetado como revisión 25 dentro de Android SDK Manager. Para elegir paquetes específicos, reemplace la siguiente línea con tantas líneas de dependencia como desee, especificando paquetes específicos. Digamos, por ejemplo, que solo desea Google Plus, Google Games, Google Ads y Google Maps:
dependencias { compila 'com.google.android.gms:play-services-plus:7.5.0' compila 'com.google.android.gms:play-services-games:7.5.0' compila 'com.google.android.gms:play-services-ads:7.5.0' compila 'com.google.android.gms:play-services-maps:7.5.0' }
No es demasiado difícil, pero aquí está el primer truco. Uno de los gloriosos 19 SDK se llama play-services-base. Si incluye algún paquete de Google Play Service, también se agregará automáticamente. ¿Cuántos métodos contiene el paquete base? Casi 8.000 (número exacto a continuación).
Y aquí está la segunda trampa. No incluí solo 3 paquetes en el ejemplo anterior. Ni siquiera incluí 4, si también cuenta el paquete base. De hecho, incluí 5 paquetes. ¿Por qué? Porque el paquete de Google Games usa el paquete de Google Drive, por lo que también se importó (en realidad, Google Ads también incluye un paquete llamado administrador de etiquetas, pero aquí solo cuento los paquetes "seleccionables").
Así que ahora estamos empezando a entender por qué es un poco más difícil contar cuántos métodos agrega cada paquete de Google Play Services a nuestra aplicación. Incluir un paquete no significa necesariamente excluir a los demás.
Así que aquí está el resumen: qué paquetes puede agregar, cuántos métodos agregan y qué otros paquetes traen para arruinar la fiesta. Los datos se refieren a la última versión de Google Play Services (7.5.0 / revisión 25):
Número total de métodos: 28.175. Algunos de estos números, hay que admitirlo, son verdaderamente atroces. Si todo lo que quería era el paquete panorámico, no puede obtener nueve métodos, debe obtener casi 8,000. No es de extrañar que tantas aplicaciones se estén acercando o superando ese límite de 65K.
Algunos de estos números pueden parecer un poco inconsistentes si intentas sumarlos. Eso es porque, de nuevo, la lógica detrás de Google Play Services es un poco más complicada de lo que parece. Por ejemplo, Google Analytics incluye un único método de Google Ads para obtener el ID de publicidad de la cuenta.
Tenga en cuenta que al calcular cuánto agrega cada paquete a su aplicación, asegúrese de excluir los dobles (por ejemplo, no cuente el paquete base más de una vez).
No se puede agregar todo selectivamente
Y aquí está el aguijón final. Hay dos pequeños paquetes dentro de Google Play Services que no se pueden agregar de forma selectiva. El paquete de búsqueda (que le da acceso a la API de Google Now) incluye solo 22 métodos. Si desea usarlo, no tiene más remedio que agregar los más de 28,000 métodos completos, todos los servicios de Google Play. Con suerte, esto se solucionará en las versiones posteriores.
(Otro paquete "inaccesible" es el paquete appstate que incluye 111 métodos, sin embargo, ahora está obsoleto a favor de SavedGames , incluido en el paquete google-play-games).