Como criar um arquivo APK assinado usando a interface de linha de comando Cordova?

169

Eu fiz um aplicativo de exemplo chamado checkStatus. Agora, quero criar um arquivo APK assinado. Para que eu possa instalá-lo em diferentes dispositivos para os meus testes.

Para isso, pesquisei no Google e encontrei esta documentação .

Conforme o documento, mudei para o diretório do meu projeto e executei o seguinte comando:

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

Depois de executar o comando acima, recebi um arquivo chamado key-name.keystoreat projectRoot/key-name.keystore.

E então eu colei esse arquivo em projectRoot/platforms/android/key-name.keystore.

Depois disso, criei um arquivo chamado ant.propertiese o salvei projectRoot/platforms/android.

Eu escrevi o seguinte código dentro do arquivo:

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

Depois disso, executei o seguinte comando para liberar

Cordova builds android --release

Está lançando o seguinte erro:

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

Então, desta vez, modifiquei o key.storevalor no ant.propertiesarquivo da seguinte maneira.

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

Mais uma vez, eu corri o cordova build android --release comando. Lança o mesmo erro.

Alguém pode me dizer o que eu fiz de errado?

vasan
fonte
3
começando com cordova 5, o processo muda um pouco: ilee.co.uk/Sign-Releases-with-Cordova-Android/…
Sombriks

Respostas:

305

Passo 1:

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

adicione o --savepara remover o plug-in do diretórioconfig.xml arquivo.

Passo 2:

Para gerar uma versão compilada para Android, primeiro precisamos fazer uma pequena alteração no AndroidManifest.xmlarquivo encontrado em plataformas / android. Edite o arquivo e altere a linha:

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

e mude android:debuggablepara false:

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

A partir do cordova 6.2.0, remova completamente a etiqueta android: debuggable. Aqui está a explicação de cordova:

Explicação para problemas do tipo "HardcodedDebugMode": é melhor deixar de fora o atributo android: debuggable do manifesto. Se o fizer, as ferramentas inserem automaticamente android: debuggable = true ao criar um APK para depurar em um emulador ou dispositivo. E quando você executa uma compilação de versão, como Exportar APK, ela automaticamente a define como falsa.

Se, por outro lado, você especificar um valor específico no arquivo de manifesto, as ferramentas sempre o usarão. Isso pode levar à publicação acidental de seu aplicativo com informações de depuração.

Etapa 3:

Agora podemos dizer ao cordova para gerar nosso build de lançamento:

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

Em seguida, podemos encontrar nosso arquivo APK não assinado em platforms/android/ant-build. No nosso exemplo, o arquivo foiplatforms/android/ant-build/Example-release-unsigned.apk

Passo 4:

Nota: Temos o nosso keystore keystoreNAME-mobileapps.keystoreneste repositório do Git. Se você deseja criar outro, siga as etapas a seguir.

Geração de chaves:

Sintaxe:

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

Em seguida, o armazenamento de chaves foi gerado com o nome como NAME-mobileapps.keystore

Etapa 5:

Coloque o keystore gerado em

versão antiga cordova

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

Nova versão cordova

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

Para assinar o APK não assinado, execute a ferramenta jarsigner, que também está incluída no JDK:

Sintaxe:

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

OU

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'

Isso assina o apk no lugar.

Etapa 6:

Por fim, precisamos executar a ferramenta de alinhamento zip para otimizar o APK:

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

OU

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

OU

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

Agora, temos nosso binário de lançamento final chamado example.apk e podemos lançá-lo na Google Play Store.

cfprabhu
fonte
9
Ok, eu aceito o seu pensamento. Mas eu tenho repositório git privado e temos uma equipe para trabalhar no aplicativo móvel. Portanto, é confortável para mim.
Cfprabhu 16/05
5
Por que era importante remover o org.apache.cordova.console?
Foreyez # 8/15
5
@cfprabhu A Etapa 5 está lançando um aviso "Nenhum -tsa ou -tsacert é fornecido e este jar não possui registro de data e hora". Corrigido, adicionando "-tsa timestamp.digicert.com" ao comando. Pode ser útil para outros usuários
Thomas Bormans
6
O zipalign no OSX está disponível em ~ / Library / Android / sdk / build-tools / 22.0.1 / zipalign
chillwalker
2
@ThomasBormans de alguma forma -tsa timestamp.digicert.comlançou uma NullPointerException para mim. -tsa http://timestamp.digicert.comparece corrigi-lo #
Thomas
123

