bundletool

Luego de crear un Android App Bundle, deberías probar la manera en que Google Play lo usa para generar los APK y el modo en que estos se comportan cuando se implementan en un dispositivo. Hay dos maneras de probar el paquete de tu aplicación: de forma local, mediante la herramienta de línea de comandos bundletool o con Google Play, subiendo tu paquete en Play Console y usando un segmento de prueba. En esta página, se explica cómo usar bundletool para probar de forma local el paquete de tu aplicación.

bundletool es la herramienta subyacente que Gradle, Android Studio y Google Play usan para compilar un Android App Bundle o convertir un paquete de aplicación en los diversos APK que se implementan en dispositivos. bundletool también está disponible como una herramienta de línea de comandos que permite recrear, inspeccionar y verificar la compilación de los APK de tu app del servidor de Google Play.

Deberías usar Android Studio y el complemento de Android para Gradle a fin de compilar y firmar un Android App Bundle. Sin embargo, si no es posible usar el IDE (por ejemplo, porque estás usando un servidor de compilación continua), también puedes compilar el paquete de tu aplicación desde la línea de comandos y firmarlo con jarsigner.

De forma predeterminada, el IDE no usa paquetes de apps a fin de implementar tu app en un dispositivo local para realizar pruebas. Sin embargo, puedes modificar la configuración de ejecución o depuración, y seleccionar la opción que permite implementar el APK desde el paquete de la aplicación para ver cómo afecta la ejecución de tu app.

Descarga bundletool

Si aún no lo hiciste, descarga bundletool desde el repositorio de GitHub.

Cómo generar un conjunto de APK desde el paquete de tu aplicación

Cuando bundletool genera los APK desde el paquete de tu aplicación, los incluye en un contenedor llamado archivo de conjunto de APK, que usa la extensión de archivo .apks. A fin de generar un conjunto de APK para todas las configuraciones del dispositivo que admite tu app desde el paquete correspondiente, usa el comando bundletool build-apks, como se muestra a continuación.

    bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    

Si quieres implementar los APK en un dispositivo, también deberás incluir la información de firma de tu app, como se muestra en el siguiente comando. Si no especificas la información de firma, bundletool intentará firmar tus APK por ti con una clave de depuración.

    bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    --ks=/MyApp/keystore.jks
    --ks-pass=file:/MyApp/keystore.pwd
    --ks-key-alias=MyKeyAlias
    --key-pass=file:/MyApp/key.pwd
    

En la tabla que aparece a continuación, se describen con mayor detalle las diversas marcas y opciones que puedes configurar cuando se usa el comando bundletool build-apks. Solo las marcas --bundle y --output son obligatorias; todas las demás son opcionales.

Marca Descripción
--bundle=path Obligatorio: Especifica la ruta de acceso al paquete de tu aplicación que compilaste con Android Studio. Para obtener más información, lee Cómo compilar tu proyecto.
--output=path Obligatorio: Especifica el nombre del archivo ".apks" de salida, que contiene todos los artefactos APK de tu app. Para probar los artefactos de este archivo en un dispositivo, ve a la sección sobre cómo implementar APK en un dispositivo conectado.
--overwrite Incluye esta marca si deseas reemplazar cualquier archivo de salida existente por la misma ruta de acceso que especifiques mediante la opción --output. Si no incluyes esta marca y el archivo de salida ya existe, obtendrás un error de compilación.
--aapt2=path Especifica una ruta de acceso a AAPT2 personalizada. De manera predeterminada, bundletool incluye su propia versión de AAPT2.
--ks=path Especifica la ruta de acceso al almacén de claves de implementación que se usa para firmar los APK. Esta marca es opcional. Si no la incluyes, bundletool intentará firmar tus APK con una clave de firma de depuración.
--ks-pass=pass:password
o
--ks-pass=file:/path/to/file
Especifica la contraseña de tu almacén de claves. Si quieres especificar una contraseña en texto sin formato, califícala con pass:. Si quieres pasar la ruta de acceso a un archivo que contiene la contraseña, califícala con el archivo file:. Si especificas un almacén de claves utilizando la marca --ks sin especificar --ks-pass, bundletool te solicitará una contraseña desde la línea de comandos.
--ks-key-alias=alias Especifica el alias de la clave de firma que deseas usar.
--key-pass=pass:password
o
--key-pass=file:/path/to/file
Especifica la contraseña para la clave de firma. Si quieres especificar una contraseña en texto sin formato, califícala con pass:. Si quieres pasar la ruta de acceso a un archivo que contiene la contraseña, califícala con el archivo file:.

Si esta contraseña es idéntica a la del almacén de claves en sí, puedes omitir esta marca.

--connected-device Indícale a bundletool que compile los APK que se orientan a la configuración de un dispositivo conectado. Si no incluyes esta marca, bundletool generará APK para todas las configuraciones del dispositivo que admite tu app.
--device-id=serial-number Si tienes más de un dispositivo conectado, usa esta marca para especificar el ID de serie del dispositivo en el que desees implementar tu app.
--device-spec=spec_json Usa esta marca para proporcionar una ruta de acceso a un archivo .json que especifique la configuración del dispositivo al que desees apuntar. Para obtener más información, consulta la sección sobre Cómo crear y usar archivos JSON de especificación de dispositivo.
--mode=universal Configura el modo en universal si deseas que bundletool compile un solo APK que incluya todos los recursos y el código de tu app, de manera que el APK sea compatible con todas las configuraciones del dispositivo compatibles con tu app.

Nota: bundletool incluye solo módulos de funciones dinámicas que especifican <dist:fusing dist:include="true"/> en su manifiesto en un APK universal. Si deseas obtener más información, lee sobre el manifiesto del módulo de funciones dinámicas.

