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

Posted

技术标签:

【中文标题】无法通过 Visual Studio Cordova 构建签名的 android 包【英文标题】:Cannot build signed android package through visual studio cordova 【发布时间】:2015-11-27 21:50:36 【问题描述】:

我正在尝试使用 Visual Studio 2015 Cordova 工具为我的 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?

【问题讨论】:

【参考方案1】:

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

右键单击 build.json,选择“打开方式...”,然后从列表中选择“二进制编辑器”。您应该会看到如下内容:

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

【讨论】:

我遇到了完全相同的问题,这已经为我解决了,谢谢! 你是个巫师,dlev。 这也解决了我的问题。没有具体迹象表明哪个标记或字符是意外的。但是,上面的修复就像一个魅力。 谢谢你,这对我帮助很大 谢谢这个答案节省了我很多时间。再次感谢。【参考方案2】:

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

查看android build documentation后,即Signing Your App Manually

我意识到应该可以在发布模式下构建应用程序(即第一次生成未签名的 apk),所以我删除了 build.json 并尝试了这个,但我得到了错误。我做了一些谷歌搜索,然后找到了这个 [post][2]。

[2]: Error when running cordova build –release android 总而言之这是我的建议。

    删除 build.json 文件。 清理解决方案,将其设置为调试模式并确保您可以成功构建。 清理解决方案将其设置为释放模式。 转到您的应用程序目录,找到platforms\android,您将看到build.gradle。

    创建一个新文件 build-extras.gradle,我从 [post][2] 上的一个中得到了这个建议

    [2]: Error when running cordova build –release android 你不想编辑自动生成的 build.gradle 文件。

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

【讨论】:

我知道我可以手动签名。我希望 Visual Studio 自动完成。这就是为什么我不会接受这个作为答案。 我在使用 build.json 文件时遇到的错误正是不起作用。我想知道“Unexpected token ´╗┐”到底是什么意思,微软团队中负责这个的人应该调查一下。 另一个破解方法是使用 build-extras.gradle【参考方案3】:

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

我使用的路径包含文件夹名称foo\bar。这以前有效,但现在看来(我不知道节点、cordova 或其他是否已更新)这不再有效,您必须转义目录分隔符:foo\\bar

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

【讨论】:

【参考方案4】:

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

 安卓 
     lintOptions 
        checkReleaseBuilds 错误
        中止错误错误
    
    签名配置 
         发布 
                关键别名 = ""
                keyPassword = "yourpassword" // 这些必须设置为非空才能将签名步骤添加到任务图中。
                storeFile = file("yourfile.keystore")
                storePassword = "你的密码"
            
        
        构建类型 
            发布 
                签名配置 签名配置.release
            
        

如果您想创建完全自动化的错觉,那么您可以使用 gulp 任务 "a pre-build step" 将您的密钥库文件和 build-extras gradle 文件从无论您拥有它们。

【讨论】:

以上是关于无法通过 Visual Studio Cordova 构建签名的 android 包的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Visual Studio Code 远程 SSH 连接到 GCP VM

无法通过 Powershell 或 Visual Studio 连接到受保护的 Azure Service Fabric 群集

无法使用 Git Bash 对 Visual Studio Team Services 进行身份验证

无法在 Azure 门户中查看通过 Visual Studio 创建/部署的函数的代码,但是当我通过门户创建函数时可以

无法在 Windows Server 2008 上运行 Visual Studio 2012 远程调试器

Visual Studio 无法识别 boost::asio