¿Cómo crear un archivo APK firmado usando la interfaz de línea de comandos de Cordova?

169

Hice una aplicación de muestra llamada checkStatus. Ahora quiero crear un archivo APK firmado. Entonces puedo instalarlo en diferentes dispositivos para mis pruebas.

Para esto, busqué en Google y encontré esta documentación .

Según el documento, cambié a mi directorio de proyecto y ejecuté el siguiente comando:

keytool -genkey -v -keystore key-name.keystore -alias alias-name -keyalg RSA -keysize 2048 -validity 10000

Después de ejecutar el comando anterior, obtuve un archivo llamado key-name.keystoreat projectRoot/key-name.keystore.

Y luego copié y pegué ese archivo projectRoot/platforms/android/key-name.keystore.

Después de eso, creé un archivo llamado ant.propertiesy lo guardé projectRoot/platforms/android.

Escribí el siguiente código dentro del archivo:

key.store=projectRoot/key-name.keystore
key.alias=myApp

Después de eso, ejecuté el siguiente comando para liberar

Cordova builds android --release

Está arrojando el siguiente error:

 /home/projectRoot/platforms/android/cordova/node_modules/q/q.js:126
                throw e;
                      ^
Error code 1 for command: ant with args: release,-f,/home/projectRoot/platforms/android/build.xml,-Dout.dir=ant-build,-Dgen.absolute.dir=ant-gen

 Error: /home/projectRoot/platforms/android/cordova/build: Command failed with exit code 8
at ChildProcess.whenDone (/usr/lib/node_modules/cordova/node_modules/cordova-lib/src/cordova/superspawn.js:135:23)
at ChildProcess.EventEmitter.emit (events.js:98:17)
at maybeClose (child_process.js:753:16)
at Process.ChildProcess._handle.onexit (child_process.js:820:5)

Esta vez, modifiqué el key.storevalor en el ant.propertiesarchivo de la siguiente manera.

 key.store=/home/projectRoot/platforms/android/key-name.keystore

Nuevamente, ejecuté el cordova build android --releasecomando. Lanza el mismo error.

¿Alguien puede decirme qué he hecho mal?

vasan
fuente
3
comenzando con cordova 5, el proceso cambia un poco: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks

Respuestas:

305

Paso 1:

D:\projects\Phonegap\Example> cordova plugin rm org.apache.cordova.console --save

agregue el --savepara que elimine el complemento del config.xmlarchivo.

Paso 2:

Para generar una versión de lanzamiento para Android, primero debemos hacer un pequeño cambio en el AndroidManifest.xmlarchivo que se encuentra en plataformas / Android. Edite el archivo y cambie la línea:

<application android:debuggable="true" android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name">

y cambiar android:debuggablea false:

<application android:debuggable="false" android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name">

A partir de cordova 6.2.0, elimine completamente la etiqueta android: debuggable. Aquí está la explicación de Córdoba:

Explicación de los problemas de tipo "HardcodedDebugMode": es mejor omitir el atributo android: debuggable del manifiesto. Si lo hace, las herramientas insertarán automáticamente android: debuggable = true al crear un APK para depurar en un emulador o dispositivo. Y cuando realiza una compilación de lanzamiento, como Exportar APK, lo configurará automáticamente en falso.

Si, por otro lado, especifica un valor específico en el archivo de manifiesto, las herramientas siempre lo usarán. Esto puede llevar a publicar accidentalmente su aplicación con información de depuración.

Paso 3:

Ahora podemos decirle a cordova que genere nuestra versión de lanzamiento:

D:\projects\Phonegap\Example> cordova build --release android

Luego, podemos encontrar nuestro archivo APK sin firmar en platforms/android/ant-build. En nuestro ejemplo, el archivo fueplatforms/android/ant-build/Example-release-unsigned.apk

Paso 4:

Nota: Tenemos nuestro almacén keystoreNAME-mobileapps.keystorede claves en este repositorio de Git, si desea crear otro, continúe con los siguientes pasos.

Generación clave:

Sintaxis:

keytool -genkey -v -keystore <keystoreName>.keystore -alias <Keystore AliasName> -keyalg <Key algorithm> -keysize <Key size> -validity <Key Validity in Days>

