Advertisement
  1. Code
  2. Android SDK

8 maneras de reducir el tamaño del APK de tu aplicación Android

Scroll to top
Read Time: 17 min

Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)

Desde el lanzamiento de Android Marketplace en marzo del año 2012, el tamaño de la aplicación Android promedio se ha quintuplicado.

Parte de este aumento tiene sentido: la memoria disponible para el dispositivo Android típico ha incrementado, así que ¿por qué no usar esta memoria adicional para ofrecer una mejor experiencia al usuario?

Sin embargo, hay un punto en el que todos esos gráficos de alta definición, características innovadoras y rico contenido multimedia tienen un impacto negativo en la experiencia del usuario — ¡nadie quiere una aplicación que tarda una eternidad en descargarse y luego le quita un fragmento a la memoria de sus dispositivos!

Incluso hay evidencia que sugiere que existe una correlación inversa entre el tamaño de tu APK y el número de personas que descargan tu aplicación. De acuerdo a un estudio reciente, por cada aumento de 6MB en el tamaño del APK, puedes esperar una caída del 1% en el número de personas que instalan tu aplicación después de visitar su página de Google Play.

Todo lo que puedas hacer para reducir el tamaño de tu APK animará a más usuarios a descargar tu aplicación, así que en este artículo te mostraré como crear un APK más limitado y pequeño y así garantizar que tu aplicación termine en la mayor cantidad de dispositivos que sea posible.

Paquetes de aplicaciones Android: compatibilidad con más dispositivos y reducción del tamaño del APK

Siempre que desarrolles una aplicación Android deberás asegurarte de que dicha aplicación sea compatible con la mayor cantidad posible de dispositivos diferentes, al proporcionar código y recursos que estén optimizados para diferentes densidades de pantalla, arquitecturas de CPU, lenguajes y muchos otros factores. Desafortunadamente, esto también significa que cada persona que descargue tu aplicación recibirá montones de código y recursos que nunca va a usar.

Ofrecer compatibilidad con tantos dispositivos como sea posible sin incrementar dramáticamente el tamaño de tu APK ha sido un problema durante mucho tiempo entre los desarrolladores Android. Sin embargo, el equipo de Android está intentando cambiar todo esto, con un nuevo formato de publicación que está diseñado para ayudarte a lograr ser compatible con la gama completa de dispositivos Android y, al mismo tiempo, reducir el tamaño de tu APK. De acuerdo al blog oficial para desarrolladores de Android, al publicar tu aplicación en este nuevo formato Android App Bundle (.aab), o paquete de aplicaciones Android, deberás poder reducir el tamaño de tu APK en un promedio del 35%.

Una vez que hayas cargado tu aplicación como un archivo .aab, Google Play usará este único archivo para generar:

  • Un APK base que contiene todo el código y recursos necesarios para entregar la funcionalidad básica de tu aplicación. Cualquier persona que descargue tu aplicación recibirá el mismo APK base.
  • Múltiples APKs de configuración, que están adaptados a diferentes configuraciones de dispositivos. Cada vez que alguien descargue tu aplicación, esa persona recibirá un APK de configuración adaptado a su dispositivo específico y que contendrá solamente el código y recursos que verdaderamente necesita.

Para compilar tu aplicación como un paquete de aplicaciones Android firmado, primero selecciona Build > Generate Signed Bundle/APK (Compilar > Generar paquete/APK firmado) desde la barra de herramientas de Android Studio. Luego selecciona la casilla de verificación Android App Bundle (Paquete de aplicaciones Android), y después haz clic en Next (Siguiente). Ahora abre el menú desplegable module (módulo) y elige app como tu módulo base.

Sigue las instrucciones en pantalla para finalizar el proceso de compilación. Ahora Android Studio generará un archivo .aab y lo almacenará en el directorio AndroidAppBundle/app/release de tu computadora.

Cuando estés listo para cargar tu archivo .aab en Google Play, simplemente dirígete a la Consola de Google Play y selecciona Create Application (Crear aplicación).

