El formato Android App Bundle

Un Android App Bundle es un archivo (con la extensión .aab) que subes a Google Play.

Los paquetes de aplicaciones son objetos binarios firmados que organizan el código y los recursos de tu app en módulos, como se muestra en la figura 1. El código y los recursos de cada módulo se organizan de manera similar al contenido de un APK, lo que tiene sentido porque cada uno de los módulos puede generarse como un APK independiente. Luego, Google Play usa el paquete de aplicación para generar los diferentes APK que se entregan a los usuarios, como el APK base, los APK de funciones, los APK de configuración y los APK múltiples (para dispositivos que no admiten APK divididos). Los directorios de color azul, como drawable/, values/ y lib/, representan el código y los recursos que usa Google Play cuando crea APK de configuración para cada módulo.

Los paquetes de aplicaciones organizan tu app en directorios y cada directorio representa un módulo. Dentro de cada directorio de módulo, el código y los recursos se organizan de manera similar al contenido de un APK típico.

Figura 1: El contenido de un Android App Bundle con un módulo base, dos módulos de funciones y dos paquetes de elementos

En la siguiente lista, se describen con más detalle algunos de los archivos y directorios del paquete de aplicación:

  • base/, feature1/ y feature2/: Cada uno de estos directorios de nivel superior representa un módulo diferente de tu app. El módulo base para la aplicación siempre se encuentra en un directorio base del paquete de aplicación. Sin embargo, el directorio de cada módulo de funciones recibe el nombre que especifica el atributo split en el manifiesto del módulo. Si deseas obtener más información, lee sobre el manifiesto del módulo de funciones.
  • asset_pack_1/ y asset_pack_2/: En el caso de las apps o los juegos grandes con gráficos complejos, puedes modularizar los elementos en paquetes, que son ideales para los juegos debido a que tienen mayores límites de tamaño. Puedes personalizar el modo y el momento en el que se descarga cada paquete de elementos en un dispositivo según tres modos de publicación: install-time, fast-follow y on-demand. Todos los paquetes de elementos se alojan en Google Play y se entregan desde allí. A fin de obtener más información para agregar paquetes de elementos a tu paquete de aplicación, consulta la descripción general de Play Asset Delivery.
  • BUNDLE-METADATA/: este directorio incluye archivos de metadatos que contienen información útil para herramientas o tiendas de aplicaciones. Los archivos de metadatos pueden incluir asignaciones de ProGuard y la lista completa de los archivos DEX de tu app. Los archivos incluidos en este directorio no están empaquetados en los APK de tu aplicación.
  • Archivos de búfer de protocolo (*.pb) de módulos: Estos archivos proporcionan metadatos que ayudan a describir el contenido de cada módulo de app para las tiendas de aplicaciones, como Google Play. Por ejemplo, BundleConfig.pb proporciona información sobre el paquete, como la versión de las herramientas de compilación que se usó para compilar el paquete de aplicación, mientras que native.pb y resources.pb describen el código y los recursos de cada módulo, lo que resulta útil cuando Google Play optimiza los APK para diferentes configuraciones del dispositivo.
  • manifest/: A diferencia de los APK, los paquetes de aplicaciones almacenan el archivo AndroidManifest.xml de cada módulo en este directorio independiente.
  • dex/: A diferencia de los APK, los paquetes de aplicaciones almacenan los archivos DEX de cada módulo en este directorio independiente.
  • res/, lib/ y assets/: Estos directorios son idénticos a los de un APK típico. Cuando subes el paquete de aplicación, Google Play inspecciona estos directorios y empaqueta solamente los archivos que satisfacen la configuración del dispositivo de destino, sin alterar las rutas de acceso de los archivos.
  • root/: En este directorio se almacenan archivos que luego se trasladan al directorio raíz de cualquier APK que incluya el módulo en el que se encuentra este directorio. Por ejemplo, el directorio base/root/ de un paquete de aplicación puede incluir recursos basados en Java que tu app carga mediante Class.getResource(). Esos archivos luego se trasladan al directorio raíz del APK base de tu app y al de cada APK múltiple que genera Google Play. También se conservan las rutas de acceso dentro de este directorio. Es decir, los directorios (y sus subdirectorios) también se trasladan al directorio raíz del APK.