Egs:

keytool -genkey -v -keystore NAME-mobileapps.keystore -alias NAMEmobileapps -keyalg RSA -keysize 2048 -validity 10000


keystore password? : xxxxxxx
What is your first and last name? :  xxxxxx
What is the name of your organizational unit? :  xxxxxxxx
What is the name of your organization? :  xxxxxxxxx
What is the name of your City or Locality? :  xxxxxxx
What is the name of your State or Province? :  xxxxx
What is the two-letter country code for this unit? :  xxx

Luego, el almacén de claves se ha generado con el nombre NAME-mobileapps.keystore

Paso 5:

Coloque el almacén de claves generado en

versión antigua cordova

D:\projects\Phonegap\Example\platforms\android\ant-build

Nueva versión cordova

D:\projects\Phonegap\Example\platforms\android\build\outputs\apk

Para firmar el APK sin firmar, ejecute la herramienta jarsigner que también se incluye en el JDK:

Sintaxis:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <keystorename> <Unsigned APK file> <Keystore Alias name>

Egs:

D:\projects\Phonegap\Example\platforms\android\ant-build> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore NAME-mobileapps.keystore Example-release-unsigned.apk xxxxxmobileapps

O

D:\projects\Phonegap\Example\platforms\android\build\outputs\apk> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore NAME-mobileapps.keystore Example-release-unsigned.apk xxxxxmobileapps

Enter KeyPhrase as 'xxxxxxxx'

Esto firma el apk en su lugar.

Paso 6:

Finalmente, necesitamos ejecutar la herramienta de alineación zip para optimizar el APK:

D:\projects\Phonegap\Example\platforms\android\ant-build> zipalign -v 4 Example-release-unsigned.apk Example.apk 

O

D:\projects\Phonegap\Example\platforms\android\ant-build> C:\Phonegap\adt-bundle-windows-x86_64-20140624\sdk\build-tools\android-4.4W\zipalign -v 4 Example-release-unsigned.apk Example.apk

O

D:\projects\Phonegap\Example\platforms\android\build\outputs\apk> C:\Phonegap\adt-bundle-windows-x86_64-20140624\sdk\build-tools\android-4.4W\zipalign -v 4 Example-release-unsigned.apk Example.apk

Ahora tenemos nuestro binario de lanzamiento final llamado example.apk y podemos lanzarlo en Google Play Store.

cfprabhu
fuente
9
Está bien, acepto tu pensamiento. Pero tengo un repositorio privado de git y tenemos un equipo para trabajar en aplicaciones móviles. Entonces es cómodo para mí.
cfprabhu
55
¿Por qué era importante eliminar org.apache.cordova.console?
foreyez
55
@cfprabhu El paso 5 está lanzando una advertencia "No se proporciona -tsa o -tsacert y este frasco no tiene la marca de tiempo". Se solucionó agregando "-tsa timestamp.digicert.com" al comando. Podría ser útil para otros usuarios
Thomas Bormans
66
zipalign bajo OSX está disponible en ~ / Library / Android / sdk / build-tools / 22.0.1 / zipalign
chillwalker
2
@ThomasBormans de alguna manera -tsa timestamp.digicert.comlanzó una NullPointerException para mí. -tsa http://timestamp.digicert.comparece arreglarlo
Thomas
124

Una actualización de @malcubierre para Cordova 4 (y posterior) -

Crea un archivo llamado release-signing.propertiesy ponlo en la APPFOLDER\platforms\androidcarpeta

Contenido del archivo: editar después = para todos excepto la segunda línea

storeFile=C:/yourlocation/app.keystore
storeType=jks
keyAlias=aliasname
keyPassword=aliaspass
storePassword=password

Entonces este comando debería construir una versión de lanzamiento:

