为 Gradle 和 Cordova 5 指定签名配置

Posted

技术标签:

【中文标题】为 Gradle 和 Cordova 5 指定签名配置【英文标题】:Specify signing config for Gradle and Cordova 5 【发布时间】:2015-07-18 08:16:35 【问题描述】:

与 Cordova 通信 news 版本 5.0.0 已准备就绪。我尝试像往常一样升级我所有的 android 项目。

更新 Cordova 框架本身:

npm update -g cordova

在 Android 项目中更新库:

cordova platform update android

使用“--release”选项构建新版本后:

cordova build android --release

我只有未签名的版本。奇怪... 那么如何重用现有的密钥库(之前由 keytool 生成并由 Cordova 4.0.0 使用)来获取签名的 APK?

【问题讨论】:

请也检查一下 - ***.com/a/31585543/1923045 @KrIsHnA,我敢肯定 5 月 7 日早于 7 月 23 日;) 是的,我也这么认为。 :) 我想像我这样的人稍后会检查 cmets 以获得快速答案。 (y|n) 【参考方案1】:

看起来 Cordova 5.0.0 使用 Gradle 构建自动化系统而不是 Ant。因此,在文件“/platforms/android/ant.properties”中定义的密钥库的原始设置将不会在构建期间使用。因此,我们将得到未签名的 APK。

为了解决这个问题,我们需要告诉 Gradle 也使用现有的密钥库。对 build.gradle 的调查为我们提供了提供签名配置所需的有用信息。

但是在这个文件中这样做是个坏主意,因为它被标记为自动生成,并且应该没有任何编辑。

所以我终于找到了解决它的方法。对象“signingConfigs”将从文件构造,文件名存储在 cdvReleaseSigningPropertiesFile 中。根据文档,此变量的默认值为“release-signing.properties”。所以我们只需要在与“build.gradle”文件相同的文件夹中创建具有该名称的新文件,并放入以下内容:

storeFile=..\\..\\some-keystore.keystore
storeType=jks
keyAlias=some-key
// if you don't want to enter the password at every build, you can store it with this
keyPassword=your-key-password
storePassword=your-store-password

示例中的路径是为保存在项目根目录中的密钥库指定的。它具有 Windows 风格...在 Linux 的情况下,您需要使用单斜杠(而不是上面示例中的双反斜杠)。

此外,您可以设置自己的签名设置文件路径。 要了解更多信息,请查看cordova documentation 的边缘版本。

【讨论】:

很好,但我认为这有问题,因为您必须在特定于平台的文件夹中保存一个文件。也许有一种方法可以创建一个将该文件放入 android 文件夹的钩子?我正在尝试但没有成功(我第一次使用钩子)。有什么线索吗? 构建 Android 版本需要 Gradle 文件。因此,在那里拥有所有配置文件看起来非常简单。但是您可以创建一些文件,例如 build-release-android.cmd (build-release-android.sh) 并将所有命令放在那里: 1. 用于复制配置文件的命令 2. “cordova build android --release” 命令。 @SebastiánRojasR 你所说的不是这个问题/答案的具体内容。我通过在与项目中的插件目录和 config.xml 相同的级别上创建一个跨平台目录来解决此问题。我添加了需要从那里复制到 android 构建项目结果的 android 文件。查看 Holly Schinsky 的这篇文章,了解如何从非平台特定位置复制文件(请参阅复制图像和编辑该脚本的部分):devgirl.org/2013/11/12/… 澄清我们需要把配置放在platform/android/release-signing.properties【参考方案2】:

根据official documentation (v5.1.1+) 我刚刚添加了一个 build.json


     "android": 
         "release": 
             "keystore": "android.keystore",
             "storePassword": "storepassword",
             "alias": "mykey",
             "password" : "password",
             "keystoreType": ""
         
     
 

和我现有的 android.keystore 文件在根 cordova 文件夹中。

cordova build android --release 可以解决问题,不需要任何钩子,然后可以在 ./platform/android/build/outputs/apk 中找到 singned apk 文件作为 android-release.apk .

【讨论】:

你把这个 build.json 放到了哪个文件夹? @albertleao 到项目的根目录,根据我的试验,将 .keystore 也放入根目录也很简单,正如 Ronny 建议的那样 有没有办法将 build.json 和 keystore 文件放到另一个文件夹中? 这行得通,但似乎密钥库的路径总是被认为是相对于构建文件的,即你不能放 "D:\\SomeFolder\\mystore.keystore",您必须使用相对路径(“..\..\SomeFolder\mystore.keystore”或类似路径)来访问它 完美运行,感谢分享!不知道有没有办法自动更改生成的.apk文件的名字?【参考方案3】:

对于cordova 5.1.1+,请参考Ronny Elflein r11lein 回答https://***.com/a/30980293/2163398

当前的答案很好(@maxim),但我们希望保持特定于平台的文件夹不受影响,因此我们可以在版本控制之外对其进行维护。所以我创建了这个Hook来自动复制android文件夹中的“release-signing.properties”文件。