Descripción general de los APK divididos

Un componente fundamental a la hora de entregar aplicaciones optimizadas es el mecanismo de APK dividido disponible en Android 5.0 (nivel de API 21) y versiones posteriores. Los APK divididos son muy similares a los APK normales: incluyen el código de bytes DEX compilado, los recursos y un manifiesto de Android. Sin embargo, la plataforma Android puede tratar varios APK divididos instalados como una sola app. Por lo tanto, puedes instalar varios APK divididos que tengan acceso a código y recursos comunes, y aparezcan como una misma app instalada en el dispositivo.

El beneficio de los APK divididos es la capacidad de dividir un APK monolítico, es decir, un APK que incluye código y recursos para todas las funciones y configuraciones de dispositivos compatibles con la app, en paquetes independientes más pequeños que se instalan en el dispositivo de un usuario según sea necesario.

Por ejemplo, un APK dividido puede incluir el código y los recursos para una función adicional que solo algunos de los usuarios necesitan, mientras que otro APK dividido incluye recursos para solo un idioma específico o una densidad de pantalla particular. Cada uno de estos APK divididos se descarga e instala cuando el usuario lo solicita o el dispositivo lo requiere.

A continuación, se describen los diferentes tipos de APK que se pueden instalar juntos en un dispositivo para formar la experiencia de app completa. En las demás secciones de esta página, aprenderás a configurar tu proyecto de app para admitir estos APK.

  • APK de base: Este APK contiene código y recursos a los que pueden acceder todos los demás APK divididos y proporciona la funcionalidad básica de la app. Cuando un usuario solicita descargar tu app, este APK se descarga y se instala primero. Esto se debe a que solo el manifiesto del APK de base contiene una declaración completa de los servicios, los proveedores de contenido, los permisos, los requisitos de versión de la plataforma y las dependencias de las funciones del sistema de la app. Google Play genera el APK de base para la app a partir del módulo de app (o base) de tu proyecto. Si te interesa reducir el tamaño de descarga inicial de la app, es importante tener en cuenta que todo el código y los recursos incluidos en este módulo se incluyen en el APK de base de la app.
  • APK de configuración: Cada uno de estos APK incluye bibliotecas nativas y recursos para una densidad de pantalla, una arquitectura de CPU o un idioma específicos. Cuando un usuario descarga la app, el dispositivo descarga e instala solo los APK de configuración correspondientes para su dispositivo. Cada APK de configuración depende de un APK de base o de un APK de módulo de función. Es decir, se descargan y se instalan junto con el APK al que proporcionan código y recursos. A diferencia de los módulos de base y de funciones, no es necesario crear un módulo independiente para los APK de configuración. Si usas las prácticas estándar para organizar recursos alternativos y específicos para cada configuración en tus módulos de base y de funciones, Google Play generará automáticamente los APK de configuración.
  • APK del módulo de funciones: cada uno de estos APK contiene código y recursos para una función de la app que se modulariza mediante módulos de funciones. Puedes personalizar cómo y cuándo se descarga esa función en un dispositivo. Por ejemplo, se puede usar la biblioteca de Play Core para instalar las funciones a pedido después de instalar el APK de base en el dispositivo a fin de brindar funcionalidad adicional al usuario. Por ejemplo, piensa en una app de chat que descarga e instala la funcionalidad para capturar y enviar fotos únicamente cuando el usuario solicita usarla. Dado que los módulos de funciones pueden no estar disponibles en el momento de la instalación, debes incluir el código y los recursos comunes en el APK de base. Eso significa que el módulo de función debe suponer que solo el código y los recursos del APK de base estarán disponibles durante la instalación. Google Play genera los APK de módulos de funciones para tu app a partir de los módulos de funciones del proyecto.

