Как создать подписанный файл APK с помощью интерфейса командной строки Cordova?

169

Я сделал образец приложения с именем checkStatus. Теперь я хочу создать подписанный файл APK. Так что я могу установить его на разных устройствах для моего тестирования.

Для этого я погуглил и нашел эту документацию .

Согласно документу, я переключился на каталог своего проекта и выполнил следующую команду:

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

После того, как я выполнил вышеупомянутую команду, я получил файл с именем key-name.keystoreв projectRoot/key-name.keystore.

А потом я скопировал этот файл в projectRoot/platforms/android/key-name.keystore.

После этого я создал файл с именем ant.propertiesи сохранил его в projectRoot/platforms/android.

Я написал следующий код внутри файла:

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

После этого я выполнил следующую команду

Cordova builds android --release

Выдает следующую ошибку:

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

Поэтому на этот раз я изменил key.storeзначение в ant.propertiesфайле следующим образом.

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

Я снова запустил cordova build android --releaseкоманду. Выдает ту же ошибку.

Может кто-нибудь сказать мне, что я сделал не так?

Васан
источник
3
начиная с cordova 5, процесс немного меняется: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks

Ответы:

305

Шаг 1:

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

добавить --saveтак, чтобы он удалял плагин из config.xmlфайла.

Шаг 2:

Чтобы сгенерировать сборку релиза для Android, сначала нужно внести небольшое изменение в AndroidManifest.xmlфайл, найденный в platform / android. Отредактируйте файл и измените строку:

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

и изменить android:debuggableна false:

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

Начиная с cordova 6.2.0 полностью удалите тег android: debuggable. Вот объяснение от Кордова:

Объяснение проблем типа «HardcodedDebugMode»: Лучше не указывать атрибут android: debuggable из манифеста. Если вы это сделаете, то инструменты автоматически вставят android: debuggable = true при создании APK для отладки на эмуляторе или устройстве. И когда вы выполняете сборку релиза, такую ​​как Export APK, он автоматически устанавливает значение false.

Если, с другой стороны, вы указываете конкретное значение в файле манифеста, то инструменты всегда будут его использовать. Это может привести к случайной публикации вашего приложения с отладочной информацией.

Шаг 3:

Теперь мы можем сказать кордове сгенерировать сборку релиза

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

Затем мы можем найти наш неподписанный файл APK в platforms/android/ant-build. В нашем примере файл былplatforms/android/ant-build/Example-release-unsigned.apk

Шаг 4:

Примечание. У нас есть хранилище ключей keystoreNAME-mobileapps.keystoreв этом Git Repo. Если вы хотите создать другое, выполните следующие действия.

Генерация ключей:

Синтаксис:

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

Затем хранилище ключей было сгенерировано с именем NAME-mobileapps.keystore.

Шаг 5:

Поместите сгенерированный склад ключей в

старая версия кордова

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

Новая версия Cordova

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

Чтобы подписать неподписанный APK, запустите инструмент jarsigner, который также включен в JDK:

Синтаксис:

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

ИЛИ

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'

Это подписывает apk на месте.

Шаг 6:

Наконец, нам нужно запустить инструмент выравнивания по zip для оптимизации APK:

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

ИЛИ

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

ИЛИ

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

Теперь у нас есть финальный бинарный файл с именем example.apk, и мы можем выпустить его в магазине Google Play.

cfprabhu
источник
9
Хорошо, я принимаю твои мысли. Но у меня есть частный репозиторий git, и у нас есть команда для работы над мобильным приложением. Так что мне удобно.
cfprabhu
5
Почему было важно удалить org.apache.cordova.console?
foreyez
5
@cfprabhu На шаге 5 выдается предупреждение «No -tsa или -tsacert не предоставлено, а в этом банке нет метки времени». Исправлено путем добавления «-tsa timestamp.digicert.com» в команду. Может быть полезно для других пользователей
Томас Борманс,
6
zipalign под OSX доступен по адресу ~ / Library / Android / sdk / build-tools / 22.0.1 / zipalign
chillwalker
2
@ThomasBormans как-то сгенерировал -tsa timestamp.digicert.comдля меня исключение NullPointerException. -tsa http://timestamp.digicert.comкажется, это исправить
Томас
124