Se te pedirá que ingreses información básica sobre tu aplicación y luego haz clic en Create (Crear), seguido por Save (Guardar). En el menú de la izquierda de la consola, selecciona App releases (Lanzamientos de aplicaciones). Decide en qué pista deseas cargar esta aplicación, y luego selecciona el botón Manage (Gestionar) que la acompaña y haz clic en Create release (Crear versión).

Cuando se te solicite, inscríbete en App Signing de Google Play, lo que es obligatorio para usar el formato de paquete de aplicaciones. Selecciona Browse files (Buscar archivos) y luego elige el archivo .aab que quieras cargar.

Upload your Android App Bundle to the Google Play Console Upload your Android App Bundle to the Google Play Console Upload your Android App Bundle to the Google Play Console

Finalmente haz clic en Save (Guardar) para guardar tu configuración.

Una vez que hayas cargado tu aplicación a la consola, puedes ver cuánto espacio has ahorrado usando el formato de paquete de aplicaciones. Para hacer eso, selecciona App releases (Lanzamientos de aplicaciones) desde el menú de la izquierda. Localiza la pista en la que cargaste tu paquete, y luego selecciona Edit release (Editar versión) y a continuación haz clic para expandir la sección Android App Bundle (Paquete de aplicaciones Android).

Selecciona Explore App Bundle (Explorar paquete de aplicaciones) y verás un cálculo estimado del espacio que has ahorrado, expresado como porcentaje.

Check how much space youve saved your users by using the aab formatCheck how much space youve saved your users by using the aab formatCheck how much space youve saved your users by using the aab format

Ofrece funciones bajo demanda, con módulos de funciones dinámicas

No es inusual que un proyecto tenga una o más funciones que no son necesarias para entregar la funcionalidad principal de la aplicación. A menudo puedes reducir el tamaño de tu APK separando estas funciones en APKs de funciones dinámicas, que el usuario puede descargar bajo demanda, según sea necesario y cuando se requiera.

Para crear un módulo de función dinámica, selecciona File New > New Module… (Archivo > Nuevo > Nuevo módulo...) desde la barra de herramientas de Android Studio. Elige Dynamic Feature Module (Módulo de función dinámica) y posteriormente Next (Siguiente).

Desde aquí puedes abrir el menú desplegable de módulo de aplicación Base y seleccionar tu módulo base. Asigna un nombre a tu módulo y luego haz clic en Next (Siguiente). Selecciona la casilla de verificación Enable on-demand (Habilitar bajo demanda). Si tu proyecto es compatible con Android 4.4 o versiones anteriores, entonces también necesitarás habilitar Fusing (Fusión), ya que esto permitirá que tu módulo de funciones dinámicas esté disponible para estos dispositivos como un multi-APK.

Select the Enable on-demand and Fusing checkboxesSelect the Enable on-demand and Fusing checkboxesSelect the Enable on-demand and Fusing checkboxes

Para terminar, asigna a tu módulo un nombre público, que será visible para el usuario final. Haz clic en Finish (Finalizar).

Habilitando el acceso al módulo de funciones dinámicas

Una vez que hayas creado un módulo de funciones dinámicas, necesitarás darle a los usuarios una manera de solicitarlo en tiempo de ejecución. Abre tu archivo build.gradle a nivel de módulo y agrega la biblioteca Google Play Core como una dependencia del proyecto:

