Wie erstelle ich eine signierte APK-Datei über die Cordova-Befehlszeilenschnittstelle?

169

Ich habe eine Beispielanwendung mit dem Namen gemacht checkStatus. Jetzt möchte ich eine signierte APK-Datei erstellen. So kann ich es für meine Tests auf verschiedenen Geräten installieren.

Dafür habe ich gegoogelt und diese Dokumentation gefunden .

Gemäß dem Dokument habe ich in mein Projektverzeichnis gewechselt und den folgenden Befehl ausgeführt:

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

Nachdem ich den obigen Befehl ausgeführt habe, habe ich eine Datei mit dem Namen key-name.keystoreat erhalten projectRoot/key-name.keystore.

Und dann habe ich diese Datei kopiert projectRoot/platforms/android/key-name.keystore.

Danach habe ich eine Datei mit dem Namen erstellt ant.propertiesund in gespeichert projectRoot/platforms/android.

Ich habe den folgenden Code in die Datei geschrieben:

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

Danach habe ich den folgenden Befehl ausgeführt, um ihn freizugeben

Cordova builds android --release

Es wird der folgende Fehler ausgegeben:

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

Dieses Mal habe ich den key.storeWert in der ant.propertiesDatei wie folgt geändert .

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

Wieder führte ich den cordova build android --releaseBefehl aus. Es wird der gleiche Fehler ausgegeben.

Kann mir jemand sagen, was ich falsch gemacht habe?

Vasan
quelle
3
Beginnend mit Cordova 5 ändert sich der Prozess ein wenig: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks

Antworten:

305

Schritt 1:

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

Fügen Sie das hinzu --save, damit das Plugin aus der config.xmlDatei entfernt wird.

Schritt 2:

Um einen Release-Build für Android zu generieren, müssen wir zunächst eine kleine Änderung an der AndroidManifest.xmlDatei vornehmen, die sich auf Plattformen / Android befindet. Bearbeiten Sie die Datei und ändern Sie die Zeile:

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

und wechseln android:debuggablezu false:

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

Ab Cordova 6.2.0 entfernen Sie das android: debuggable Tag vollständig. Hier ist die Erklärung von Cordova:

Erläuterung zu Problemen vom Typ "HardcodedDebugMode": Am besten lassen Sie das Attribut "android: debuggable" aus dem Manifest weg. Wenn Sie dies tun, fügen die Tools automatisch android ein: debuggable = true, wenn Sie eine APK zum Debuggen auf einem Emulator oder Gerät erstellen. Wenn Sie einen Release-Build ausführen, z. B. APK exportieren, wird dieser automatisch auf false gesetzt.

Wenn Sie andererseits einen bestimmten Wert in der Manifestdatei angeben, wird dieser von den Tools immer verwendet. Dies kann dazu führen, dass Ihre App versehentlich mit Debug-Informationen veröffentlicht wird.

Schritt 3:

Jetzt können wir Cordova anweisen, unseren Release-Build zu generieren:

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

Dann finden wir unsere nicht signierte APK-Datei in platforms/android/ant-build. In unserem Beispiel war die Dateiplatforms/android/ant-build/Example-release-unsigned.apk

Schritt 4:

Hinweis: Wir haben unseren Keystore keystoreNAME-mobileapps.keystorein diesem Git Repo. Wenn Sie einen anderen erstellen möchten, fahren Sie bitte mit den folgenden Schritten fort.

Schlüsselgenerierung:

Syntax:

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

Dann wurde der Schlüsselspeicher mit dem Namen NAME-mobileapps.keystore generiert

Schritt 5:

Platzieren Sie den generierten Schlüsselspeicher in

alte Version Cordova

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

Neue Version Cordova

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

Führen Sie zum Signieren des nicht signierten APK das Jarsigner-Tool aus, das auch im JDK enthalten ist:

Syntax:

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

ODER

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'

Dies kennzeichnet die apk an Ort und Stelle.

Schritt 6:

Schließlich müssen wir das Zip-Align-Tool ausführen, um die APK zu optimieren:

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

ODER

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

ODER

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

Jetzt haben wir unsere endgültige Binärversion namens example.apk und können diese im Google Play Store veröffentlichen.

cfprabhu
quelle
9
Okay, ich akzeptiere deinen Gedanken. Aber ich habe ein privates Git-Repository und wir haben ein Team für die Arbeit an der mobilen App. So ist es bequem für mich.
cfprabhu
5
Warum war es wichtig, org.apache.cordova.console zu entfernen?
Foreyez
5
@cfprabhu Schritt 5 gibt eine Warnung aus "Es wird kein -tsa oder -tsacert bereitgestellt und dieses Glas ist nicht mit einem Zeitstempel versehen." Es wurde behoben, indem dem Befehl "-tsa timestamp.digicert.com" hinzugefügt wurde.
Könnte
6
zipalign unter OSX ist verfügbar unter ~ / Library / Android / sdk / build-tools / 22.0.1 / zipalign
chillwalker
2
@ThomasBormans hat irgendwie -tsa timestamp.digicert.comeine NullPointerException für mich ausgelöst. -tsa http://timestamp.digicert.comscheint es zu beheben
Thomas
123