所以,首先,将您的密钥库放在您的项目根目录中。然后在您的科尔多瓦项目的根目录中的文件夹配置中创建“release-signing.properties”。内容(示例中的 storeFile 路径是为保存在项目根目录中的密钥库指定的。它具有 Windows 风格...如果是 Linux,则需要使用单斜杠):

storeFile=..\\..\\some-keystore.keystore
storeType=jks
keyAlias=some-key
// if you don't want to enter the password at every build, you can store it with this
keyPassword=your-key-password
storePassword=your-store-password

然后,如果不存在,则在“hooks”文件夹中添加“after_prepare”文件夹,并在其中创建一个名为“copy_assets.js”的文件。内容:

#!/usr/bin/env node

// Files to be copied, with source and destination

var ncp = require('ncp').ncp,
    transfers = [
      
        'source': './config/android/release-signing.properties',
        'destination': './platforms/android/release-signing.properties'
      
    ];

ncp.limit = 16;

transfers.forEach(function(transfer) 
  ncp(transfer.source, transfer.destination, function (err) 
    if (err) 
      return console.error(err);
    
    console.log('====== Assets moved from ' + transfer.source + ' to ' + transfer.destination + ' ======');
  );
);

如果您的项目中没有 ncp,请在项目文件夹根目录中打开命令提示符并运行命令(您可能需要在项目根目录中创建一个 packages.json 文件):

npm install ncp

然后,你可以运行:

cordova build android --release

【讨论】:

这个答案和最佳答案都是坚如磐石的。好好利用钩子! 我尝试了@Ronny Elflein r11lein 的回答并完美运行......现在科尔多瓦从 build.json 文件中自动生成 release-signing.properties 既然可以让它变得复杂,为什么还要让它变得简单?! :) 我想使用@Ronny 的方法,但到目前为止还没有运气......这种方法是否需要最新版本的cordova,gradle? 是的!使用sudo npm install -g cordova 升级到 5.1.1,现在@Ronny 的答案工作正常! 谁能给我指出一些资源:“钩子”?这是 UNIX 构造/概念吗?【参考方案4】:

要自动化构建发布过程,您应该在项目文件夹中创建“build.json”并包含以下内容:


 "android": 
     "release": 
         "keystore": "android.keystore",
         "storePassword": "storepassword",
         "alias": "mykey",
         "password" : "password",
         "keystoreType": ""
     
 

密钥库是使用

生成的
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

如果您已经有密钥库文件,只需运行以下命令即可了解所需内容

keytool -list -keystore .keystore

然后你只需要运行

cordova build android --release

【讨论】:

“storePassword”和“password”有什么区别?我使用keytool 创建了我的密钥库,输入了所有数据和密码……现在编译了 myApp.keystore。我假设使用的密码是storePassword。如果是这样,那么password 来自哪里?【参考方案5】:

步骤 - 1) 生成密钥库证书

Syntax -  keytool -genkey -v -keystore C:\DIR\APPNAME.keystore -alias APPNAME -keyalg RSA -keysize 2048 -validity 10000
2) 复制生成的keystore文件并粘贴到cd platform\android

3) 为 Gradle 指定签名配置 创建文件属性文件 - release-signing.properties(文件名) 编写下面的键和值

语法

        storeFile=..\\..\\some-keystore.keystore
        storeType=jks (pkcs12 for p12,jks for keystore)
        keyAlias=some-key
        // if you don't want to enter the password at every build, you can store it with this
        keyPassword=your-key-password
        storePassword=your-store-password

例子

        storeFile= abc.keystore
        storePassword=mypass
        storeType=jks
        keyAlias=abc
        keyPassword=mypass
4) 构建cordova项目

cordova build android --release

5) 运行cordova项目

cordova 运行 android --release

6) 在以下路径中创建的版本 APK -

平台\android\build\outputs\apk

【讨论】:

【参考方案6】:

在最新的 gradle 版本中,还可以在“\platforms\android\”文件夹中创建一个名为“release-signing.properties”的文件。内容应该是:

storeFile=<your key>.keystore
storeType=jks
keyAlias=<your_alias>
keyPassword=<your_passwd>
storePassword=<your_passwd>

文件“.keystore”应该在同一个文件夹中。

【讨论】:

值得记住 - 虽然 keytool 允许您使用非字母数字的密码和别名,但 Cordova 似乎对这些有问题。在我自己的案例中,我花了相当多的时间才意识到 Cordova 不喜欢我密码中的感叹号

以上是关于为 Gradle 和 Cordova 5 指定签名配置的主要内容,如果未能解决你的问题,请参考以下文章

sencha cmd 指定gradle 版本

Cordova / Ionic build android Gradle 错误:支持的最低 Gradle 版本为 2.14.1。当前版本是 2.13

有啥方法可以在 Cordova 中构建应用程序包或将 Cordova 签名的 apk 文件转换为应用程序包

无法通过 Visual Studio Cordova 构建签名的 android 包

Bamboo + Android + Gradle:如何生成签名的apk?

Gradle 无法通过企业代理连接到 maven repo - 需要通过 Sencha/Cordova 进行配置