Otro ejemplo sería una app con tres módulos de funciones y compatibilidad con diversas configuraciones de dispositivos. A continuación, en la figura 1, se ilustra un ejemplo de árbol de dependencias para los diversos APK de la app. Allí se ve que el APK de base forma la cabeza del árbol, y todos los demás APK dependen del APK de base. (Si quieres saber cómo se representan los módulos para esos APK en un Android App Bundle, consulta El formato Android App Bundle).

El APK de base forma la cabeza del árbol, y los APK de funciones dependen de él. Los APK de configuración, que incluyen código y recursos específicos según la configuración del dispositivo para el APK de base y cada APK de módulos de funciones, forman los nodos de hoja del árbol de dependencias.

Figura 1: Árbol de dependencias para una app entregada con APK divididos

Recuerda que no necesitas crear estos APK, ya que Google Play lo hace automáticamente usando un único paquete de aplicación firmado que creas con Android Studio. Para obtener más información sobre el formato del paquete de aplicación y cómo crear uno, consulta Cómo compilar, implementar y subir Android App Bundles.

Dispositivos con Android 4.4 (API nivel 19) y versiones anteriores

Puesto que los dispositivos con Android 4.4 (API nivel 19) y versiones anteriores no admiten la descarga e instalación de APK divididos, Google Play entrega a esos dispositivos un solo APK, llamado APK múltiple, optimizado para la configuración del dispositivo. Es decir, los APK múltiples representan la experiencia de app completa, pero no incluyen código o recursos innecesarios, como los usados para otras densidades de pantalla y arquitecturas de CPU.

Sin embargo, sí incluyen recursos para todos los idiomas que admite la app. De esta forma, por ejemplo, los usuarios pueden cambiar la configuración de idioma preferida de la app sin tener que descargar un APK múltiple diferente.

Los APK múltiples no permiten descargar más adelante módulos de funciones a pedido. Para incluir un módulo de función en este APK, debes inhabilitar On-demand o habilitar Fusing cuando crees el módulo de funciones.

Ten en cuenta que, con los paquetes de aplicación, no necesitas compilar, firmar, subir y administrar APK para cada configuración de dispositivo compatible con tu app. Solo debes compilar y cargar un paquete de aplicación para toda la app, y Google Play se encarga del resto. Entonces, independientemente de si tienes pensado o no admitir dispositivos con Android 4.4 o versiones anteriores, Google Play proporciona un mecanismo de entrega flexible tanto para ti como para los usuarios.

Cambios en el idioma de los usuarios

Con los paquetes de aplicaciones, los dispositivos solo descargan el código y los recursos necesarios a fin de ejecutar tu app. Por lo tanto, para los recursos de idioma, el dispositivo de un usuario solo descarga los recursos de idioma de tu app que coinciden con uno o más de los idiomas seleccionados actualmente en la configuración del dispositivo.

Cuando un usuario cambia el idioma en la configuración del dispositivo, es posible que Google Play deba descargar e instalar algunos APK divididos adicionales para que la app pueda mostrarse en el nuevo idioma.

Google Play intentará descargar los idiomas adicionales inmediatamente después del cambio. Si el dispositivo del usuario no tiene conexión, la descarga falla o los recursos son demasiado grandes, Google Play vuelve a intentar la descarga en segundo plano cuando las condiciones del dispositivo son más favorables. Cuando se ejecuta en un dispositivo con Android 9.0 (nivel de API 28) o versiones anteriores, si la app se encuentra en primer plano durante la instalación de los nuevos APK divididos de idiomas, se cerrará.

Si tu app requiere que todos los idiomas estén disponibles en el dispositivo en cualquier momento, puedes inhabilitar la división de idiomas en la configuración de compilación.

Si tu app requiere descargar idiomas adicionales independientemente de los idiomas del usuario seleccionados en la configuración del dispositivo (por ejemplo, para implementar un selector de idioma dentro de la app), puedes usar la biblioteca de Play Core a fin de descargarlos on demand.