1
dependencies {
2
3
//Add the following//
4
5
implementation 'com.google.android.play:core:1.3.6'

Abre la Activity o Fragment en donde quieras cargar tu módulo de funciones dinámicas y luego añade lo siguiente:

1
 private void loadDyanmicFeatureOne() {
2
3
//Create an instance of SplitInstallManager//

4
5
        SplitInstallManager splitInstallManager =
6
                SplitInstallManagerFactory.create(this);
7
8
//Create the request//

9
10
        SplitInstallRequest request =
11
                SplitInstallRequest
12
                        .newBuilder()
13
14
//Specify the module that you want to download//

15
16
                        .addModule("dynamic-module")
17
                        .build();
18
19
        SplitInstallStateUpdatedListener listener = new SplitInstallStateUpdatedListener() {
20
            @Override
21
            public void onStateUpdate(SplitInstallSessionState splitInstallSessionState) {
22
                if(splitInstallSessionState.sessionId() == mySessionId) {
23
                    switch (splitInstallSessionState.status()) {
24
                        case SplitInstallSessionStatus.INSTALLED:
25
                            Toast.makeText(MainActivity.this, "The dynamic module was downloaded, Toast.LENGTH_SHORT).show();
26
                            break;
27
                    }
28
                }
29
            }
30
        };
31
32
        splitInstallManager.registerListener(listener);
33
34
//Submit the request via the asynchronous startInstall//

35
36
        splitInstallManager.startInstall(request)
37
                .addOnFailureListener(new OnFailureListener() {
38
                    @Override
39
40
//If the download fails with an exception….//

41
42
                    public void onFailure(Exception e) {
43
44
//...then do something//

45
46
                    }
47
                })
48
                .addOnSuccessListener(new OnSuccessListener<Integer>() {
49
                    @Override
50
51
//If the module was downloaded successfully...//

52
53
                    public void onSuccess(Integer sessionId) {
54
55
//...then do something//

56
57
                        mySessionId = sessionId;
58
                    }
59
                });
60
    }
61
}

Ahora puedes agregar código y recursos a tu módulo de funciones dinámicas, y los usuarios podrán solicitar el módulo en tiempo de ejecución.

Prueba antes de comprar: Ofrece un APK de aplicaciones instantáneas

Quizá no sea un APK del tipo tradicional e instalable, pero puedes ofrecer parte de tu aplicación como un APK de aplicaciones instantáneas independiente y ligero que los usuarios pueden cargar bajo demanda. Para cualquier persona que tenga dificultades con un almacenamiento extremadamente limitado o un plan de datos restrictivo, las aplicaciones instantáneas quizá sean la única manera viable que tengan para experimentar con tu aplicación.

En nuestra serie sobre aplicaciones instantáneas de tres partes, creamos un APK de aplicaciones instantáneas con múltiples funciones vinculado a un URL único. La vinculación a un URL permite que tu aplicación instantánea sea accesible desde cualquier ubicación de la web compatible con hipervínculos, incluyendo foros, tweets, publicaciones de Facebook y blogs. Sin embargo, la vinculación a URL también es un proceso de varios pasos que requiere que tengas un dominio web en donde puedas almacenar el archivo assetlinks.json de tu proyecto.

En las versiones más recientes de Android Studio, crear un APK de aplicaciones instantáneas se ha vuelto más sencillo, ya que ahora es posible crear una aplicación instantánea que no esté vinculada con ningún URL, eliminando toda la complejidad asociada con la vinculación a un URL.

Una vez que hayas publicado tu aplicación instantánea sin URL, los usuarios podrán acceder a ella a través de un botón Try Now (Prueba ahora) en la página de Google Play de tu aplicación.

The BuzzFeed app is one example of an Android Instant AppThe BuzzFeed app is one example of an Android Instant AppThe BuzzFeed app is one example of an Android Instant App

Para crear estos tipos de aplicaciones instantáneas "sin URL", necesitarás:

  • Android Studio 3.2 o posterior.
  • El SDK para desarrollo de aplicaciones instantáneas 1.3.0 o posterior.
  • Las versiones más recientes de las herramientas Android SDK Build y Platform.

Los proyectos compatibles con las aplicaciones instantáneas tienen una estructura única. Si practicas la modularización como parte de tu proceso de desarrollo de aplicaciones estándar, entonces quizá solamente necesites hacer algunos ajustes a tu proyecto, pero si tu proyecto no está modularizado, entonces prepárate a pasar algo de tiempo reestructurándolo.

Para lograr la compatibilidad con las aplicaciones instantáneas necesitarás crear los siguientes módulos:

  • Módulo App. Este es el módulo de aplicación "estándar" instalable.
  • Módulo Base. Este contiene el código y recursos que serán usados a través de todos los módulos de tu proyecto, por ejemplo los iconos del lanzador de tu aplicación.
  • Módulo Feature. Este contiene el código y recursos que son necesarios para proporcionar una función independiente.
  • Módulo Instantapp. Este es un contenedor que eventualmente tomará cada uno de los módulos feature de tu proyecto y los transformará en APKs de aplicación instantánea.
The structure of an Instant App-enabled project The structure of an Instant App-enabled project The structure of an Instant App-enabled project

Para ver un análisis más detallado de esta estructura única de proyecto, consulta: ¿Qué son las aplicaciones instantáneas de Android?

Si estás comenzando un nuevo proyecto entonces eres afortunado: puedes crear un proyecto en blanco que ya tenga la estructura para las aplicaciones instantáneas. Simplemente crea un nuevo proyecto de manera normal, pero cuando se te solicite, selecciona This project will support instant apps (Este proyecto será compatible con aplicaciones instantáneas).

When creating a project make sure you select the following checkbox This project will support instant apps When creating a project make sure you select the following checkbox This project will support instant apps When creating a project make sure you select the following checkbox This project will support instant apps

Después puedes añadir código y recursos a cada módulo, de manera normal.

Para probar tu aplicación instantánea sin URL necesitarás un dispositivo compatible que, de acuerdo a los documentos oficiales de Android, puede ser "la mayoría" de los dispositivos físicos que ejecutan Android 5.1 o posterior. Si estás usando el emulador, entonces necesitarás un AVD (Android Virtual Device, o Dispositivo Virtual Android) que use Android 8.1 o posterior, con arquitectura x86 y que incluya las APIs de Google. También necesitarás haber iniciado sesión con una cuenta de Google válida en tu dispositivo de pruebas o AVD.

Para probar tu aplicación instantánea, selecciona Run > Run... (Ejecutar > Ejecutar...) desde la barra de herramientas de Android Studio y luego selecciona Edit Configurations... (Editar configuraciones...).

En el menú de la izquierda selecciona instantapp. Ya que estamos probando una aplicación instantánea sin URL, localiza el campo URL y elimina todo el texto de su interior. Ahora selecciona Run (Ejecutar). Si el dispositivo te pide que entres al programa de la aplicación instantánea, entonces pulsa Yes, I'm in (Sí, quiero hacerlo).

Ahora tu aplicación instantánea deberá aparecer en la pantalla, ¡sin necesidad de instalación ni URL!

Cuando sea momento para el lanzamiento de tu aplicación, puedes terminar el proceso de firmado dos veces para crear APKs separadas, una instalable y una de aplicación instantánea, o puedes crear tu proyecto como un paquete de aplicaciones.

Publicando un paquete de aplicaciones con compatibilidad para aplicaciones instantáneas

En Android Studio 3.3 beta 1 y posteriores, puedes combinar aplicaciones instantáneas con paquetes de aplicaciones para crear un único archivo .aab que contenga tanto tu aplicación instalable como la instantánea.

Para configurar tu aplicación para publicar un archivo .aab con una aplicación instantánea incluida, abre el módulo instantapp de tu proyecto.

En el archivo AndroidManifest.xml de este módulo agrega lo siguiente:

1
<manifest
2
    xmlns:android="https://schemas.android.com/apk/res/android"
3
    xmlns:dist="http://schemas.android.com/apk/distribution"
4
5
//Set the targetSandboxVersion to 2//
6
7
    android:targetSandboxVersion="2">
8
9
//Add the following//
10
11
    <dist:module dist:instant="true" />
12
</manifest>

Abre el archivo build.gradle de tu módulo app y asegúrate de que tu variante instantánea tenga un valor de versionCode menor que el de su contraparte instalable:

1
android {
2
    ...
3
    
4
    flavorDimensions "flavorDimension"
5
    productFlavors {
6
        instant {
7
            versionCode 1
8
        }
9
        installed {
10
            versionCode 2
11
        }
12
    }
13
}

Selecciona Build Generate Signed Bundle / APK (Compilar > Generar paquete / APK firmado) desde la barra de menú de Android Studio, y luego compila tu paquete de aplicaciones de manera normal, asegurándote de firmarlo con una clave de lanzamiento.

Elimina todos los métodos, clases, campos, atributos y recursos que no estén siendo usados.

Es fácil encontrar código y recursos no usados dentro de tu proyecto, particularmente cuando estás usando bibliotecas. Ya que estos no agregan ningún valor a tu aplicación, siempre debes buscar y eliminar recursos innecesarios, y hay varias herramientas que pueden ayudarte:

1. ¿Te sientes aventurero? prueba el nuevo reductor de código R8

La reducción de código puede ayudarte a disminuir el tamaño de tu APK eliminando código y recursos no utilizados.

Android Studio 3.3 beta 1 cuenta con una vista previa de la próxima herramienta de reducción de código R8, que también lleva a cabo la desazucarización (desugaring) y dexing y, de acuerdo a Google, reduce el código más rápido que ProGuard.

Para probar R8 por ti mismo, asegúrate de que estés ejecutando Android Studio 3.3 beta 1 o posterior, y luego agrega lo siguiente a tu archivo gradle.properties:

1
android.enableR8=true

2. Reduce tu código con ProGuard

Al momento de escribir este artículo, R8 aún existía como vista previa, así que hasta que sea estable quizá prefieras usar ProGuard para eliminar clases, métodos, cambios y atributos no usados de tu código.

Para habilitar ProGuard agrega lo siguiente a tu archivo build.gradle a nivel de módulo:

1
 buildTypes {
2
       release {
3
       minifyEnabled true
4
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
5
       }
6
   }
7
}

