Jak utworzyć podpisany plik APK za pomocą interfejsu wiersza poleceń Cordova?

169

Zrobiłem przykładową aplikację o nazwie checkStatus. Teraz chcę utworzyć podpisany plik APK. Więc mogę zainstalować go na różnych urządzeniach do moich testów.

W tym celu wyszukałem w Google i znalazłem tę dokumentację .

Zgodnie z dokumentem przełączyłem się do katalogu mojego projektu i uruchomiłem następujące polecenie:

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

Po uruchomieniu powyższego polecenia otrzymałem plik o nazwie key-name.keystorepod adresem projectRoot/key-name.keystore.

A potem skopiowałem i wkleiłem ten plik do projectRoot/platforms/android/key-name.keystore.

Następnie utworzyłem plik o nazwie ant.propertiesi zapisałem go w projectRoot/platforms/android.

Napisałem następujący kod w pliku:

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

Następnie uruchomiłem następujące polecenie, aby zwolnić

Cordova builds android --release

Zgłasza następujący błąd:

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

Więc tym razem zmodyfikowałem key.storewartość w ant.propertiespliku w następujący sposób.

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

Ponownie uruchomiłem cordova build android --releasepolecenie. Wyrzuca ten sam błąd.

Czy ktoś może mi powiedzieć, co zrobiłem źle?

wasan
źródło
3
zaczynając od cordova 5, proces trochę się zmienia: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks

Odpowiedzi:

305

Krok 1:

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

dodaj, --saveaby usunąć wtyczkę z config.xmlpliku.

Krok 2:

Aby wygenerować kompilację wydania dla Androida, musimy najpierw dokonać niewielkiej zmiany w AndroidManifest.xmlpliku znalezionym w platformach / android. Edytuj plik i zmień linię:

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

i zmień android:debuggablena false:

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

Od wersji Cordova 6.2.0 całkowicie usuń tag android: debuggable. Oto wyjaśnienie z Cordova:

Objaśnienie problemów typu „HardcodedDebugMode”: najlepiej jest pominąć atrybut android: debuggable w manifeście. Jeśli to zrobisz, narzędzia automatycznie wstawią android: debuggable = true podczas tworzenia pakietu APK do debugowania na emulatorze lub urządzeniu. A kiedy wykonasz kompilację wydania, taką jak Eksportowanie APK, automatycznie ustawi ją na fałsz.

Jeśli z drugiej strony określisz określoną wartość w pliku manifestu, narzędzia zawsze będą jej używać. Może to doprowadzić do przypadkowego opublikowania aplikacji z informacjami debugowania.

Krok 3:

Teraz możemy powiedzieć Cordova, aby wygenerował naszą kompilację wydania:

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

Następnie możemy znaleźć nasz niepodpisany plik APK w formacie platforms/android/ant-build. W naszym przykładzie był to plikplatforms/android/ant-build/Example-release-unsigned.apk

Krok 4:

Uwaga: nasz magazyn kluczy znajduje się keystoreNAME-mobileapps.keystorew tym repozytorium Git, jeśli chcesz utworzyć inny, wykonaj następujące czynności.

Generowanie klucza:

Składnia:

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

Następnie został wygenerowany magazyn kluczy o nazwie NAME-mobileapps.keystore

Krok 5:

Umieść wygenerowany magazyn kluczy w

stara wersja cordova

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

Nowa wersja cordova

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

Aby podpisać niepodpisany plik APK, uruchom narzędzie jarsigner, które jest również zawarte w JDK:

Składnia:

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

LUB

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'

To oznacza, że ​​apk jest na miejscu.

Krok 6:

Na koniec musimy uruchomić narzędzie do wyrównywania zip, aby zoptymalizować plik APK:

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

LUB

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

LUB

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

Teraz mamy nasz ostateczny plik binarny o nazwie example.apk i możemy go opublikować w sklepie Google Play.

cfprabhu
źródło
9
Ok, przyjmuję twoją myśl. Ale mam prywatne repozytorium git i mamy zespół do pracy nad aplikacją mobilną. Więc jest to dla mnie wygodne.
cfprabhu
5
Dlaczego usunięcie org.apache.cordova.console było ważne?
foreyez
5
@cfprabhu Krok 5 generuje ostrzeżenie „Brak opcji -tsa lub -tsacert, a ten jar nie ma sygnatury czasowej”. Naprawiono to, dodając „-tsa timestamp.digicert.com” do polecenia. Może być przydatny dla innych użytkowników
Thomas Bormans
6
zipalign pod OSX jest dostępny pod adresem ~ / Library / Android / sdk / build-tools / 22.0.1 / zipalign
chillwalker
2
@ThomasBormans w jakiś sposób -tsa timestamp.digicert.comrzucił dla mnie wyjątek NullPointerException. -tsa http://timestamp.digicert.comwydaje się, że to naprawia
Thomas
123