Обновление @malcubierre для Cordova 4 (и более поздних версий) -

Создать файл с именем release-signing.propertiesи положить в APPFOLDER\platforms\androidпапку

Содержимое файла: изменить после = для всех, кроме 2-й строки

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

Затем эта команда должна создать версию выпуска:

cordova build android --release
Джон
источник
2
Спасибо! Вы также можете изменить имя / местоположение вашего файла свойств, но вы должны указать в build-extras.gradleфайле. Соответствующие документы здесь .
Dunc
Мое приложение не получает обновления до следующей версии, первая версия создана в ant build (cordova 3). Я обновил свое cordova до 6.0.0, теперь вторая версия создается в сборке Gradle, я следовал за последним doc cordova doc, чтобы создать подписанный apk, но мое приложение не обновлялось. Я просмотрел всю информацию в Интернете, но все еще где-то идет не так. Пожалуйста, помогите мне @Dunc
NGB
@Naveen Я использую Cordova 5.2.0, у меня были разные проблемы с другими версиями> 5. Предлагаю попробовать, если можете. Тогда, если все еще возникают проблемы, я рекомендую задать новый вопрос.
Дунк
По-прежнему возникают проблемы, новая версия apk не загружается из существующего приложения. @Dunc
NGB
@ Дунк любое решение
NGB
52

В текущей документации мы можем указать build.json с хранилищем ключей:

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

А затем выполните коммандос с аргументом --buildConfig следующим образом:

cordova run android --buildConfig
infinito84
источник
2
Удивительно <3, ваш ответ о файлах, которые я могу контролировать версии!
Густавохенке
3
в каком каталоге должен существовать этот json?
Билфегор
6
Cordova build android
Шади
2
Поместите build.json в корневую папку проекта вместе с файлом хранилища ключей. Это самый эффективный метод подписи, который я нашел.
Джоэл Катон
1
По какой-то причине путь к файлу мне пришлось изменить на "../android.keystore". (косая черта)
Дилхан Джаятилаке
20

Шаг 1:

Перейдите к cordova\platforms\androidant и создайте ant.propertiesфайл с именем file с информацией о файле хранилища ключей (это хранилище ключей можно создать из вашего любимого Android SDK, studio ...):

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

Шаг 2:

Перейти к кордовой дорожке и выполнить:

cordova build android --release

Примечание. Вам будет предложено задать хранилище ключей и пароль.

YourApp-release.apk появится в \cordova\platforms\android\ant-build

malcubierre
источник
1
Вот рабочее решение: ilee.co.uk/Sign-Releases-with-Cordova-Android
redrom
5
начиная с cordova 5, процесс немного меняется: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks
С именем файла Cordova 5 вместо «ant.properties» «release-signing.properties»; все остальные шаги в точности соответствуют описанию @malcubierre
Mario Orlandi,
новая версия apk не загружается из существующего приложения в cordova 6.0.0. Я следовал всем документам, которые до сих пор не решены, моя проблема, можете ли вы помочь мне @MarioOrlandi
NGB
11

В cordova 6.2.0 есть простой способ создать релизную сборку. см. другие шаги здесь Шаги 1, 2 и 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
Кришна
источник
Я получаю ошибку The system cannot find the file specifiedиспользования Cordova 6.2.0
mr5
Вы заменили путь хранилища ключей? Если это так, пожалуйста, отправьте команду здесь.
Кришна,
Ага. Этоcordova build android --release -- --keystore="C:\release.keystore" --storePassword=****** --alias=mr5
н 5
1
После того, как мой пароль был заключен в "(двойная кавычка), он начал работать. Я думаю, что у Кордовы есть проблема с разбором специальных символов.
mr5
Если кто-то использует Ionic, вы можете ознакомиться с
Нгуен Чан
7

На Mac (osx) я сгенерировал два файла .sh, один для первой публикации, а другой для обновления:

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

И чтобы обновить ваше приложение:

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

Предполагая, что вы находитесь в своей домашней папке или в папке, на которой расположены ваши приложения. Убедитесь, что вы правильно установили chmod для использования этого скрипта. Затем :

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

