¿Cómo crear un paquete AAB para Android desde línea de comandos?

Fecha de publicación:
Última actualización: 2021-03-04
Autor:

 

En un artículo anterior, aprendimos cómo crear un ejecutable APK para Android desde línea de comandos, sin usar ningún IDE. Avancemos más y creemos un paquete AAB (Android App Bundle). Sólo utilizaremos JDK, Android SDK y Bundletool. Los pasos que se describen a continuación se probaron en Windows, pero los mismos comandos se pueden adaptar a cualquier otro entorno.

Crear un paquete AAB para Android desde línea de comandos

 

¿Qué es AAB? (Android App Bundle)

Actualmente, AAB es el formato preferido para publicar aplicaciones en Google Play. Este formato de publicación incluye todos los recursos y el código compilado de la aplicación. La generación y la firma del ejecutable APK se delegan a Google Play. De esta manera, el APK se puede optimizar al incluir sólo el código y los recursos necesarios para un dispositivo específico. Por lo tanto, el tamaño de la descarga se puede reducir significativamente.

Por ejemplo, supongamos que nuestra aplicación es compatible tanto con teléfonos como con Android TV. Para compatibilidad con Android TV, hemos creado una imagen de fondo grande de alta resolución. Si publicamos la aplicación en formato APK, nuestra imagen de fondo se descargará en los teléfonos inteligentes, aunque nunca se usará allí. El formato AAB permite evitar la inclusión de datos innecesarios para acelerar la descarga, ahorrar ancho de banda y espacio de almacenamiento.

En el momento de redactar este artículo, sólo Google Play utiliza el formato AAB. Las demás tiendas de aplicaciones no lo utilizan.

¿Por qué no usar IDE?

Android Studio puede crear un AAB automáticamente con un solo clic. Hacerlo manualmente puede ser útil para entender mejor cómo funciona este proceso. Por ejemplo, si está creando su propia herramienta para generar aplicaciones de Android, esta guía se puede utilizar como referencia. Hay casos especiales en los que puede ser necesario evitar el uso de código generado automáticamente. Entonces, es posible que deba compilar el paquete manualmente.

 

Las herramientas de trabajo

Sólo necesitaremos el JDK, Android SDK y Bundletool. JDK es necesario para compilar el código Java y generar los binarios. También se puede utilizar para generar el certificado para la firma. El SDK de Android contiene las herramientas necesarias para convertir el bytecode al formato Dex usado por la máquina virtual Dalvik de Android, alinear y firmar el paquete. Bundletool se utiliza para generar el AAB. También se usa para probar el AAB localmente, generando los APK específicos para cada dispositivo de prueba.

Si aun no tiene JDK 1.6 o posterior instalado, lo puede descargar desde el sitio oficial de Oracle. Asegúrese de instalar el Kit de Desarrollo Java (JDK), no solamente el entorno de ejecución JRE. Se recomienda configurar la variable de entorno JAVA_HOME para que apunte a la ubicación de instalación de Java (sin incluir el subdirectorio bin). Esto no es obligatorio, pero ayuda a evitar conflictos en la localización del JDK, especialmente si existen mas de una versión de JDK instaladas.

La instalación del SDK de Android no es una tarea tan sencilla. Google ya no provee el paquete de instalación completo para el SDK. Existen 2 opciones alternas:

  • Instalar Android Studio desde el sitio oficial. Desde la página inicial del IDE se puede realizar la instalación del SDK fácilmente.
  • Otra opción consiste en descargar e instalar las herramientas de línea de comandos (Command Line Tools), las cuales están disponibles en la sección más inferior de la misma página oficial. Las herramientas de línea de comandos no son el SDK. Luego de instalar estas herramientas de línea de comandos puede ejecutar el sdkmanager para descargar y configurar el SDK de Android.

Las herramientas Build Tools del SDK de Android deben tener al menos la versión 29.0.2. Es posible que las versiones anteriores no incluyan la herramienta AAPT2 o que existan problemas de compatibilidad. También puede descargar la última versión de AAPT2 de Maven como se explica aquí.

La versión mas actual de Bundletool se puede descargar aquí. La herramienta es un único archivo JAR.

 

Ejemplo de proyecto

GitHubUn ejemplo de proyecto completo, incluyendo el código fuente Java y los archivos de procesamiento por lotes de Windows para crear y ejecutar el aplicativo Android, está disponible en nuestro repositorio de GitHub.

Se recomienda crear su propio certificado para firmar el APK. La herramienta keytool de JDK se puede usar para reemplazar nuestro certificado de ejemplo con uno propio:

del src\demo.keystore /q

REM El siguiente comando es una sola linea
"%JAVA_HOME%"\bin\keytool -genkey -keystore src\demo.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias demo

La ruta src\demo.keystore se puede cambiar si desea almacenar el certificado en una ubicación distinta. Si no ha configurado la variable de entorno JAVA_HOME, se debe especificar la ruta completa al ejecutar keytool. El tiempo de validez del certificado y el nombre del alias se pueden modificar. Keytool requiere ingresar unos datos acerca de la organización, ubicación y solicitará asignar una contraseña. La contraseña de nuestro demo.keystore es password (no es una clave realmente fuerte).

 

build.bat

Antes de ejecutar build.bat se debe configurar los parámetros que se describen a continuación. Un editor de texto plano como el Bloc de Notas (Notepad) se puede usar para editar build.bat:

  • BUILD_TOOLS es la ubicación de las herramientas Build Tools dentro del SDK de Android. Utilice el valor de ejemplo como referencia.
  • ANDROID_JAR es la ruta de android.jar para la versión de API requerida. Se recomienda utilizar la última versión de API disponible. Esto no afecta la ejecución del APK en versiones de Android anteriores, a menos que la aplicación utilice características específicas de las nuevas versiones.
  • BUNDLETOOL es la ubicación del archivo jar de Bundletool. Intente utilizar la última versión, si es posible.

Revisemos las acciones que realiza el archivo de procesamiento por lotes paso a paso:

  1. Compilar los recursos. Este comando analiza los recursos (imágenes, xml, etc.) y los empaqueta en un archivo ZIP. Observe que para construir un AAB estamos usando la herramienta AAPT2 en lugar de AAPT.
    "%BUILD_TOOLS%\aapt2" compile --dir res\ -o obj\res.zip
    
  2. Enlazar los recursos. Esta es una sola línea:
    "%BUILD_TOOLS%\aapt2" link --proto-format -o obj\linked.zip -I "%ANDROID_JAR%" --manifest src\AndroidManifest.xml --java src obj\res.zip --auto-add-overlay
    
  3. Compilar el código fuente Java y generar el código binario (bytecode) correspondiente.
    "%JAVA_HOME%\bin\javac" -d obj -classpath src -bootclasspath "%ANDROID_JAR%" src\com\celer\hello\*.java
    
  4. Convertir el bytecode al formato Dex utilizado por la máquina virtual Dalvik de Android.
    "%BUILD_TOOLS%\dx" --dex --output=bin\classes.dex obj
    
  5. Combinar los recursos y el bytecode en un solo paquete:
    cd obj
    "%JAVA_HOME%\bin\jar" xf linked.zip resources.pb AndroidManifest.xml res
    mkdir manifest dex 2>nul
    move AndroidManifest.xml manifest
    copy /Y /B ..\bin\classes*.dex dex\ 2>nul
    "%JAVA_HOME%\bin\jar" cMf base.zip manifest dex res resources.pb
    
  6. Generar el AAB.
    "%JAVA_HOME%\bin\java" -jar "%BUNDLETOOL%" build-bundle --modules=base.zip --output=..\bin\hello.aab
    
  7. Firmar el AAB.
    "%JAVA_HOME%\bin\jarsigner" -keystore ..\src\demo.keystore -storepass password ..\bin\hello.aab demo
    

Si no hay errores el resultado es un AAB listo para ser publicado en Google Play.