【发布时间】:2018-07-23 14:33:39
【问题描述】:
在 Visual Studio 中创建 APK 时出现此错误:
Failed to load signer "signer #1": C:\...\googleplay.keystore entry "googleplay" does not contain a key
我是一名熟悉 Visual Studio 的长期 ASP.NET 开发人员,但这是我的第一个 Xamarin 项目。 (我没有使用 Android Studio。)我正在尝试将 Android 构建部署到 Google Play。我从未将 APK 上传到 Google Play,因此无法使用 Visual Studio 的自动部署;我必须先按照 Google 和 Microsoft 的说明执行手动部署。
我正在运行带有 JDK 1.8 的 Visual Studio 2017 15.7.5(最新)。我的项目使用的是 NETStandard.Library 2.0.3、Xamarin.Forms 3.1.0 和 Microsoft.EntityFrameworkCore 2.1.1。
这个问题类似于this question that has no answers,但我从 Visual Studio 中得到了错误。如果这是重复的,我很抱歉,但我无法添加有关该问题的其他详细信息。
我正在使用 Google Play 应用签名。我通过 Google Play 创建了一个密钥。我下载了 .der 格式的证书。我使用 keytool(来自 c:\Program Files\Java\jdk1.8.0_172\bin)通过以下命令将 .der 文件转换为 .keystore:
keytool -importcert -alias googleplay -file "C:\...\deployment_cert.der"
我已经重新运行此实用程序几次更改选项,认为可能存在 keytool 提示输入的密码中的别名或特殊字符的区分大小写问题。在这种情况下,别名全部是字母,全部小写,密码是字母数字全部小写。 keytool 要求信任此证书,我按“y”。
这会生成一个名为 .keystore 的文件。我将其重命名为googleplay.keystore,并将其移至更合适的位置。
我可以通过运行以下命令再次检查 googleplay 别名是否存在于密钥库文件中:
C:\Program Files\Java\jdk1.8.0_172\bin>keytool -v -list -keystore "C:\...\googleplay.keystore" -alias googleplay
Enter keystore password:
Alias name: googleplay
Creation date: Jul 23, 2018
Entry type: trustedCertEntry
Owner: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Issuer: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Serial number: e8************************************8a
Valid from: Thu Jul 19 14:18:56 EDT 2018 until: Sun Jul 19 14:18:56 EDT 2048
Certificate fingerprints:
MD5: 0D:**:**:**:**:**:**:**:**:**:**:**:**:**:**:C8
SHA1: 11:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:CD
SHA256: D0:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:74
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 4096-bit RSA key
Version: 3
Extensions:
#1: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:true
PathLen:2147483647
]
“googleplay”别名绝对存在!证书指纹与 Google 给我的密钥相匹配(已编辑)。
在 Visual Studio 中,我将解决方案配置设置为发布模式,我清理了我的整个解决方案(成功),重建了我的整个解决方案(成功),然后右键单击我的 Android 项目并单击these instructionsArchive... .
附带说明一下,那篇 Microsoft 文章非常令人沮丧,因为它没有提及签名或这个问题,而且他们在 signing 上的 articles 与 Google Play 的运作方式不匹配,并且似乎假设您拥有正确的 APK已上传到 Google Play(绕过先有鸡还是先有蛋的 Catch-22)。
起初我得到的只是The archiving process has failed. Please see the Errors section for more details. 错误列表面板是空的。输出面板只是说"java.exe" exited with code 2. 我去了Tools -> Options -> Projects and Solutions -> Build and Run 并将MSBuild project build output verbosity 从Minimal 更改为Diagnostic 并重复最后几个步骤(清理、重建、存档)。现在,输出面板(略有编辑)说:
Using "AndroidApkSigner" task from assembly "C:\...\MSBuild\Xamarin\Android\Xamarin.Android.Build.Tasks.dll".
Task "AndroidApkSigner"
AndroidApkSigner:
ApkSignerJar: C:\Program Files (x86)\Android\android-sdk\build-tools\27.0.3\lib\apksigner.jar
ApkToSign: bin\Release\com.mycompany.myproject.apk
ManifestFile: obj\Release\android\AndroidManifest.xml
AdditionalArguments:
C:\Program Files\Java\jdk1.8.0_172\\bin\java.exe -jar "C:\Program Files (x86)\Android\android-sdk\build-tools\27.0.3\lib\apksigner.jar" sign --ks "C:\...\googleplay.keystore" --ks-pass pass:******** --ks-key-alias googleplay --key-pass pass:******** --min-sdk-version 19 --max-sdk-version 27 C:\...\myproject.Android\bin\Release\com.mycompany.myproject.apk
Failed to load signer "signer #1": C:\...\googleplay.keystore entry "googleplay" does not contain a key
"java.exe" exited with code 2.
Done executing task "AndroidApkSigner" -- FAILED.
Done building target "_Sign" in project "myproject.Android.csproj" -- FAILED.
Done building project "myproject.Android.csproj" -- FAILED.
Build FAILED.
从上面的输出中,您可以看到我的项目属性的 Android 包签名选项卡中的(编辑的)值是什么。通过反复试验,我发现 Keystore 密码、别名和别名密码都是必需的。我将密钥库密码和别名密码设置为相同,因为只有一个密码与此密钥库关联。如上所述,密码是小写字母数字(根据另一个 SO 问题的建议没有特殊字符)。
为什么当 keytool 没有问题地找到密钥时,AndroidApkSigner 无法在提供的别名的密钥库中找到密钥?
而且,我不能是唯一有这个问题的人吗?从 Visual Studio 部署到 Google Play 应该是一个相当常见的工作流程,但我没有找到遇到此问题的其他任何人(除了 this other unanswered SO question)。我做错了什么?
【问题讨论】:
-
从15.6, signing is broken开始。我什至无法再将我的 xamarin 应用程序部署到物理设备上进行调试。
-
在上传到 Google Play 之前,您是如何生成应用的密钥库/密钥的?如果这是一个新应用程序,您无需执行任何操作,只需上传 Release APK。当您选择加入应用签名计划时,用于发布 APK 的密钥将成为上传密钥,然后 Google Play 将生成一个新密钥以在 APK 到达用户之前对其进行签名。
-
@JonDouglas,我创建的第一个 APK 没有签名。 VS 创建的很好,但是当我将它上传到 Google 时,它说 APK 不是 zip-aligned,这导致我使用 zipalign.exe。我将它上传到 Google,然后它说需要对 APK 进行签名,这与 this page 一致,即“需要 Google Play 的应用签名”。这把我带到了这里。我选择了 Google Play App Signing,它给了我一个证书(问题中描述的 .der 文件)。我应该做一些不同的事情吗?
-
您应该能够上传使用本地密钥库签名的发布 APK。该存储中的密钥将成为上传密钥。然后,它将生成一个新的上传密钥,该密钥与原始密钥一致,以供将来任何 APK 更新使用。
-
好的,我刚刚创建了自己的独立于 Google Play 的 .keystore。
keytool -genkeypair -v -keystore mykey.keystore -alias eric -keyalg RSA -keysize 2048 -validity 10000。我更新了我的项目以使用此密钥库。清理、重建、存档,然后我得到一个与上面详述的类似的错误:Failed to load signer "signer #1",但这次它在下一行显示,java.io.IOException: Failed to obtain key with alias "eric" from C:\...\mykey.keystore. Wrong password?如上面的问题,我可以验证别名“eric”是否存在和密码是正确的。
标签: visual-studio xamarin.android google-play keytool apksigner