cordova build android --release
Jon
fuente
2
¡Gracias! También puede cambiar el nombre / ubicación de su archivo de propiedades, pero debe especificarlo en un build-extras.gradlearchivo. Documento relevante de Córdoba aquí .
Dunc
Mi aplicación no se actualiza a la próxima versión, la primera versión creada en Ant Build (Cordova 3). Actualicé mi cordova a 6.0.0, ahora la segunda versión se creó en Gradle Build, seguí el último documento de cordova para crear apk firmado pero mi aplicación aún no se actualiza. Revisé toda la información de la web, pero aún así, en algún lugar me estoy yendo mal. Por favor, ayúdenme @Dunc
NGB
@Naveen Estoy usando Cordova 5.2.0, tuve varios problemas con otras versiones> 5. Te sugiero que lo pruebes si puedes. Entonces, si todavía tiene problemas, le recomiendo hacer una nueva pregunta.
Dunc
Aún tiene problemas, la nueva versión de apk no se descarga de la aplicación existente. @Dunc
NGB
@Dunc cualquier solución
NGB
52

En la documentación actual podemos especificar un build.json con el almacén de claves:

{
     "android": {
         "debug": {
             "keystore": "..\android.keystore",
             "storePassword": "android",
             "alias": "mykey1",
             "password" : "password",
             "keystoreType": ""
         },
         "release": {
             "keystore": "..\android.keystore",
             "storePassword": "",
             "alias": "mykey2",
             "password" : "password",
             "keystoreType": ""
         }
     }
 }

Y luego, ejecute el comando con --buildConfig argumente, de esta manera:

cordova run android --buildConfig
infinito84
fuente
2
¡Impresionante <3, tu respuesta es sobre archivos que puedo controlar!
gustavohenke
3
¿en qué directorio debería existir este json?
Beelphegor
66
cordova build android --release
shadi
2
Coloque build.json en la carpeta del proyecto raíz junto con el archivo del almacén de claves. Este es el método más eficaz para firmar sin problemas que he encontrado.
Joel Caton
1
Por alguna razón, la ruta del archivo que tuve que cambiar a "../android.keystore". (barra diagonal)
Dilhan Jayathilake
20

Paso 1:

Vaya a cordova\platforms\androidAnt y cree un ant.propertiesarchivo llamado file con la información del archivo del almacén de claves (este almacén de claves se puede generar desde su SDK de Android favorito, estudio ...):

key.store=C:\\yourpath\\Yourkeystore.keystore
key.alias=youralias

Paso 2:

Ve al camino de Córdoba y ejecuta:

cordova build android --release

Nota: se le solicitará que solicite su almacén de claves y contraseña clave

Aparecerá YourApp-release.apk en \cordova\platforms\android\ant-build

Malcubierre
fuente
1
Aquí está la solución de trabajo: ilee.co.uk/Sign-Releases-with-Cordova-Android
redrom
55
comenzando con cordova 5, el proceso cambia un poco: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks
Con el archivo de nombre Cordova 5 "release-signing.properties" en lugar de "ant.properties"; todos los demás pasos son exactamente como los describe @malcubierre
Mario Orlandi
la nueva versión de apk no se descarga de la aplicación existente en cordova 6.0.0. Seguí todos los documentos aún no resuelto mi problema, ¿pueden ayudarme @MarioOrlandi
NGB
11

En cordova 6.2.0 , tiene una manera fácil de crear una versión de lanzamiento. consulte otros pasos aquí Pasos 1, 2 y 4

cd cordova/ #change to root cordova folder
platforms/android/cordova/clean #clean if you want
cordova build android --release -- --keystore="/path/to/keystore" --storePassword=password --alias=alias_name #password will be prompted if you have any
KrIsHnA
fuente
Recibo un error al The system cannot find the file specifiedusar Cordova 6.2.0
mr5
¿Has reemplazado la ruta del almacén de claves? Si es así, publique el comando aquí.
KrIsHnA
Sí. Escordova build android --release -- --keystore="C:\release.keystore" --storePassword=****** --alias=mr5
mr5
1
Después de adjuntar mi contraseña con "(comillas dobles), comenzó a ejecutarse. Creo que Cordova tiene un problema con el análisis de caracteres especiales.
mr5
Si alguien usa Ionic, puede consultar este documento ionicframework.com/docs/cli/cordova/build
Nguyen Tran
7

En Mac (osx), generé dos archivos .sh, uno para la primera publicación y otro para actualizar:

