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?


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.


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

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

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


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

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

Und um Ihre App zu aktualisieren:

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

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


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 >

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

Ü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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.