Aktualizacja @malcubierre dla Cordova 4 (i nowszych) -

Utwórz plik o nazwie release-signing.propertiesi umieść go w APPFOLDER\platforms\androidfolderze

Zawartość pliku: edytuj po = dla wszystkich z wyjątkiem drugiej linii

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

Następnie to polecenie powinno zbudować wersję wydania:

cordova build android --release
Jon
źródło
2
Dzięki! Możesz także zmienić nazwę / lokalizację pliku właściwości, ale musisz określić ją w build-extras.gradlepliku. Odpowiedni dokument cordova tutaj .
Dunc
Moja aplikacja nie jest aktualizowana do następnej wersji, pierwszej wersji utworzonej w kompilacji Ant (cordova 3). Zaktualizowałem moją Cordovę do 6.0.0, teraz druga wersja jest tworzona w kompilacji Gradle. Postępowałem zgodnie z najnowszym dokumentem Cordova, aby utworzyć podpisany apk, ale nadal moja aplikacja nie jest aktualizowana. Przeszukałem wszystkie informacje w sieci, ale nadal gdzieś się nie udaje. Proszę, pomóż mi @ Dunc
NGB
@Naveen Używam Cordova 5.2.0, miałem różne problemy z innymi wersjami> 5. Zaproponuj, żebyś spróbował, jeśli możesz. Następnie, jeśli nadal masz problemy, polecam zadać nowe pytanie.
Dunc
Nadal występuje problem, nowa wersja apk nie jest pobierana z istniejącej aplikacji. @Dunc
NGB
@Dunc any solution
NGB
52

W aktualnej dokumentacji możemy określić plik build.json z magazynem kluczy:

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

Następnie wykonaj polecenie z argumentem --buildConfig, w ten sposób:

cordova run android --buildConfig
infinito84
źródło
2
Świetnie <3, Twoja odpowiedź dotyczy plików, które mogę kontrolować!
gustavohenke
3
w którym katalogu powinien istnieć ten plik json?
Beelphegor
6
cordova build android --release
shadi
2
Umieść plik build.json w głównym folderze projektu wraz z plikiem kluczy. Jest to najskuteczniejsza bezproblemowa metoda podpisywania, jaką znalazłem.
Joel Caton
1
Z jakiegoś powodu ścieżka pliku, którą musiałem zmienić na „../android.keystore”. (ukośnik)
Dilhan Jayathilake
20

Krok 1:

Idź do cordova\platforms\androidi stwórz ant.propertiesplik o nazwie file z informacjami o pliku kluczy (ten magazyn kluczy można wygenerować z twojego ulubionego Android SDK, studio ...):

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

Krok 2:

Idź do ścieżki cordova i wykonaj:

cordova build android --release

Uwaga: zostanie wyświetlony monit z pytaniem o magazyn kluczy i hasło klucza

Plik YourApp-release.apk pojawi się w \cordova\platforms\android\ant-build

malcubierre
źródło
1
Oto działające rozwiązanie: ilee.co.uk/Sign-Releases-with-Cordova-Android
redrom April
5
zaczynając od cordova 5, proces trochę się zmienia: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks
W przypadku Cordova 5 plik nazw „release-signing.properties” zamiast „ant.properties”; wszystkie pozostałe kroki są dokładnie takie, jak opisane przez @malcubierre
Mario Orlandi.
Nowa wersja apk nie jest pobierana z istniejącej aplikacji w Cordova 6.0.0. Śledziłem wszystkie dokumenty, które nadal nie zostały rozwiązane. Mój problem, czy możesz mi pomóc @MarioOrlandi
NGB
11

W cordova 6.2.0 ma łatwy sposób tworzenia kompilacji wydania. zobacz inne kroki tutaj Kroki 1, 2 i 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
źródło
Otrzymuję błąd podczas The system cannot find the file specifiedużywania Cordova 6.2.0
mr5
czy wymieniłeś ścieżkę do magazynu kluczy? Jeśli tak, wpisz polecenie tutaj.
KrIsHnA
Tak. Jestcordova build android --release -- --keystore="C:\release.keystore" --storePassword=****** --alias=mr5
mr5
1
Po ujęciu mojego hasła w "(podwójny cudzysłów) zaczęło działać. Myślę, że Cordova ma problem z analizowaniem znaków specjalnych.
mr5
Jeśli ktoś używa Ionic, możesz sprawdzić
Nguyen Tran,
7

Na komputerze Mac (osx) wygenerowałem dwa pliki .sh, jeden dla pierwszej publikacji i drugi do aktualizacji:

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

Aby zaktualizować aplikację:

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

