无法通过 visual studio cordova 构建签名的 android 包

Cannot build signed android package through visual studio cordova

我正在尝试使用 Visual Studio 2015 Cordova Tools 为我的 Android 应用程序构建签名发布包。 我正在使用 Cordova 5.1.1,它要求我为构建过程提供一个 build.json 文件,告诉应用程序密钥库在哪里以及使用什么密码。 但是,当我添加 build.json 文件时,我无法成功构建以发布。

我遵循了这个指南:https://github.com/Microsoft/cordova-docs/tree/master/tutorial-package-publish#android

并遇到此错误(路径被删除):

1>  ANDROID_HOME=C:\Program Files (x86)\Android\android-sdk (TaskId:11)
1>  JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_55 (TaskId:11)
1>  \build.json (TaskId:11)
1>  Reading build config file: \build.json (TaskId:11)
1>  \platforms\android\cordova\node_modules\q\q.js:126 (TaskId:11)
1>                      throw e; (TaskId:11)
1>                            ^ (TaskId:11)
1>  SyntaxError: Unexpected token  (TaskId:11)
1>      at Object.parse (native) (TaskId:11)
1>      at parseOpts (\platforms\android\cordova\lib\build.js:475:27) (TaskId:11)
1>      at Object.module.exports.run (\platforms\android\cordova\lib\build.js:529:16) (TaskId:11)
1>      at \platforms\android\cordova\build:36:22 (TaskId:11)
1>      at _fulfilled (\platforms\android\cordova\node_modules\q\q.js:798:54) (TaskId:11)
1>      at self.promiseDispatch.done (\platforms\android\cordova\node_modules\q\q.js:827:30) (TaskId:11)
1>      at Promise.promise.promiseDispatch (\platforms\android\cordova\node_modules\q\q.js:760:13) (TaskId:11)
1>      at \platforms\android\cordova\node_modules\q\q.js:574:44 (TaskId:11)
1>      at flush (\platforms\android\cordova\node_modules\q\q.js:108:17) (TaskId:11)
1>      at process._tickCallback (node.js:355:11) (TaskId:11)
1>  Command finished with error code 1: cmd /s /c ""\platforms\android\cordova\build.bat" --release "--buildConfig=\build.json"" (TaskId:11)
1>ERROR building one of the platforms : error : cmd: Command failed with exit code 1
1>  You may not have the required environment or OS to build this project (TaskId:11)
1>MDAVSCLI : error : cmd: Command failed with exit code 1
1>Done executing task "MdaVsCli" -- FAILED. (TaskId:11)

我做错了什么?似乎无法解析 JSON?

我也按照相同的文档尝试了这种方法。并得到完全相同的错误。

查看 android build documentation 后,即 手动签署您的应用程序

我意识到应该可以在发布模式下构建应用程序(即首先生成一个未签名的 apk),所以我删除了 build.json 并尝试了这个,但我遇到了错误。我进行了几次 google 搜索并找到了这个 [post][2]。

[2]: 综上所述,这是我的建议。

  1. 删除 build.json 文件。
  2. 清理解决方案并将其设置为调试模式并确保您可以成功构建。
  3. 清理解决方案并将其设置为释放模式。
  4. 转到您的应用程序目录找到 platforms\android 您将看到 build.gradle。
  5. 创建一个新文件 build-extras.gradle,我从 [post][2]

    上的其中一位那里得到了这个建议

    [2]: 您不想编辑自动生成的 build.gradle 文件。

  6. 在您的构建中-extras.gradle 放入 android { lintOptions { 禁用 MissingTranslation } }
  7. 现在开始构建您的解决方案,它应该可以工作,您将在 bin\Android\release 文件夹中获得一个未签名的 apk,即 android-release-unsigned.apk。
    1. 按照 android build - signing your app manually steps
    2. 手动签署您的 apk

另一个 hack 是利用 android 的构建系统。在 platforms\android 中放入您的密钥库文件并放入您的 build-extras.gradle 中。以下

 android {
     lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
    signingConfigs {
         release {
                keyAlias = ""
                keyPassword = "yourpassword" // And these must be set to non-empty in order to have the signing step added to the task graph.
                storeFile = file("yourfile.keystore")
                storePassword = "yourpassword"
            }
        }
        buildTypes {
            release {
                signingConfig signingConfigs.release
            }
        }
}

如果你想创造完全自动化的错觉,那么你可以使用 gulp 任务 "a pre-build step" 来复制你的密钥库文件和 build-extras gradle 文件到 platforms\android 从任何地方。

这个问题是因为默认 build.json 有一个 NodeJS JSON 解析器不喜欢的 BOM。您可以通过多种方式解决此问题,但最简单的方法是使用 Visual Studio 的二进制编辑器打开文件。

右键单击build.json、select“打开方式...”,然后从列表中选择“二进制编辑器”。你应该看到这样的东西:

Select 截图中的前三个字节,删除它们,然后保存文件。解析器现在应该接受该文件,签名将按预期工作。

除了@dlev 发布的原因之外,我发现了另一个可能导致此问题的原因:

我使用的路径包含文件夹名称 foo\bar。这以前有效,但现在看来(我不知道节点、科尔多瓦或其他任何东西是否更新了)这不再有效,你必须转义目录分隔符:foo\bar.

添加这个之后,我可以再次构建我的项目。