Come creare un file APK firmato usando l'interfaccia della riga di comando Cordova?


169

Ho fatto una domanda di esempio denominata checkStatus. Ora voglio creare un file APK firmato. Quindi posso installarlo in diversi dispositivi per i miei test.

Per questo, ho cercato su Google e ho trovato questa documentazione .

Come da documento, sono passato alla directory del mio progetto ed ho eseguito il seguente comando:

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

Dopo che ho fatto funzionare l'ordine di cui sopra, ho ottenuto un file chiamato key-name.keystorea projectRoot/key-name.keystore.

E poi ho copiato e incollato quel file in projectRoot/platforms/android/key-name.keystore.

Successivamente, ho creato un file chiamato ant.propertiese salvato in projectRoot/platforms/android.

Ho scritto il seguente codice all'interno del file:

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

Successivamente, ho eseguito il seguente comando per rilasciare

Cordova builds android --release

Sta generando il seguente errore:

 /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)

Quindi, questa volta, ho modificato il key.storevalore nel ant.propertiesfile come nel modo seguente.

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

Ancora una volta, ho eseguito il cordova build android --releasecomando. Genera lo stesso errore.

Qualcuno può dirmi cosa ho fatto di sbagliato?


3
a partire da cordova 5, il processo cambia un po ': ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks

Risposte:


305

Passo 1:

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

aggiungere in --savemodo che rimuova il plug-in dal config.xmlfile.

Passo 2:

Per generare una build di rilascio per Android, dobbiamo prima apportare una piccola modifica al AndroidManifest.xmlfile trovato in piattaforme / Android. Modifica il file e cambia la riga:

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

e cambia android:debuggablein false:

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

A partire da Cordova 6.2.0 rimuovi completamente il tag android: debuggable. Ecco la spiegazione di Cordova:

Spiegazione per problemi di tipo "HardcodedDebugMode": è meglio tralasciare l'attributo android: debuggable dal manifest. In tal caso, gli strumenti inseriranno automaticamente android: debuggable = true quando si crea un APK per il debug su un emulatore o dispositivo. E quando esegui una build di rilascio, come Esportare APK, lo imposterà automaticamente su false.

Se invece specifichi un valore specifico nel file manifest, gli strumenti lo useranno sempre. Ciò può comportare la pubblicazione accidentale della tua app con informazioni di debug.

Passaggio 3:

Ora possiamo dire a cordova di generare la nostra build di rilascio:

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

Quindi, possiamo trovare il nostro file APK non firmato in platforms/android/ant-build. Nel nostro esempio, il file eraplatforms/android/ant-build/Example-release-unsigned.apk

Step 4:

Nota: abbiamo il nostro keystore keystoreNAME-mobileapps.keystorein questo Git Repo, se vuoi crearne un altro, procedi nel seguente modo.

Generazione chiave:

Sintassi:

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

Quindi il Key store è stato generato con il nome NAME-mobileapps.keystore

Passaggio 5:

Inserire il keystore generato in

vecchia versione cordova

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

Nuova versione cordova

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

Per firmare l'APK senza segno, eseguire lo strumento jarsigner che è anche incluso nel JDK:

Sintassi:

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'

Questo firma l'apk sul posto.

Passaggio 6:

Infine, è necessario eseguire lo strumento di allineamento zip per ottimizzare l'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

Ora abbiamo il nostro binario di rilascio finale chiamato example.apk e possiamo rilasciarlo sul Google Play Store.


9
Ok, accetto il tuo pensiero. Ma ho un repository git privato e abbiamo un team per lavorare sull'app mobile. Quindi è comodo per me.
cfprabhu

5
Perché era importante rimuovere org.apache.cordova.console?
foreyez,

5
@cfprabhu Il passaggio 5 sta emettendo un avviso "Non viene fornito -tsa o -tsacert e questo vaso non è timestamp.". Risolto il problema aggiungendo "-tsa timestamp.digicert.com" al comando. Potrebbe essere utile per altri utenti
Thomas Bormans,

6
zipalign in OSX è disponibile su ~ / Library / Android / sdk / build-tools / 22.0.1 / zipalign
chillwalker

2
@ThomasBormans in qualche modo ha -tsa timestamp.digicert.comlanciato una NullPointerException per me. -tsa http://timestamp.digicert.comsembra risolverlo
Thomas,