Solamente ten en cuenta que ProGuard puede eliminar código que tu aplicación necesita de verdad, por lo que siempre debes probar tu proyecto con ProGuard habilitado antes de publicarlo.

3. Habilita la reducción de recursos

Una vez que hayas habilitado la reducción de código, puedes usar la reducción de recursos para identificar y eliminar recursos innecesarios:

1
 buildTypes {
2
       release {
3
4
//Add the following//
5
6
        shrinkResources true
7
           minifyEnabled true
8
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
9
       }
10
   }
11
}

4. Mejora tu código con Android Lint

Lint es una herramienta de escaneo estática que puede identificar recursos que no estén siendo referenciados en tu código. Sin embargo, Lint no elimina estos recursos, así que tendrás que revisar su reporte y eliminar los recursos identificados manualmente.

Para ejecutar Lint, selecciona Analyze > Inspect Code... (Analizar > Inspeccionar Código...) desde la barra de herramientas de Android Studio. Si Lint detecta recursos sin referencia, entonces los listará en su ventana Inspection Results (Resultados de la inspección).

After running a Lint inspection you can check its findings in the Inspection Results window After running a Lint inspection you can check its findings in the Inspection Results window After running a Lint inspection you can check its findings in the Inspection Results window

Convierte tus PNGs, JPEGs y BMPs a WebP