#!/bin/sh
echo "Ionic to Signed APK ---- [email protected] // Benjamin Rathelot\n"
printf "Project dir : "
read DIR
printf "Project key alias : "
read ALIAS
cd $DIR/
cordova build --release android
cd platforms/android/build/outputs/apk/
keytool -genkey -v -keystore my-release-key.keystore -alias $ALIAS -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk $ALIAS
zipalign -v 4 android-release-unsigned.apk signedApk.apk

Y para actualizar tu aplicación:

#!/bin/sh
echo "Ionic to Signed APK ---- [email protected] // Benjamin Rathelot\n"
printf "Project dir : "
read DIR
printf "Project key alias : "
read ALIAS
cd $DIR/
cordova build --release android
cd platforms/android/build/outputs/apk/
rm signedApk.apk
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk $ALIAS
zipalign -v 4 android-release-unsigned.apk signedApk.apk

Suponiendo que está en su carpeta de inicio o en una carpeta que encabeza sus carpetas de aplicaciones. Asegúrese de configurar correctamente chmod para usar este script. Luego :

./ionicToApk.sh # or whatever depending of the name of your file, in CLI

Su apk firmado estará en la carpeta de su aplicación / plataformas / android / build / salidas / apk / as SignedApk.apk Asegúrese de utilizar el alias y la contraseña correctos definidos con el primer script

Ben
fuente
2

Cree el archivo APK de cordova release en cmd.

RUTA DEL ARCHIVO DE LA TIENDA CLAVE : ruta del archivo del almacén de claves (F: /cordova/myApp/xxxxx.jks)

CONTRASEÑA DE LA TIENDA CLAVE : xxxxx

ALIAS DE TIENDA CLAVE : xxxxx

CLAVE ALIAS CONTRASEÑA : xxxxx

RUTA DE zipalign.exe : ruta del archivo zipalign.exe (C: \ Users \ xxxx \ AppData \ Local \ Android \ sdk \ build-tools \ 25.0.2 \ zipalign)

NOMBRE DE APK NO FIRMADO PARA ANDROID : android-release-unsigned.apk

NOMBRE DE LA APLICACIÓN DE ANDROID : android-release.apk

Ejecute los pasos a continuación en cmd (ejecutar como administrador)

  1. cordova build --release android
  2. vaya a la ubicación del archivo android-release-unsigned.apk (PROYECTO \ plataformas \ android \ build \ salidas \ apk)
  3. jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore < KEY STORE FILE PATH > < ANDROID NO FIRMADO APK NOMBRE > < KEY STORE ALIAS >
  4. < PATH DE zipalign.exe > -v 4 < ANDROID UNSIGNED APK NOMBRE > < ANDROID RELEASE APK NOMBRE >
Om Shankar
fuente
1
##Generated signed apk from commandline
#variables
APP_NAME=THE_APP_NAME
APK_LOCATION=./
APP_HOME=/path/to/THE_APP
APP_KEY=/path/to/Android_key
APP_KEY_ALIAS=the_alias
APP_KEY_PASSWORD=123456789
zipalign=$ANDROID_HOME/build-tools/28.0.3/zipalign

#the logic
cd $APP_HOME
cordova build --release android
cd platforms/android/app/build/outputs/apk/release
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $APP_KEY ./app-release-unsigned.apk $APP_KEY_ALIAS <<< $APP_KEY_PASSWORD
rm -rf "$APK_LOCATION/$APP_NAME.apk"
$zipalign -v 4 ./app-release-unsigned.apk "$APK_LOCATION/$APP_NAME.apk"
open $APK_LOCATION
#the end
nicolsondsouza
fuente
0

Primero verifique su código de versión y el nombre de la versión si está actualizando su aplicación. Y asegúrese de tener un almacén de claves anterior.

Si está actualizando la aplicación, siga el paso 1,3,4.

Paso 1:

Pase a su proyecto de Córdoba para generar nuestra versión de lanzamiento:

D:\projects\Phonegap\Example> cordova build --release android

Luego, podemos encontrar nuestro archivo APK sin firmar en plataformas / android / ant-build. En nuestro ejemplo, el archivo fue