123

Un aggiornamento a @malcubierre per Cordova 4 (e versioni successive) -

Crea un file chiamato release-signing.propertiese metti nella APPFOLDER\platforms\androidcartella

Contenuto del file: modifica dopo = per tutti tranne la seconda riga

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

Quindi questo comando dovrebbe creare una versione di rilascio:

cordova build android --release

2
Grazie! È inoltre possibile modificare il nome / percorso del file delle proprietà, ma è necessario specificare in un build-extras.gradlefile. Rilevante cordova doc qui .
Dunc

La mia app non sta aggiornando alla prossima versione, prima versione creata in ant build (cordova 3). Ho aggiornato Cordova a 6.0.0 ora la seconda versione è stata creata in build gradle, ho seguito l'ultimo cordova doc per creare un apk firmato ma la mia app non viene aggiornata. Ho esaminato tutte le informazioni del Web ma ancora da qualche parte sto andando storto. Aiutatemi @Dunc
NGB il

@Naveen Sto usando Cordova 5.2.0, ho avuto vari problemi con altre versioni> 5. Suggerisco di provarlo se possibile. Quindi, se i problemi persistono, ti consiglio di porre una nuova domanda.
Dunc,

Il problema persiste, la nuova versione di apk non viene scaricata dall'app esistente. @Dunc
NGB

@Dunc qualsiasi soluzione
NGB

52

Nella documentazione corrente possiamo specificare un build.json con il keystore:

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

E quindi, esegui il comando con --buildConfig argumente, in questo modo:

cordova run android --buildConfig

2
Incredibile <3 la tua risposta riguarda i file che posso controllare la versione!
Gustavohenke,

3
in quale directory dovrebbe esistere questo json?
Beelphegor,

6
Cordova build Android --release
Shadi

2
Posizionare build.json nella cartella del progetto principale insieme al file keystore. Questo è il metodo più efficace e senza problemi per la firma che ho trovato.
Joel Caton,

1
Per qualche motivo il percorso del file è stato modificato in "../android.keystore". (barra)
Dilhan Jayathilake,

20

Passo 1:

Vai a cordova\platforms\androidformica un ant.propertiesfile chiamato file con le informazioni sul file del keystore (questo keystore può essere generato dal tuo SDK Android preferito, in studio ...):

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

Passo 2:

Vai al percorso cordova ed esegui:

cordova build android --release

Nota: verrà richiesto di richiedere il keystore e la password della chiave

Un YourApp-release.apk apparirà in \cordova\platforms\android\ant-build


1
Ecco la soluzione funzionante: ilee.co.uk/Sign-Releases-with-Cordova-Android
redrom

5
a partire da cordova 5, il processo cambia un po ': ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks

Con il file di nome Cordova 5 "release-signing.properties" anziché "ant.properties"; tutti gli altri passaggi sono esattamente come descritti da @malcubierre
Mario Orlandi il

la nuova versione di apk non viene scaricata dall'app esistente in cordova 6.0.0. Ho seguito tutti i documenti ancora non risolti il ​​mio problema mi potete aiutare @ Mario Orlandi
NGB

11

In cordova 6.2.0 , ha un modo semplice per creare build di rilascio. fare riferimento agli altri passaggi qui Passaggi 1, 2 e 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

Ricevo un errore The system cannot find the file specifiednell'uso di Cordova 6.2.0
mr5

hai sostituito il percorso del keystore? In tal caso, pubblica qui il comando.
KrIsHnA,

Sì. E 'cordova build android --release -- --keystore="C:\release.keystore" --storePassword=****** --alias=mr5
MR5

1
Dopo aver racchiuso la mia password con "(doppia citazione), ha iniziato a funzionare. Penso che Cordova abbia un problema sull'analisi dei personaggi speciali.
sig. 5

Se qualcuno usa Ionic, puoi consultare questo documento ionicframework.com/docs/cli/cordova/build
Nguyen Tran

7

Su Mac (osx), ho generato due file .sh, uno per la prima pubblicazione e un altro per l'aggiornamento:

#!/bin/sh
echo "Ionic to Signed APK ---- b@agencys.eu // 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

E per aggiornare la tua app:

#!/bin/sh
echo "Ionic to Signed APK ---- b@agencys.eu // 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