Si tu proyecto contiene varios elementos de diseño (drawables), entonces comprimirlos puede reducir significativamente el tamaño de tu APK.

Si el valor de minSdkVersion de tu proyecto es 18 o posterior, entonces puedes comprimir tus PNGs, JPEGs y BMPs convirtiéndolos a formato WebP.

Primero usa control-clic sobre el recurso drawable que quieras convertir y elige Convert to WebP... (Convertir a WebP...). Elige entre codificación con pérdida o sin pérdida. Selecciona Skip images when the encoded result is larger than the original (Omitir imágenes cuando el resultado codificado sea más grande que el original) y haz clic en OK para convertir la imagen.

Examina tu APK usando el analizador de APK de Android Studio

Algunas veces quizá no estés totalmente seguro de lo que causó que tu APK se saliera de control.

Puedes identificar a los mayores contribuidores al tamaño de tu APK usando el nuevo APK Analyzer (Analizador de APK) de Android Studio. Esta herramienta te permite explorar el tamaño absoluto y relativo de diferentes categorías de archivos, e incluso el tamaño de archivos individuales, y de esa manera sabrás exactamente en dónde debes enfocar tus esfuerzos.

Para analizar un APK, simplemente selecciona Build > Analyze APK (Compilar > Analizar APK) desde la barra de menú de Android Studio.