Ten en cuenta que estos APK son más grandes que los optimizados para una configuración del dispositivo en particular. Sin embargo, son más fáciles de compartir con verificadores internos que, por ejemplo, quieran probar tu app en varias configuraciones de dispositivos.

Cómo implementar APK en un dispositivo conectado

Una vez que generes un conjunto de APK, bundletool puede implementar la combinación correcta de APK de ese conjunto en un dispositivo conectado.

Por ejemplo, si tienes un dispositivo conectado que ejecuta Android 5.0 (API nivel 21) o versiones posteriores, bundletool instala el APK base, los APK de funciones dinámicas y los APK de configuración necesarios para ejecutar tu app en ese dispositivo. De manera alternativa, si tu dispositivo conectado ejecuta Android 4.4 (API nivel 20) o versiones anteriores, bundletool busca una variante de varios APK compatible y la implementa en tu dispositivo.

Para implementar tu app desde un conjunto de APK, usa el comando install-apks y especifica la ruta de acceso del conjunto de APK por medio de la marca --apks=/path/to/apks, como se muestra a continuación. (Si tienes varios dispositivos conectados, debes especificar el dispositivo de destino agregando la marca --device-id=serial-id).

    bundletool install-apks --apks=/MyApp/my_app.apks
    

Cómo generar un conjunto de APK específicos del dispositivo

Si prefieres no crear un conjunto de APK para todas las configuraciones del dispositivo que admite tu app, puedes compilar APK que se orienten solo a la configuración de un dispositivo conectado por medio de la opción --connected-device, como se muestra a continuación. (Si tienes varios dispositivos conectados, debes especificar el dispositivo de destino incluyendo la marca --device-id=serial-id).

    bundletool build-apks --connected-device
    --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    

Cómo generar y usar archivos JSON de especificación de dispositivo

bundletool es capaz de generar un conjunto de APK que se oriente a una configuración del dispositivo especificada por un archivo JSON. A fin de generar primero un archivo JSON para un dispositivo conectado, ejecuta el siguiente comando:

    bundletool get-device-spec --output=/tmp/device-spec.json
    

bundletool crea un archivo JSON para tu dispositivo en el directorio donde se encuentra la herramienta. Luego, puedes pasarlo a bundletool para generar un conjunto de APK que se oriente solo a la configuración descrita en ese archivo JSON de la siguiente manera:

    bundletool build-apks --device-spec=/MyApp/pixel2.json
    --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    

Cómo crear manualmente una especificación de dispositivo JSON

Si no tienes acceso al dispositivo para el que deseas crear un conjunto de APK específico (por ejemplo, un amigo quiere probar tu app con un dispositivo que no tiene a mano), puedes crear manualmente un archivo JSON con el siguiente formato:

{
      "supportedAbis": ["arm64-v8a", "armeabi-v7a"],
      "supportedLocales": ["en", "fr"],
      "screenDensity": 640,
      "sdkVersion": 27
    }
    

Luego puedes pasar este JSON al comando bundle extract-apks, como se describe en la sección anterior.

Cómo extraer los APK específicos del dispositivo de un conjunto de APK existente

Si tienes un conjunto de APK existente y quieres extraer de él un subconjunto de APK que se orienten a una configuración del dispositivo específica, puedes usar el comando extract-apks y establecer una especificación de dispositivo JSON, de la siguiente manera:

    bundletool extract-apks
    --apks=/MyApp/my_existing_APK_set.apks
    --output-dir=/MyApp/my_pixel2_APK_set.apks
    --device-spec=/MyApp/bundletool/pixel2.json
    

Cómo medir los tamaños de descarga estimados de los APK en un conjunto de APK

Para medir los tamaños de descarga estimados de los APK en un conjunto de APK de la manera en que se publicarían comprimidos por medio de la conexión, usa el comando get-size total:

    bundletool get-size total --apks=/MyApp/my_app.apks
    

Puedes modificar el comportamiento del comando get-size total mediante las siguientes marcas:

Marca Descripción
--apks=path Obligatorio: Especifica la ruta de acceso al archivo de conjunto de APK existente del cual se mide el tamaño de descarga.
--device-spec=path Especifica la ruta al archivo de especificaciones del dispositivo (de get-device-spec o construido manualmente) que se debe usar para la coincidencia. Puedes especificar una ruta de acceso parcial para evaluar un conjunto de configuraciones.
--dimensions=dimensions Especifica las dimensiones que se usan al calcular las estimaciones de tamaño. Acepta una lista separada por comas de: SDK, ABI, SCREEN_DENSITY y LANGUAGE. Para medir en todas las dimensiones, especifica ALL.
--instant Mide el tamaño de descarga de los APK habilitados de manera instantánea, en lugar de los APK instalables. De manera predeterminada, bundletool mide los tamaños de descarga de los APK instalables.
--modules=modules Especifica una lista de módulos separados por comas en el conjunto de APK para tener en cuenta en la medición. El comando bundletool incluye automáticamente los módulos dependientes para el conjunto especificado. De manera predeterminada, el comando mide el tamaño de descarga de todos los módulos instalados durante la primera descarga.

Recursos adicionales

Para obtener más información sobre cómo usar bundletool, consulta el siguiente recurso.

Codelabs

  • Tu primer Android App Bundle, un codelab que explora los principios básicos de los archivos Android App Bundle y te muestra cómo comenzar rápidamente a compilar el tuyo con Android Studio. En este codelab, también se analiza cómo probar los paquetes de aplicaciones usando bundletool.