Firmar una APK para Android en Linux

Ignacio Buioli
- 21/06/2017

Hace un tiempo comentábamos las posibilidades de producir una App para Android, con los recursos que ofrecen HTML, CSS y JavaScript; mediante el framework de Apache Cordova. Quienes lo prueben conseguirán visualizar su App en un emulador como el AVD o Genymotion, no obstante, al momento de hacer una versión release para visualizar desde un teléfono, se nos avisará que la App no es segura, y no podremos instalarla. Ni hablar si tenemos deseos de subirla al Play Store de Google. Y la razón es sencilla: necesitamos firmar el APK.

Al generar un APK desde frameworks como Córdova o Ionic aparecerá un archivo que suele llamarse android-release-unsigned.apk. Ese archivo APK está comprimido como corresponde y es 100% funcional, sin embargo se nos pide que la validemos al "firmarla" de forma digital por razones relacionadas con el cifrado. A continuación se detallan unas sencillas instrucciones para firmar un APK en linux de forma manual (se puede realizar de forma automática modificando las opciones de compilación). Para empezar, necesitamos generar una keystore. Se trata de una clave cifrada que va a acompañar al archivo APK, y se genera como un archivo a parte, se puede usar indefinidas veces hasta que cumpla su ciclo de vencimiento. Teniendo una versión de Java instalada ya nos encontramos en condiciones de utilizar la keytool. Vamos a ejecutar el siguiente comando:

 

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

 

Nos pedirá introducir la contraseña del almacén de claves, pondremos una contraseña cualquiera y la repetiremos. Acto seguido, pedirá datos como nombres, ciudad, etc. Podemos completar los campos si deseamos o saltearlos oprimiendo la tecla Enter. Cuando nos pregunte si es Correcto, pondremos la tecla S, le damos al Enter nuevamente y finalmente dejamos la misma contraseña para el alias_name. Ahora sí, nos dispondremos a firmar el APK, para eso vamos a mover nuestra android-release-unsigned.apk a mismo directorio donde se generó nuestra keystore, que llevará el nombre de my-release-key.keystore. Usaremos el siguiente comando para ello:

 

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk alias_name

 

En caso de que nuestra APK no lleve el nombre android-release-unsigned.apk, será necesario modificarlo en el comando previamente utilizado. De más está decir, asegurarnos de estar trabajando desde la terminal en el mismo directorio donde se encuentran nuestros archivos. Vamos a tener que escribir la misma clave que usamos previamente para generar el archivo my-release-key.keystore, y acto seguido nuestra APK pasará a estar firmada. Solamente nos queda comprimirla nuevamente en un APK firmado. Necesitaremos zipalign, que se instala mediante sudo apt-get install zipalign, una vez instalado usaremos el siguiente comando:

 

zipalign -v 4 android-release-unsigned.apk android.apk

 

Si todo fue satisfactorio, en nuestro directorio de trabajo tiene que aparecer un archivo llamado android.apk, y se tratará ni más ni menos de nuestra APK firmada, lista para ser utilizada en dispositivos móviles.