En la ventana siguiente selecciona el APK en cuestión. El analizador de APK se abrirá en un panel nuevo.

The APK Analyzer displays the raw and download size of every file that makes up your APKThe APK Analyzer displays the raw and download size of every file that makes up your APKThe APK Analyzer displays the raw and download size of every file that makes up your APK

Para cada archivo y carpeta, el analizador de APK muestra:

  • Tamaño de archivo sin procesar. Este el tamaño descomprimido de este elemento en el disco.
  • Tamaño de descarga. Este es el tamaño comprimido estimado del elemento, como sería entregado por Google Play.
  • % del tamaño total de descarga. El porcentaje del tamaño total de descarga del APK representado por este elemento.

Esta no es la única función que el analizador de APK tiene para ofrecer.

Imagina que has reducido con éxito el tamaño de tu APK y liberado una aplicación ligera que acumula comentarios de brillantes cinco estrellas en Google Play — ¡eso no significa que puedes dejar de preocuparte por el tamaño del APK! en algún momento querrás liberar una actualización, lo que significa que el tamaño del APK nuevamente se volverá una preocupación importante.

Si bien siempre es una buena idea monitorear la manera en la que tu APK evoluciona de un lanzamiento al siguiente, si alguna vez hay un incremento significativo en el tamaño del APK entonces definitivamente querrás echar un vistazo más de cerca a lo que esté pasando.

Puedes usar el analizador de APK para resaltar todas las diferencias entre tu APK actual y tu APK anterior, lo que puede ayudarte a concentrarte en áreas y recursos que puedes optimizar o incluso eliminar completamente.

Para comparar APKs, primero selecciona Build > Analyze APK (Compilar > Analizar APK) desde la barra de menú de Android Studio.

Luego selecciona la versión más reciente de tu APK. En la esquina superior derecha del analizador de APK, selecciona Compare with previous APK... (Comparar con APK anterior...). Después elige la versión anterior de tu APK. Aparecerá una ventana emergente, destacando todas las diferencias entre tu APK actual y tu APK anterior.

¡No te olvides de Android Go!

Los mercados emergentes representan a una de las audiencias de teléfonos inteligentes de crecimiento más rápido del mundo, y el surgimiento de marcas como Vivo y Oppo ha demostrado que los dispositivos económicos tienen el potencial de dominar este mercado en rápida expansión.

Para ayudar a Android a atraer a esta audiencia completamente nueva y creciente, Google ha lanzado Android Go, una versión de Android con mejoras en su desempeño y almacenamiento diseñada para proporcionar una mejor experiencia en dispositivos económicos, incluyendo dispositivos que tienen menos de 1GB de RAM.

Los usuarios de Android Go tienen acceso a la totalidad de la tienda de Google Play, pero Google destaca las aplicaciones que están optimizadas para Android Go, incluyendo aplicaciones que ocupan menos de 40MB en el dispositivo del usuario.

Siguiendo los consejos de este artículo, deberás ser capaz de reducir significativamente el tamaño de tu APK para cualquier persona que lo use. Sin embargo, si quieres hacer algunas reducciones adicionales específicamente para los usuarios de Android Go, entonces puedes usar la función multi-APK de Android para publicar un APK que esté optimizado para la plataforma Android Go.

Para crear una aplicación Android Go dedicada, necesitarás crear un APK que tenga el mismo nombre de paquete y certificado de firma que tu aplicación "regular", pero que tenga una versión única de código.

Al crear tu APK de Android Go, también necesitarás añadir lo siguiente a tu manifiesto:

1
<uses-feature android:name="android.hardware.ram.low" android:required="true">

Conclusión

En este artículo he cubierto todas las principales maneras en las que puedes disminuir el tamaño de tu APK para crear una aplicación más elegante y reducida que podrá ser descargada más rápido y ocupará menos espacio en el dispositivo del usuario.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.