Ein Update auf @malcubierre für Cordova 4 (und höher) -

Erstellen Sie eine Datei mit dem Namen release-signing.propertiesund fügen Sie sie ein APPFOLDER\platforms\android Ordner ab

Inhalt der Datei: edit after = für alle außer der 2. Zeile

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

Dann sollte dieser Befehl eine Release-Version erstellen:

cordova build android --release
Jon
quelle
2
Vielen Dank! Sie können auch den Namen / Speicherort Ihrer Eigenschaftendatei ändern, müssen dies jedoch in einer build-extras.gradleDatei angeben . Relevantes Cordova-Dokument hier .
Dunc
Meine App wird nicht auf die nächste Version aktualisiert, die erste Version wurde in Ant Build (Cordova 3) erstellt. Ich habe mein Cordova auf 6.0.0 aktualisiert, jetzt wird die zweite Version in Gradle Build erstellt. Ich habe das neueste Cordova-Dokument befolgt, um eine signierte Apk zu erstellen, aber meine App wird immer noch nicht aktualisiert. Ich habe alle Informationen im Web durchgesehen, aber irgendwo läuft immer noch etwas schief. Bitte helfen Sie mir @Dunc
NGB
@Naveen Ich verwende Cordova 5.2.0 und hatte verschiedene Probleme mit anderen Versionen> 5. Schlagen Sie vor , dass Sie dies versuchen, wenn Sie können. Wenn Sie dann immer noch Probleme haben, empfehle ich, eine neue Frage zu stellen.
Dunc
Immer noch ein Problem, die neue Version von apk wird nicht von der vorhandenen App heruntergeladen. @Dunc
NGB
@ Dunc jede Lösung
NGB
52

In der aktuellen Dokumentation können wir eine build.json mit dem Keystore angeben:

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

Führen Sie dann das Kommando mit --buildConfig argumente folgendermaßen aus:

cordova run android --buildConfig
infinito84
quelle
2
Awesome <3 Ihre Antwort bezieht sich auf Dateien, die ich versionieren kann!
Gustavohenke
3
In welchem ​​Verzeichnis sollte dieser JSON existieren?
Beelphegor
6
Cordova Build Android
Release
2
Legen Sie die Datei build.json zusammen mit der Keystore-Datei im Stammprojektordner ab. Dies ist die effektivste Methode zum problemlosen Signieren, die ich gefunden habe.
Joel Caton
1
Aus irgendeinem Grund musste ich den Dateipfad in "../android.keystore" ändern. (Schrägstrich)
Dilhan Jayathilake
20

Schritt 1:

Gehen Sie zu cordova\platforms\androidant und erstellen Sie eine ant.propertiesDatei namens file mit den Informationen zur Keystore-Datei (dieser Keystore kann aus Ihrem bevorzugten Android SDK, Studio ... generiert werden):

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

Schritt 2:

Gehen Sie zum Cordova-Pfad und führen Sie Folgendes aus:

cordova build android --release

Hinweis: Sie werden aufgefordert, Ihren Schlüsselspeicher und Ihr Schlüsselkennwort einzugeben

Eine YourApp-release.apk wird in angezeigt \cordova\platforms\android\ant-build

malcubierre
quelle
1
Hier ist die Arbeitslösung: ilee.co.uk/Sign-Releases-with-Cordova-Android
redrom
5
Beginnend mit Cordova 5 ändert sich der Prozess ein wenig: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks
Mit Cordova 5-Namensdatei "release-signing.properties" anstelle von "ant.properties"; Alle anderen Schritte sind genau wie von @malcubierre
Mario Orlandi
Die neue Version von apk wird nicht von der vorhandenen App in Cordova 6.0.0 heruntergeladen. Ich habe alle Dokumente befolgt, die mein Problem noch nicht gelöst hat. Können Sie mir helfen? @MarioOrlandi
NGB
11

In Cordova 6.2.0 ist es einfach, Release Builds zu erstellen. Weitere Schritte finden Sie hier. Schritte 1, 2 und 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
quelle
Ich The system cannot find the file specifiederhalte eine Fehlermeldung bei der Verwendung von Cordova 6.2.0
mr5
Haben Sie den Keystore-Pfad ersetzt? Wenn ja, posten Sie bitte den Befehl hier.
KrIsHnA
Ja. Es istcordova build android --release -- --keystore="C:\release.keystore" --storePassword=****** --alias=mr5
mr5
1
Nachdem ich mein Passwort mit "(doppeltes Anführungszeichen) versehen hatte, begann es zu laufen. Ich denke, Cordova hat ein Problem mit dem Parsen von Sonderzeichen.
Mr5 5.
Wenn jemand Ionic verwendet, können Sie dieses Dokument ionicframework.com/docs/cli/cordova/build
Nguyen Tran
7

Unter Mac (osx) habe ich zwei .sh-Dateien generiert, eine für die erste Veröffentlichung und eine für die Aktualisierung:

#!/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

