Si has decidido realizar tu aplicación sobre los estándares Web, puedes generar el .apk para publicarlos en la Play Store utilizando la línea de comando con Apache Cordova, o los compiladores en la nube como PhoneGap Build o CocoonJS. Cabe destacar que estas tres herramientas también permiten la compilación para iOS y otras plataformas.
La app que vamos a empaquetar es este sencillo ejemplo que se comunica con una API y almacena valores en una base de datos. Clonamos y compilamos el proyecto ya que, para los tres métodos que vamos a probar, solamente necesitamos trabajar con los assets de nuestra aplicación, es decir, el directorio www que contiene el html, css, js, img,…
La primera herramienta que vamos a probar será Cordova desde la línea de comandos. En la siguiente entrada hablaremos sobre CocoonJS y PhoneGap Build.
Apache Cordova CLI
En esta entrada, vamos a suponer que ya tienes instalado Cordova Command Line Tool y la SDK de Android (con el Stand-alone SDK Tools es suficiente). Si te atascas en este paso, escríbeme y añado un howto ;-)
Por lo tanto, crea un proyecto Cordova ejecutando en la línea de comandos:
cordova create contacts com.example.contacts Contacts
El primer argumento es la carpeta que creará el comando. Los dos siguientes son el identificador único que debe tener tu app y el nombre de la aplicación cuando se instale en el dispositivo. Si accedes a la carpeta contacts, verás que Cordova ha generado ya una estructura de ficheros y directorios. Ahora debemos añadir la plataforma para la cual vamos a compilar la aplicación, en este caso:
cordova platform add android
Llegados a este punto y si hemos podido instalar correctamente el SDK, podemos probar el ejemplo que nos proporciona Cordova directamente en nuestro terminal Android. Para ello, activa el USB debugging, conecta tu terminal a tu equipo y ejecuta:
cordova build
cordova run android
Si todo ha salido bien, se te instalará la app Contacts en tu Android y verás en tu pantalla el mensaje APACHE CORDOVA DEVICE IS READY. Recuerda que con cada cambio en cualquiera de los ficheros correspondiente a los assets, deberás ejecutar cordova build.
Ya tenemos todo listo para compilar nuestra aplicación. Remplaza el contenido de la carpeta www del proyecto Cordova (donde encontrarás las carpertas css, img, js y el index.html) por el index.html y la carpeta assets de nuestra app. Vuelve a ejecutar cordova build y si quieres, prueba en tu dispositivo que la app se instala correctamente.
Recordemos que esta app se comunica con una API y almacena valores en un MongoDB, así que si quieres jugar con ella, debes cambiar en el fichero app.proxy.coffee la URL para que apunte a la dirección de la máquina que tiene levantado el servicio. En mi caso, como las pruebas son en local, mi fichero quedaría tal que así:
Después de este cambio, ejecuta gulp init y vuelve a reemplazar el contenido, es decir, copia la carpeta assets/js al assets/js del proyecto Cordova y tal y como hemos comentado anteriormente, siempre que se hagan cambios en el proyecto Cordova debemos volver a ejecutar cordova build.
Firmando la app
Como sabrás, Android requiere que todas las aplicaciones sean firmadas digitalmente con un certificado antes de que puedan ser publicadas en la Play Store. Para ello, en primer lugar, generaremos la clave privada utilizando keytool que se instala con el SDK de Android:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Este comando creará el fichero .keystore y el alias será el valor que necesitarás para firmar el apk.
A continuación compilaremos nuestra app en release mode para obtener el MainActivity-release-unsigned.apk:
cordova build --release
La ruta del fichero compilado te lo indica la terminal, al final de la compilación:
Built the following apk(s):
~/platforms/android/ant-build/MainActivity-release-unsigned.apk
El tercer paso es firmar el .apk con la herramienta jarsigner.
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
Puede que te sea más cómodo mover el MainActivity-release-unsigned.apk donde hayas creado el keystore antes de ejecutar este comando. Y si te parece, puedes renombrar este fichero. Al final, haz que concuerde el nombre del unsigned apk y el alias que has asignado en el paso 1. En mi caso ha quedado así:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore contacts.keystore Contacts-release.apk contacts
La consola te pedirá el password que has asignado al keystore. Si todo ha salido bien, verás como el comando ha firmado cada fichero del apk.
Ahora nos queda verificar que el apk está correctamente firmado:
jarsigner -verify -verbose -certs Contacts-release.apk
Al terminar verás el siguiente mensaje:
jar verified.
Como último paso vamos a ejecutar la herramienta zipalign que añade flags de comienzo de dato para los ficheros sin comprimir:
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
Si al ejecutar el comando la consola te responde
-bash: zipalign: command not found
Añade el path a esta herramienta del SDK. En mi caso se encuentra en:
~/android-sdk-macosx/build-tools/[version]/zipalign -v 4 Contacts-release.apk contacts.apk
El último argumento será el apk final que se creará al ejecutar este comando, ese es el apk que subirás a la Play Store. Si necesitas cualqueir plugin lo puedes instalar desde la línea de comando:
cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
La documentación es bastante completa, encontrarás todo lo que necesites. Recuerda que con cada cambio deberás volver a compilar el proyecto Cordova antes de conseguir el apk final.
Coméntame cualquier duda, sugerencia y perdón por cualquier errata, dime y la corregimos :-)