Ваш подписанный apk будет находиться в папке «Ваше приложение» / platform / android / build / output / apk / as SignedApk.apk. Убедитесь, что вы используете правильный псевдоним ключа и пароль, определенные в первом скрипте.

Бен
источник
2

Сборка релиза кордова APK файл в cmd.

ПУТЬ К ФАЙЛАМ KEY STORE : путь к файлу хранилища ключей (F: /cordova/myApp/xxxxx.jks)

ПАРОЛЬ КЛЮЧЕВОГО МАГАЗИНА : ххххх

КЛЮЧЕВОЙ МАГАЗИН ALIAS : ххххх

КЛЮЧ МАГАЗИН АЛИАС ПАРОЛЬ : ххххх

ПУТЬ zipalign.exe : путь к файлу zipalign.exe (C: \ Users \ xxxx \ AppData \ Local \ Android \ sdk \ build-tools \ 25.0.2 \ zipalign)

ANDROID UNSIGNED APK ИМЯ : android-release-unsigned.apk

ANDROID RELEASE APK ИМЯ : android-release.apk

Запустите следующие шаги в cmd (запустите от имени администратора)

  1. Cordova build - выпуск андроид
  2. перейдите в расположение файла android-release-unsigned.apk (PROJECT \ platform \ android \ build \ output \ apk)
  3. jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore < ПУТЬ К ФАЙЛАМ КЛЮЧЕВОГО МАГАЗИНА > < ИМЯ АДРОИДА ПОДПИСАНО APK > < КЛЮЧЕВЫЙ КЛЮЧ >
  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
nicolsondsouza
источник
0

Сначала проверьте свой код версии и название версии, если вы обновляете свое приложение. И убедитесь, что у вас есть предыдущий склад ключей.

Если вы обновляете приложение, выполните шаг 1,3,4.

Шаг 1:

Перейдите к вашему проекту Cordova для создания нашего релиза сборки:

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

Затем мы можем найти наш неподписанный APK-файл в platform / android / ant-build. В нашем примере файл был

если ты использовал муравейник

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

ИЛИ

если вы использовали gradle-build

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

Шаг 2:

Генерация ключей:

Синтаксис:

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

если команда keytool не распознает, сделайте этот шаг

Убедитесь, что каталог, в котором находится исполняемый файл keytool, находится на вашем пути. (Например, на моем компьютере с Windows 7 он находится в C: \ Program Files (x86) \ Java \ jre6 \ bin.)

Пример:

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

Затем хранилище ключей было сгенерировано с именем NAME-mobileapps.keystore.

Шаг 3:

Поместите сгенерированное хранилище ключей в D: \ projects \ Phonegap \ Example \ platform \ android \ ant-build

Чтобы подписать неподписанный APK, запустите инструмент jarsigner, который также включен в JDK:

Синтаксис:

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

Если это не соответствует, сделайте эти шаги

(1) Щелкните правой кнопкой мыши «Этот ПК»> щелкните правой кнопкой мыши Свойства> Дополнительные параметры системы> Переменные среды> выберите ПУТЬ, затем РЕДАКТИРОВАТЬ.

(2) Добавьте путь к папке jdk bin в переменные окружения, он должен выглядеть следующим образом:

"C: \ Program Files \ Java \ jdk1.8.0_40 \ bin".

Пример:

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'

Это подписывает apk на месте.

Шаг 4:

Наконец, нам нужно запустить инструмент выравнивания по zip для оптимизации APK:

если zipalign не признать, то

(1) перейдите на путь Android SDK и найдите zipalign, который обычно находится в Android-SDK \ build-tools \ 23.0.3

(2) Скопируйте файл zipalign и вставьте его в папку apk для создания релиза, как правило, по указанному ниже пути.

yourproject / платформы / Android / муравей-сборка / Пример релиз-unsigned.apk

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

ИЛИ

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

Теперь у нас есть финальный бинарный файл с именем example.apk, и мы можем выпустить его в магазине Google Play.

Арпит Патель
источник
0

Для Windows я создал build.cmdфайл:

(замените путь хранилища ключей и псевдоним)

Для Кордовы:

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

И для ионики:

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

Сохраните его в каталоге ptoject, вы можете дважды щелкнуть или открыть его с помощью cmd.

SSZ
источник