Uma atualização para @malcubierre para Cordova 4 (e posterior) -

Crie um arquivo chamado release-signing.propertiese coloque APPFOLDER\platforms\android pasta

Conteúdo do arquivo: editar após = para todos, exceto a segunda linha

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

Então este comando deve criar uma versão de lançamento:

cordova build android --release
Jon
fonte
2
Obrigado! Você também pode alterar o nome / local do seu arquivo de propriedades, mas é necessário especificar em um build-extras.gradlearquivo. Doc cordova relevante aqui .
Dunc
Meu aplicativo não está sendo atualizado para a próxima versão, primeira versão criada no form build (cordova 3). Atualizei meu cordova para 6.0.0 agora a segunda versão é criada no gradle build, segui o último documento do cordova para criar apk assinado, mas meu aplicativo ainda não está sendo atualizado. Passei por todas as informações da web, mas ainda assim algum lugar está errado. Por favor me ajude @Dunc
NGB
@ Naveen Estou usando o Cordova 5.2.0, tive vários problemas com outras versões> 5. Sugiro que tente isso, se puder. Então, se ainda estiver com problemas, recomendo fazer uma nova pergunta.
22416 Dunc
Ainda com problemas, a nova versão do apk não está sendo baixada do aplicativo existente. @Dunc
NGB
@Dunc qualquer solução
NGB
52

Na documentação atual , podemos especificar um build.json com o keystore:

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

E então, execute o comando com --buildConfig argumente, desta maneira:

cordova run android --buildConfig
infinito84
fonte
2
Impressionante <3, sua resposta é sobre arquivos que eu posso controlar a versão!
Gustavohenke 07/03
3
em qual diretório esse json deve existir?
Beelphegor 13/04/19
6
cordova build android --release
shadi
2
Coloque o build.json na pasta do projeto raiz junto com o arquivo keystore. Este é o método mais eficaz e sem complicações para assinar que encontrei.
Joel Caton
1
Por alguma razão, o caminho do arquivo foi alterado para "../android.keystore". (barra)
Dilhan Jayathilake
20

Passo 1:

Vá para cordova\platforms\androidant criar um ant.propertiesarquivo chamado file com as informações do arquivo keystore (esse keystore pode ser gerado a partir do seu Android SDK, estúdio favorito ...):

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

Passo 2:

Vá para o caminho cordova e execute:

cordova build android --release

Nota: Você será solicitado a solicitar seu keystore e senha de chave

Um YourApp-release.apk aparecerá em \cordova\platforms\android\ant-build

Malcubierre
fonte
1
Aqui está a solução de trabalho: ilee.co.uk/Sign-Releases-with-Cordova-Android
redrom
5
começando com Cordova 5, o processo de muda um pouco: ilee.co.uk/Sign-Releases-with-Cordova-Android/...
Sombriks
Com o arquivo de nome Cordova 5 "release-signing.properties" em vez de "ant.properties"; todos os outros passos são exatamente como descrito por @malcubierre
Mario Orlandi
A nova versão do apk não está sendo baixada do aplicativo existente no cordova 6.0.0. Segui todos os documentos ainda não resolveu o meu problema que você pode me ajudar a @MarioOrlandi
NGB
11

No cordova 6.2.0 , ele tem uma maneira fácil de criar a versão compilada. consulte outras etapas aqui Etapas 1, 2 e 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
fonte
Estou recebendo um erro ao The system cannot find the file specifiedusar o Cordova 6.2.0
mr5
você substituiu o caminho do keystore? Em caso afirmativo, poste o comando aqui.
precisa saber é o seguinte
Sim. Écordova build android --release -- --keystore="C:\release.keystore" --storePassword=****** --alias=mr5
MR5
1
Depois de colocar minha senha com "(aspas duplas), ela começou a ser executada. Acho que Cordova tem um problema sobre a análise de caracteres especiais.
MR5
Se o uso de qualquer um Ionic, você pode verificar este documento ionicframework.com/docs/cli/cordova/build
Nguyen Tran
7

No Mac (osx), gerei dois arquivos .sh, um para a primeira publicação e outro para atualização:

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

E para atualizar seu aplicativo:

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

Supondo que você esteja na sua pasta pessoal ou em uma pasta no topo das pastas dos aplicativos. Certifique-se de definir corretamente o chmod para usar este script. Então :

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

Seu apk assinado estará na pasta Your App / plataformas / android / build / outputs / apk / as SignedApk.apk Certifique-se de usar o alias de chave e a senha corretos definidos com o primeiro script

Ben
fonte
2

Crie o arquivo APK do cordova release no cmd.

CAMINHO DO ARQUIVO DE ARMAZENAMENTO DE CHAVES : caminho do arquivo de armazenamento de chaves (F: /cordova/myApp/xxxxx.jks)

SENHA DA LOJA PRINCIPAL : xxxxx

ALIAS DA CHAVE DA LOJA : xxxxx

SENHA DA ALIAS DA LOJA-CHAVE : xxxxx

CAMINHO DO zipalign.exe : caminho do arquivo zipalign.exe (C: \ Users \ xxxx \ AppData \ Local \ Android \ sdk \ build-tools \ 25.0.2 \ zipalign)

ANDROID NÃO ASSINADO NOME DO APK : android-release-unsigned.apk

ANDROID RELEASE NOME DO APK : android-release.apk

Execute as etapas abaixo no cmd (execute como administrador)

  1. cordova build --release android
  2. vá para o local do arquivo android-release-unsigned.apk (PROJECT \ plataformas \ android \ build \ outputs \ apk)
  3. jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore < CAMINHO DO ARQUIVO DE LOJA DE CHAVES > < NOME DO APK ANDROID NÃO ASSINADO > < ALIAS DA CHAVE DE LOJA >
  4. < CAMINHO DO zipalign.exe > -v 4 < NOME DO APK NÃO ASSINADO ANDROID > < NOME DO APK RELEASE ANDROID >
Om Shankar
fonte
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
fonte
0

Primeiro, verifique o código e o nome da versão, se você estiver atualizando seu aplicativo. E verifique se você possui um keystore anterior.

Se você estiver atualizando o aplicativo, siga a etapa 1,3,4.

Passo 1:

Vá para o seu projeto cordova para gerar nossa versão:

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

Em seguida, podemos encontrar nosso arquivo APK não assinado em plataformas / android / ant-build. No nosso exemplo, o arquivo foi

se você usou o form-build

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

OU

se você usou gradle-build

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

Passo 2:

Geração de chaves:

Sintaxe:

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

Se o comando keytool não reconhecer, execute esta etapa

Verifique se o diretório em que o executável do keytool está está no seu caminho. (Por exemplo, na minha máquina com Windows 7, está em C: \ Arquivos de Programas (x86) \ Java \ jre6 \ bin.)

Exemplo:

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

Em seguida, o armazenamento de chaves foi gerado com o nome como NAME-mobileapps.keystore

Etapa 3:

Coloque o keystore gerado em D: \ projetos \ Phonegap \ Exemplo \ plataformas \ android \ ant-build

Para assinar o APK não assinado, execute a ferramenta jarsigner, que também está incluída no JDK:

Sintaxe:

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

Se não reconectar, siga estas etapas

(1) Clique com o botão direito do mouse em "Este PC"> clique com o botão direito em Propriedades> Configurações avançadas do sistema> Variáveis ​​de ambiente> selecione PATH e depois EDIT.

(2) Adicione o caminho da pasta jdk bin às variáveis ​​de ambiente, ele deve se parecer com o seguinte:

"C: \ Arquivos de Programas \ Java \ jdk1.8.0_40 \ bin".

Exemplo:

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'

Isso assina o apk no lugar.

Passo 4:

Por fim, precisamos executar a ferramenta de alinhamento zip para otimizar o APK:

se zipalign não reconhecer,

(1) vá para o caminho do sdk do Android e encontre o zipalign geralmente em android-sdk \ build-tools \ 23.0.3

(2) Copie e cole o arquivo zipalign na pasta apk de liberação do arquivo geralmente no caminho abaixo

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

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

OU

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

Agora, temos nosso binário de lançamento final chamado example.apk e podemos lançá-lo na Google Play Store.

Arpit Patel
fonte
0

Para Windows, eu criei um build.cmdarquivo:

(substitua o caminho e alias do keystore)

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

E para 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%

Salve-o no diretório do ptoject, clique duas vezes ou abra-o com o cmd.

ssz
fonte