Zakładając, że jesteś w folderze domowym lub folderze znajdującym się na górze folderów aplikacji. Upewnij się, że ustawiłeś poprawnie chmod, aby użyć tego skryptu. Następnie :

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

Twój podpisany plik APK będzie w folderze Twojej aplikacji / platform / android / build / output / apk / as SignedApk.apk Upewnij się, że używasz prawidłowego aliasu klucza i hasła zdefiniowanego w pierwszym skrypcie

Ben
źródło
2

Zbuduj plik APK wydania Cordova w cmd.

ŚCIEŻKA PLIKU SKLEPU KLUCZY: ścieżka do pliku magazynu kluczy (F: /cordova/myApp/xxxxx.jks)

HASŁO SKLEPU KLUCZOWEGO : xxxxx

ALIASY SKLEPÓW KLUCZOWYCH : xxxxx

HASŁO ALIASU SKLEPU KLUCZOWEGO : xxxxx

ŚCIEŻKA Zipalign.exe : ścieżka do pliku zipalign.exe (C: \ Users \ xxxx \ AppData \ Local \ Android \ sdk \ build-tools \ 25.0.2 \ zipalign)

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

NAZWA APLIKACJI ANDROID RELEASE : android-release.apk

Uruchom poniższe kroki w cmd (uruchom jako administrator)

  1. cordova build - release android
  2. przejdź do lokalizacji pliku android-release-unsigned.apk (PROJECT \ platform \ android \ build \ output \ apk)
  3. jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore < KEY STORE FILE PATH > < ANDROID UNSIGNED APK NAME > < KEY STORE ALIAS >
  4. < ŚCIEŻKA zipalign.exe > -v 4 < ANDROID UNSIGNED APK NAZWA > < ANDROID APK RELEASE NAME >
Om Shankar
źródło
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
źródło
0

Najpierw sprawdź kod wersji i nazwę wersji, jeśli aktualizujesz aplikację. I upewnij się, że masz poprzedni magazyn kluczy.

Jeśli aktualizujesz aplikację, wykonaj kroki 1, 3, 4.

Krok 1:

Przejdź do swojego projektu cordova, aby wygenerować naszą kompilację wydania:

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

Następnie możemy znaleźć nasz niepodpisany plik APK w platformach / android / ant-build. W naszym przykładzie był to plik

jeśli używasz ant-build

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

LUB

jeśli używasz gradle-build

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

Krok 2:

Generowanie klucza:

Składnia:

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

jeśli polecenie keytool nie rozpoznaje, wykonaj ten krok

Sprawdź, czy katalog, w którym znajduje się plik wykonywalny keytool, znajduje się na ścieżce. (Na przykład na moim komputerze z systemem Windows 7 znajduje się w C: \ Program Files (x86) \ Java \ jre6 \ bin.)

Przykład:

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

Następnie został wygenerowany magazyn kluczy o nazwie NAME-mobileapps.keystore

Krok 3:

Umieść wygenerowany magazyn kluczy w D: \ projects \ Phonegap \ Example \ platform \ android \ ant-build

Aby podpisać niepodpisany plik APK, uruchom narzędzie jarsigner, które jest również zawarte w JDK:

Składnia:

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

Jeśli to się nie powtórzy, wykonaj te czynności

(1) Kliknij prawym przyciskiem myszy „Ten komputer”> kliknij prawym przyciskiem myszy Właściwości> Zaawansowane ustawienia systemu> Zmienne środowiskowe> wybierz ŚCIEŻKA, a następnie EDYTUJ.

(2) Dodaj ścieżkę folderu jdk bin do zmiennych środowiskowych, powinna wyglądać następująco:

„C: \ Program Files \ Java \ jdk1.8.0_40 \ bin”.

Przykład:

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'

To oznacza, że ​​apk jest na miejscu.

Krok 4:

Na koniec musimy uruchomić narzędzie do wyrównywania zip, aby zoptymalizować plik APK:

jeśli zipalign nie rozpozna wtedy

(1) przejdź do ścieżki sdk systemu Android i znajdź plik zipalign. Zwykle jest to plik android-sdk \ build-tools \ 23.0.3

(2) Skopiuj wklej plik zipalign do generowanego folderu apk wydania, zwykle w poniższej ścieżce

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

LUB

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

Teraz mamy nasz ostateczny plik binarny o nazwie example.apk i możemy go opublikować w sklepie Google Play.

Arpit Patel
źródło
0

Dla Windows utworzyłem build.cmdplik:

(zamień ścieżkę i alias do magazynu kluczy)

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%

A dla 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%

Zapisz go w katalogu ptoject, możesz kliknąć dwukrotnie lub otworzyć go za pomocą cmd.

ssz
źródło