Supponendo che ti trovi nella cartella principale o in una cartella in cima alle cartelle delle app. Assicurati di impostare correttamente chmod per usare questo script. Poi :

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

L'apk firmato sarà nella cartella / piattaforme / android / build / output / come apk / come SignedApk.apk Assicurarsi di utilizzare l'alias chiave e la password corretti definiti con il primo script


2

Crea file APK di rilascio cordova in cmd.

PERCORSO FILE KEY STORE : percorso file keystore (F: /cordova/myApp/xxxxx.jks)

PASSWORD DEL NEGOZIO DI CHIAVI : xxxxx

ALIAS DEL NEGOZIO CHIAVE : xxxxx

PASSWORD ALIAS KEY STORE : xxxxx

PERCORSO DI zipalign.exe : percorso del file zipalign.exe (C: \ Users \ xxxx \ AppData \ Local \ Android \ sdk \ build-tools \ 25.0.2 \ zipalign)

NOME APK UNSIGNED ANDROID : android-release-unsigned.apk

NOME APK DI RILASCIO DI ANDROID : android-release.apk

Esegui sotto i passaggi in cmd (esegui come amministratore)

  1. cordova build - rilascia Android
  2. vai al percorso del file android-release-unsigned.apk (PROJECT \ piattaforme \ android \ build \ output \ apk)
  3. jarsigner -verbose -sigalg SHA1 withRSA -digestalg SHA1 -keystore < PERCORSO FILE KEY STORE > < NOME APK ANDROID UNSIGNED > < ALIAS STORE CHIAVE >
  4. < PERCORSO DI zipalign.exe > -v 4 < NOME APK ANDROID UNSIGNED > < NOME APK RELEASE ANDROID >

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

0

Prima controlla il codice della versione e il nome della versione se stai aggiornando la tua app. E assicurati di avere un keystore precedente.

Se stai aggiornando l'app, segui il passaggio 1,3,4.

Passo 1:

Vai al tuo progetto Cordova per generare la nostra build di rilascio:

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

Quindi, possiamo trovare il nostro file APK senza segno in piattaforme / android / ant-build. Nel nostro esempio, il file era

se hai usato ant-build

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

O

se hai usato gradle-build

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

Passo 2:

Generazione chiave:

Sintassi:

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

se il comando keytool non riconosce, eseguire questo passaggio

Verifica che la directory in cui si trova l'eseguibile keytool sia sul tuo percorso. (Ad esempio, sulla mia macchina Windows 7, è in C: \ Programmi (x86) \ Java \ jre6 \ bin.)

Esempio:

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

Quindi il Key store è stato generato con il nome NAME-mobileapps.keystore

Passaggio 3:

Posiziona il keystore generato in D: \ progetti \ Phonegap \ Esempio \ piattaforme \ android \ ant-build

Per firmare l'APK senza segno, eseguire lo strumento jarsigner che è anche incluso nel JDK:

Sintassi:

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

In caso contrario, procedere come segue

(1) Fare clic con il tasto destro su "Questo PC"> tasto destro del mouse su Proprietà> Impostazioni di sistema avanzate> Variabili d'ambiente> selezionare PERCORSO quindi MODIFICA.

(2) Aggiungi il percorso della tua cartella jdk bin alle variabili di ambiente, dovrebbe apparire così:

"C: \ Programmi \ Java \ jdk1.8.0_40 \ bin".

Esempio:

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'

Questo firma l'apk sul posto.

Step 4:

Infine, è necessario eseguire lo strumento di allineamento zip per ottimizzare l'APK:

se zipalign non riconosce quindi

(1) vai al tuo percorso sdk android e trova zipalign che di solito è in android-sdk \ build-tools \ 23.0.3

(2) Copia incolla il file zipalign nella cartella apk di generazione generata di solito nel percorso seguente

ProgettoUtente / piattaforme / android / ant-build / Esempio-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

Ora abbiamo il nostro binario di rilascio finale chiamato example.apk e possiamo rilasciarlo sul Google Play Store.


0

Per Windows, ho creato un build.cmdfile:

(sostituisci il percorso e l'alias del keystore)

Per Cordova:

@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%

E per Ionico:

@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%

Salvalo nella directory del ptoject, puoi fare doppio clic o aprirlo con cmd.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.