Nos pasamos un tiempo considerable construyendo nuestras Apps y a la hora que hacer el build nos percatamos que el tamaño de dicho APK es algo exagerado teniendo en cuenta lo que pueda hacer nuestra aplicación. Optimizar a temprana etapa del proyecto no es buena pero hay que llevar eso al extremos.
En este tutorial mostraremos una serie de técnicas para reducir considerablemente el tamaño de los APK generados por nuestras aplicaciones.
Hoy día los dispositivos móviles posee buena cantidad de espacio suficiente pero son mas de uno los usuarios que sufren de problemas con el espacio en su dispositivo y cada vez que tienen que instalar algo nuevo tienen que estar eliminando apps y hay que tratar de no estar en el inicio de esa lista.
Lo primero que tenemos que hacer es analizar nuestro APK, para identificar los puntos que tenemos que atacar y reducir el tamaño en las áreas que sea necesario y para esto Android Studio nos ofrece el «APK Analizer» que es una super herramienta que nos da un detalle bien exhaustivo de los componentes de nuestro APK.
Luego sera seleccionar nuestro APK para realizar el análisis:
En el análisis anterior podemos no hay que ser un científico para saber que los assets de dicha aplicación están ocupando mucho espacio en el APK y lo que tenemos que hacer es:
- Reducir el tamaño de los assets (Optimizar)
- Dividir nuestro APK por «Screen density«
Con este ultimo análisis podemos ver que la mayor parte del espacio esta ocupado por los objetos en «lib» el cual podemos afrontar:
- Dividir nuestra aplicación por arquitectura.
Librerías
Aunque no lo crean el tener muchas librerías en nuestro proyecto afecta de manera directa en el tamaño de el APK final y es por esto que desde un buen tiempo Google dividió su librería de PlayService que en su momento era una librería enorme, y había que incluirla completa lo cual agregaba un tamaño considerable a nuestro APK:
Como podemos ver en esta pagina nos menciona la cantidad de métodos que esta tiene (Algo que hay que tomar en cuenta también) y el tamaño que agrega en KB, que como pueden ver es de 7440 kb, pero hoy día se nos permite el no agregar la librería completa sino solo lo necesario.
compile 'com.google.android.gms:play-services-location:8.3.0' compile 'com.google.android.gms:play-services-gcm:8.3.0' compile 'com.google.android.gms:play-services-maps:8.3.0'
En este ultimo ejemplo vemos como solo incluimos las librerías que necesitamos y no todo el contenido como en versiones anteriores.
Recursos
Entre las técnicas para reducir estos recursos están:
- Utilizar SGV: Siempre que se pueda utilizar SVG en vez de mapas de bits, así evitar estar creando 4 y 5 archivos por una imagen.
- Comprimir los archivos PNG: En ocasiones tenemos muchos iconos mono-cromáticos y se encuentran en 24-bits cuando pudiendo estar en 8-bits de colores nos funciona perfectamente.
En esta pagina podemos comprimir nuestros archivos PNG: tinypng.com
- Ajustar imágenes a cada Densidad: En caso de tener que usar imágenes (PNG), debemos crear una imagen para cada densidad y cuando estemos creando los APK por densidad cada resultado no tendría ningún recurso con extra tamaño ni nada por el estilo.
- Shrink resources: Con Android Studio podemos indicar que los recursos que tengamos en nuestro proyecto o en laguna librería de terceros que estemos utilizando que no se estén usando podemos eliminarlos del build final.
Dividir APK
Esta es una técnica bastante útil pero puede parecer un poco drástica para algunos, por que necesitaran estar enviando varios APK a la hora de publicar sus apps.
Entre las opciones para dividir nuestro APK, se encuentran:
- Density: de acuerdo a la densidad soportadas en el app.
- Opciones:
ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi
- Opciones:
- ABI (Application Binary Interface): de acuerdo a las arquitecturas que estemos soportando en nuestra aplicación, si no estamos utilizando librerías nativas esto ni lo veremos en nuestro APK. (Lista de ABIs disponibles)
- Opciones:
armeabi armeabi-v7a arm64-v8a x86 x86_64 mips mips64
- Opciones:
- Language: dependiendo de los lenguajes que estemos soportando en nuestra app, encuentro este un tanto drástico, ya que esto no es que ocupa un tamaño significante a la hora del construir el APK (Solo soportado por Instants Apps).
Cada opción tiene una forma de filtrar dichas configuraciones:
android { ... splits { density { enable true exclude "ldpi", "xxhdpi", "xxxhdpi" compatibleScreens 'small', 'normal', 'large', 'xlarge' } abi { enable true reset() include "x86", "armeabi-v7a", "mips" universalApk false } } }
Tener en cuenta que si habilitamos la sub difivisión de nuestro APK por ABI y por Density tenemos una gran cantidad de APKS que mantener.
Mas información acerca del split.
Conclusión
Podemos concluir que reducir nuestro tamaño en los APK es lo correcto, pero nos encontraremos en algunos casos donde nuestra aplicación tiene que tener un tamaño aunque sea enorme pero tenga que ser así, un ejemplo es Facebook, cuando vez el tamaño que ocupa esta app, al igual que Google, o Uber que son apps que necesitamos cuesten lo que cuesten.
Las aplicaciones mientras mas reducidas sean mejor, si no tienes cuidado con tu aplicación terminara en esta lista de aplicaciones la cual no quieres estar, y es esta lista: