如何使用Cordova命令行界面创建签名的APK文件?


169

我制作了一个名为的示例应用程序checkStatus。现在,我想创建一个签名的APK文件。因此,我可以将其安装在不同的设备中进行测试。

为此,我用Google搜索并找到了本文档

根据文档,我切换到项目目录并运行以下命令:

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

之后我跑上面的命令,我得到了一个文件名为key-name.keystoreprojectRoot/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.storeant.properties文件中的值。

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

再次,我运行了cordova build android --release命令。它抛出相同的错误。

谁能告诉我我做错了什么?


3
开始科尔多瓦5,该处理改变一点点:ilee.co.uk/Sign-Releases-with-Cordova-Android/...
Sombriks

Answers:


305

第1步:

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

添加,--save以便从config.xml文件中删除插件。

第2步:

要生成Android的发行版本,我们首先需要对AndroidManifest.xmlPlatforms / android中找到的文件进行少量更改。编辑文件并更改行:

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

并更改android:debuggablefalse

<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属性。如果这样做,则在构建要在模拟器或设备上进行调试的APK时,这些工具会自动插入android:debuggable = true。而且,当您执行发布构建(例如导出APK)时,它将自动将其设置为false。

另一方面,如果您在清单文件中指定了特定值,则工具将始终使用该值。这可能会导致意外发布带有调试信息的应用程序。

第三步:

现在我们可以告诉cordova生成我们的发布版本:

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>

例如:

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

新版本科尔多瓦

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

要对未签名的APK进行签名,请运行JDK中还包括的jarsigner工具:

句法:

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

例如:

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 align工具来优化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商店中发行它。


9
好吧,我接受你的想法。但是我有私人的git仓库,我们有一个团队致力于移动应用程序。所以对我来说很舒服。
cfprabhu 2015年

5
为什么删除org.apache.cordova.console很重要?
foreyez,2015年

5
@cfprabhu步骤5发出警告“未提供-tsa或-tsacert,并且此jar未被打上时间戳。”。通过在命令中添加“ -tsa timestamp.digicert.com”来修复此问题。可能对其他用户有用
托马斯Bormans

6
OSX下的zipalign可在〜/ Library / Android / sdk / build-tools / 22.0.1 / zipalign
chillwalker

2
@ThomasBormans不知何故-tsa timestamp.digicert.com为我抛出了NullPointerException。-tsa http://timestamp.digicert.com似乎已解决问题
Thomas

123

Cordova 4(及更高版本)的@malcubierre更新-

创建一个名为release-signing.properties并放入 APPFOLDER\platforms\android文件夹的文件

文件内容:在=之后编辑第二行以外的所有内容

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

然后,此命令应构建发行版本:

cordova build android --release

2
谢谢!您也可以更改属性文件的名称/位置,但必须在build-extras.gradle文件中指定。相关的cordova文档在这里
2016年

我的应用程序未更新到下一个版本,即在ant build(cordova 3)中创建的第一个版本。我将我的cordova升级到6.0.0,现在在gradle build中创建了第二个版本,我按照最新的cordova文档创建了签名的apk,但是我的应用程序仍未更新。我浏览了网络上的所有信息,但仍然出问题了。请帮助我@Dunc
NGB

@Naveen我正在使用Cordova 5.2.0,其他版本> 5时遇到了各种问题。建议您尝试尝试。然后,如果仍然有问题,建议您提出一个新问题。
Dunc

仍然有问题,无法从现有应用下载新版本的apk。@Dunc
NGB

@Dunc任何解决方案
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

2
很棒的<3,您的答案是关于我可以版本控制的文件!
gustavohenke

3
该json应该在哪个目录中?
Beelphegor '16

6
科尔多瓦构建android --release
shadi 16-4-18的

2
将build.json和密钥库文件一起放在根项目文件夹中。这是我发现的最有效的无忧签名方法。
乔尔·卡顿

1
由于某种原因,我不得不将文件路径更改为“ ../android.keystore”。(正斜线)
Dilhan Jayathilake

20

第1步:

转到cordova\platforms\androidant ant.properties,使用密钥库文件信息创建一个称为文件的填充(此密钥库可以从您最喜欢的Android SDK,studio生成...):

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

第2步:

转到cordova路径并执行:

cordova build android --release

注意:系统将提示您询问密钥库和密钥密码

YourApp-release.apk将出现在 \cordova\platforms\android\ant-build



5
开始科尔多瓦5,该处理改变一点点:ilee.co.uk/Sign-Releases-with-Cordova-Android/...
Sombriks

使用Cordova 5名称文件“ release-signing.properties”而不是“ ant.properties”;所有其它步骤完全按照@malcubierre描述
马里奥奥赫朗迪

新版本的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

您是否替换了密钥库路径?如果是这样,请在此处发布命令。
KrIsHnA

是的 这是cordova build android --release -- --keystore="C:\release.keystore" --storePassword=****** --alias=mr5
mr5

1
"(双引号)括住我的密码后,它开始运行。我认为Cordova在解析特殊字符方面存在问题。
mr5

如果有人使用Ionic,则可以签出该文件ionicframework.com/docs/cli/cordova/build
Nguyen Tran

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将以SignedApk.apk的形式出现在您的App文件夹/ p​​latforms / android / build / outputs / apk /中确保使用第一个脚本定义的正确密钥别名和密码


2

在cmd中构建Cordova Release APK文件。

密钥存储文件路径:密钥存储文件路径(F:/cordova/myApp/xxxxx.jks)

关键商店密码:xxxxx

关键商店别名:xxxxx

关键商店别名密码:xxxxx

路径zipalign.exe:zipalign.exe文件路径(C:\用户\ XXXX \应用程序数据\本地\ Android的\ SDK \构建工具\ 25.0.2 \的zipalign)

ANDROID UNSIGNED APK名称:android-release-unsigned.apk

安卓发布APK名称:android-release.apk

在cmd中按以下步骤运行(以管理员身份运行)

  1. 科尔多瓦建立-发布Android
  2. 转到android-release-unsigned.apk文件位置(PROJECT \ platforms \ android \ build \ outputs \ apk)
  3. jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore < 密钥存储文件路径 > < ANDROID UNSIGNED APK名称 > < 密钥存储别名 >
  4. < zipalign.exe的路径 > -v 4 < ANDROID UNSIGNED APK名称 > < ANDROID RELEASE APK名称 >

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

首先,如果要更新应用,请检查您的版本代码和版本名称。并确保您以前有一个密钥库。

如果您要更新应用程序,请按照步骤1,3,4。

第1步:

转到您的cordova项目以生成我们的发布版本:

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

然后,我们可以在platform / android / ant-build中找到未签名的APK文件。在我们的示例中,文件为

如果您使用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的密钥库。

第三步:

将生成的密钥库放置在D:\ projects \ Phonegap \ Example \ platforms \ android \ ant-build

要对未签名的APK进行签名,请运行JDK中还包括的jarsigner工具:

句法:

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

如果不协调,请执行以下步骤

(1) 右键单击“此PC”>右键单击“属性”>“高级系统设置”>“环境变量”>选择“路径”,然后选择“编辑”。

(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 align工具来优化APK:

如果zipalign无法识别

(1) 转到您的android sdk路径并找到zipalign,它通常位于android-sdk \ build-tools \ 23.0.3中

(2) 通常在以下路径中将zipalign文件粘贴复制到您的generate release apk文件夹中

yourproject / platforms / android / ant-build / Example-release-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打开它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.