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

Fecha de publicación: 2020-08-21
Última actualización: 2020-08-21
Autor: Vladimir Kameñar

 

Vamos a crear un APK "Hola Mundo" para Android utilizando únicamente herramientas de línea de comandos, sin Entorno Integrado de Desarrollo (IDE). Para que este proceso sea lo más simple posible, no usaremos Gradle, Proguard ni Bundle Tool. Omitir estas herramientas no es una buena práctica, pero es aceptable para nuestro APK minimalista. Las únicas herramientas necesarias serán el Kit de Desarrollo Java (JDK) y el SDK de Android. En el presente artículo usaremos la línea de comandos de Windows, pero el mismo proceso se puede adaptar a cualquier otro entorno.

 

¿Por qué no usar IDE?

Un Entorno Integrado de Desarrollo (IDE) como Android Studio permite automatizar todos estos pasos en un solo clic, resaltar la sintaxis del lenguaje, asistir en la depuración, entre muchas otras funciones útiles. Ignorar estos beneficios y recurrir a la línea de comandos no es algo recomendable, pero existen algunas razones que lo pueden justificar:

  • El desarrollo de un IDE propio u otro tipo de herramienta que genera APK.
  • La necesidad de tener mayor control sobre el proceso de generación de los binarios para evitar al máximo el uso de código autogenerado.
  • Los desarrolladores "old school" rechazan el uso de entornos gráficos.

Otra razón podría ser la curiosidad por conocer internamente el proceso de generación de APK.

Crear un APK desde línea de comandos

 

Las herramientas de trabajo

Como se mencionó más arriba, vamos a utilizar únicamente JDK y Android SDK. JDK es necesario para compilar el código Java y empaquetar los binarios. También se puede usar para generar el certificado necesario para firmar la versión productiva (conocida como "release") del APK. El SDK de Android incluye las herramientas necesarias para convertir el bytecode al formato Dex usado por la máquina virtual Dalvik de Android, alinear y firmar el APK.

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 o Java SE Runtime). Una buena práctica consiste en configurar la variable de entorno JAVA_HOME apuntando a la dirección de instalación de Java (sin incluir el subdirectorio bin). Esto no es mandatorio, 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.

 

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 APK, 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 asignada en nuestro demo.keystore de ejemplo es password (se recomienda elegir una combinación de caracteres más segura cuando cree su certificado).

 

build.bat

Antes de ejecutar el archivo de procesamiento por lotes se debe configurar los siguientes parámetros. Cualquier 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. La versión de API actual es 29. 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.

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

  1. Preprocesar los recursos. Este comando procesa los recursos de Android (imágenes, xml, etc.) y genera R.java con el mapa de los ID numéricos de cada recurso.
    "%BUILD_TOOLS%\aapt" package -f -m -J src -M src\AndroidManifest.xml -S res -I "%ANDROID_JAR%"
    
  2. 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
    
  3. Convertir el bytecode al formato Dex utilizado por la máquina virtual Dalvik de Android.
    "%BUILD_TOOLS%\dx" --dex --output=bin\classes.dex obj
    
  4. Generar el contenedor APK. Este contenedor no está alineado ni firmado.
    "%BUILD_TOOLS%\aapt" package -f -m -F bin\unaligned.apk -M src\AndroidManifest.xml -S res -I "%ANDROID_JAR%"
    
  5. Agregar el bytecode al APK (cd es necesario para mantener la estructura correcta del APK).
    cd bin
    "%BUILD_TOOLS%\aapt" add unaligned.apk classes.dex
    
  6. Alinear el APK.
    "%BUILD_TOOLS%\zipalign" -f 4 unaligned.apk aligned.apk
    
  7. Firmar el APK. Se recomienda utilizar tanto el formato de firma V1 como V2 por compatibilidad con todos los dispositivos Android.
    "%BUILD_TOOLS%\apksigner" sign --ks ..\src\demo.keystore -v1-signing-enabled true -v2-signing-enabled true --ks-pass pass:password --out hello.apk aligned.apk
    

Si no hay errores el resultado es un APK listo para ser instalado en un dispositivo Android.