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?


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.


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

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

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



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

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

Aby zaktualizować aplikację:

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

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


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 >

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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.