Und um Ihre App zu aktualisieren:

#!/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

Angenommen, Sie befinden sich in Ihrem Home-Ordner oder in einem Ordner, der Ihre Apps-Ordner übersteigt. Stellen Sie sicher, dass chmod richtig eingestellt ist, um dieses Skript zu verwenden. Dann :

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

Ihr signiertes apk befindet sich in Ihrem App-Ordner / platform / android / build / output / apk / als SignedApk.apk. Stellen Sie sicher, dass Sie den richtigen Schlüsselalias und das richtige Kennwort verwenden, die mit dem ersten Skript definiert wurden

Ben
quelle
2

Erstellen Sie die Cordova Release APK-Datei in cmd.

KEY STORE FILE PATH : Pfad der Keystore-Datei (F: /cordova/myApp/xxxxx.jks)

KEY STORE PASSWORT : xxxxx

KEY STORE ALIAS : xxxxx

KEY STORE ALIAS PASSWORT : xxxxx

PFAD VON zipalign.exe : Dateipfad zipalign.exe (C: \ Benutzer \ xxxx \ AppData \ Local \ Android \ sdk \ build-tools \ 25.0.2 \ zipalign)

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

ANDROID RELEASE APK NAME : android-release.apk

Führen Sie die folgenden Schritte in cmd aus (als Administrator ausführen).

  1. Cordova Build - Release Android
  2. Gehen Sie zum Speicherort der Datei android-release-unsigned.apk (PROJECT \ platform \ android \ build \ output \ apk).
  3. jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore < KEY STORE- DATEIPFAD > < ANDROID UNSIGNED APK NAME > < KEY STORE ALIAS >
  4. < PATH OF zipalign.exe > -v 4 < ANDROID UNSIGNED APK NAME > < ANDROID RELEASE APK NAME >
Om Shankar
quelle
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
quelle
0

Überprüfen Sie zuerst Ihren Versionscode und den Versionsnamen, wenn Sie Ihre App aktualisieren. Und stellen Sie sicher, dass Sie einen vorherigen Schlüsselspeicher haben.

Wenn Sie die App aktualisieren, befolgen Sie Schritt 1,3,4.

Schritt 1:

Gehen Sie zu Ihrem Cordova-Projekt, um unseren Release-Build zu generieren:

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

Dann finden wir unsere nicht signierte APK-Datei unter platform / android / ant-build. In unserem Beispiel war die Datei

Wenn du Ant-Build benutzt hast

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

ODER

Wenn du Gradle-Build benutzt hast

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

Schritt 2:

Schlüsselgenerierung:

Syntax:

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

Wenn der Befehl keytool nicht erkannt wird, führen Sie diesen Schritt aus

Überprüfen Sie, ob sich das Verzeichnis, in dem sich die ausführbare Keytool-Datei befindet, auf Ihrem Pfad befindet. (Auf meinem Windows 7-Computer befindet es sich beispielsweise in C: \ Programme (x86) \ Java \ jre6 \ bin.)

Beispiel:

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

Dann wurde der Schlüsselspeicher mit dem Namen NAME-mobileapps.keystore generiert

Schritt 3:

Platzieren Sie den generierten Schlüsselspeicher in D: \ projects \ Phonegap \ Example \ platform \ android \ ant-build

Führen Sie zum Signieren des nicht signierten APK das Jarsigner-Tool aus, das auch im JDK enthalten ist:

Syntax:

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

Wenn dies nicht der Fall ist, führen Sie diese Schritte aus

(1) Klicken Sie mit der rechten Maustaste auf "Dieser PC"> klicken Sie mit der rechten Maustaste auf Eigenschaften> Erweiterte Systemeinstellungen> Umgebungsvariablen> wählen Sie PATH und dann EDIT.

(2) Fügen Sie Ihren jdk bin-Ordnerpfad zu Umgebungsvariablen hinzu. Er sollte folgendermaßen aussehen:

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

Beispiel:

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'

Dies kennzeichnet die apk an Ort und Stelle.

Schritt 4:

Schließlich müssen wir das Zip-Align-Tool ausführen, um die APK zu optimieren:

wenn zipalign dann nicht erkennt

(1) Gehen Sie zu Ihrem Android SDK-Pfad und finden Sie Zipalign, das sich normalerweise in Android-SDK \ Build-Tools \ 23.0.3 befindet

(2) Kopieren Sie die zipalign-Datei und fügen Sie sie in Ihren apk-Ordner "generate release" ein, normalerweise im folgenden Pfad

Ihr Projekt / platform / android / ant-build / Example-release-unsigned.apk

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

ODER

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

Jetzt haben wir unsere endgültige Binärversion namens example.apk und können diese im Google Play Store veröffentlichen.

Arpit Patel
quelle
0

Für Windows habe ich eine build.cmdDatei erstellt:

(Ersetzen Sie den Keystore-Pfad und den Alias.)

Für 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%

Und für 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%

Speichern Sie es im Verzeichnis des ptoject. Sie können darauf doppelklicken oder es mit cmd öffnen.

ssz
quelle