si usaste ant-build

yourproject/platforms/android/ant-build/Example-release-unsigned.apk

O

si usaste gradle-build

yourProject/platforms/android/build/outputs/apk/Example-release-unsigned.apk

Paso 2:

Generación clave:

Sintaxis:

keytool -genkey -v -keystore <keystoreName>.keystore -alias <Keystore AliasName> -keyalg <Key algorithm> -keysize <Key size> -validity <Key Validity in Days>

si el comando keytool no reconoce, haga este paso

Verifique que el directorio en el que se encuentra el ejecutable keytool esté en su ruta. (Por ejemplo, en mi máquina con Windows 7, está en C: \ Archivos de programa (x86) \ Java \ jre6 \ bin).

Ejemplo:

keytool -genkey -v -keystore NAME-mobileapps.keystore -alias NAMEmobileapps -keyalg RSA -keysize 2048 -validity 10000


keystore password? : xxxxxxx
What is your first and last name? :  xxxxxx
What is the name of your organizational unit? :  xxxxxxxx
What is the name of your organization? :  xxxxxxxxx
What is the name of your City or Locality? :  xxxxxxx
What is the name of your State or Province? :  xxxxx
What is the two-letter country code for this unit? :  xxx

Luego, el almacén de claves se ha generado con el nombre NAME-mobileapps.keystore

Paso 3:

Coloque el almacén de claves generado en D: \ projects \ Phonegap \ Example \ plataformas \ android \ ant-build

Para firmar el APK sin firmar, ejecute la herramienta jarsigner que también se incluye en el JDK:

Sintaxis:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <keystorename <Unsigned APK file> <Keystore Alias name>

Si no se reconcilia, siga estos pasos

(1) Haga clic con el botón derecho en "Esta PC"> haga clic con el botón derecho en Propiedades> Configuración avanzada del sistema> Variables de entorno> seleccione RUTA y EDITAR.

(2) Agregue la ruta de la carpeta jdk bin a las variables de entorno, debería verse así:

"C: \ Archivos de programa \ Java \ jdk1.8.0_40 \ bin".

Ejemplo:

D:\projects\Phonegap\Example\platforms\android\ant-build> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore NAME-mobileapps.keystore Example-release-unsigned.apk xxxxxmobileapps

Enter KeyPhrase as 'xxxxxxxx'

Esto firma el apk en su lugar.

Paso 4:

Finalmente, necesitamos ejecutar la herramienta de alineación zip para optimizar el APK:

si zipalign no reconoce entonces

(1) vaya a su ruta sdk de Android y encuentre zipalign, generalmente está en android-sdk \ build-tools \ 23.0.3

(2) Copie el archivo zipalign y péguelo en la carpeta de generar apk de la versión, generalmente en la siguiente ruta

yourproject / plataformas / android / ant-build / Example-release-unsigned.apk

D:\projects\Phonegap\Example\platforms\android\ant-build> zipalign -v 4 Example-release-unsigned.apk Example.apk 

O

D:\projects\Phonegap\Example\platforms\android\ant-build> C:\Phonegap\adt-bundle-windows-x86_64-20140624\sdk\build-tools\android-4.4W\zipalign -v 4 Example-release-unsigned.apk Example.apk

Ahora tenemos nuestro binario de lanzamiento final llamado example.apk y podemos lanzarlo en Google Play Store.

Arpit Patel
fuente
0

Para Windows, he creado un build.cmdarchivo:

(reemplace la ruta del almacén de claves y el alias)

Para Córdoba:

@echo off 
set /P spassw="Store Password: " && set /P kpassw="Key Password: " && cordova build android --release -- --keystore=../../local/my.keystore --storePassword=%spassw% --alias=tmpalias --password=%kpassw%

Y para Ionic:

@echo off 
set /P spassw="Store Password: " && set /P kpassw="Key Password: " && ionic build --prod && cordova build android --release -- --keystore=../../local/my.keystore --storePassword=%spassw% --alias=tmpalias --password=%kpassw%

Guárdelo en el directorio del ptoject, puede hacer doble clic o abrirlo con cmd.

ssz
fuente