你是不是误用调试密钥签名了?
Google Play 不允许您发布使用调试密钥库签名的应用。如果您尝试上传此类 APK,Google Play 将失败并显示消息“您上传的 APK 在调试模式下签名。您需要在发布模式下签名您的 APK。”
但是,如果您尝试上传使用调试密钥库签名的更新,您将不会看到此消息; Google Play 将显示问题中显示的消息,指的是 SHA1 指纹。
首先,检查你是否错误地使用调试密钥签署了应用程序。
如何检查使用了哪些签名密钥?
从 APK 中收集信息
您可以使用这些命令检查原始 APK 和更新 APK 使用哪些证书签名,使用 Java keytool:
keytool -printcert -jarfile original.apk
keytool -printcert -jarfile update.apk
这会显示有关 APK 签名方式的详细信息,例如:
Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
MD5: A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
Signature algorithm name: SHA256withRSA
Version: 3
这里需要注意的重要部分(对于每个 APK)是 SHA1 指纹值、Owner 身份值和有效期自/直到 strong> 日期。
如果keytool 命令不起作用(-jarfile 选项需要 Java 7),您可以通过jarsigner 命令获取更多基本信息:
jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk
很遗憾,这并没有显示 SHA1 指纹,但确实显示了 X.509 所有者身份以及证书到期日期。例如:
sm 4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)
X.509, CN=My App, O=My Company, L=Somewhere, C=DE
[certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
[CertPath not validated: Path does not chain with any of the trust anchors]
您可以忽略任何“CertPath 未验证”消息,以及有关证书链或时间戳的警告;在这种情况下它们不相关。
比较 APK 之间的 Owner、SHA1 和 Expiry 值
-
如果 Owner/X.509 身份值是 CN=Android Debug, O=Android, C=US,那么您已经使用 debug 签署了 APK键,而不是原来的释放键
-
如果原始 APK 和更新 APK 的 SHA1 指纹值不同,那么您确实没有对两个 APK 使用相同的签名密钥
-
如果 Owner/X.509 身份值不同,或者两个 APK 的证书到期日期不同,那么您没有 对两个 APK 使用相同的签名密钥
请注意,即使两个证书之间的 Owner/X.509 值相同,这并不意味着证书相同 - 如果其他任何内容不匹配 - 例如指纹值 - 那么证书是不同的.
搜索原始密钥库,检查备份
如果两个 APK 的证书信息不同,那么您必须找到原始密钥库,即 Google Play(或keytool)告诉您的第一个 SHA1 指纹值的文件。 p>
搜索您可以在计算机上找到的所有密钥库文件,以及在您拥有的任何备份中,直到找到具有正确 SHA1 指纹的文件:
keytool -list -keystore my-release.keystore
如果提示输入密码,只需按 Enter — 如果您只是想快速检查 SHA1 值,则不必输入它。
我在任何地方都找不到原始密钥库
如果您找不到原始密钥库,您将永远无法发布此特定应用的任何更新。
Android 在Signing Your Application 页面上明确提到了这一点:
警告:将您的密钥库和私钥保存在安全可靠的地方,并确保您拥有它们的安全备份。 如果您将应用发布到 Google Play,然后丢失了您签署应用所用的密钥,您将无法发布对应用的任何更新,因为您必须始终使用相同的密钥签署应用的所有版本.
第一次发布 APK 后,所有后续版本都必须使用完全相同的密钥进行签名。
我可以从原始 APK 中提取原始签名密钥吗?
没有。这不可能。 APK 只包含公共信息,不包含您的私钥信息。
我可以迁移到新的签名密钥吗?
没有。即使您确实找到了原始版本,也不能使用密钥 A 签署 APK,然后使用密钥 A 和 B 签署下一个更新,然后仅使用密钥 B 签署之后的下一个更新。
使用多个密钥签署一个 APK(或任何 JAR 文件)技术上是可行的,但 Google Play 不再接受具有多个签名的 APK。
尝试这样做会导致消息“您的 APK 已使用多个证书签名。请仅使用一个证书对其进行签名并重新上传。”
我能做什么?
您必须使用新的应用程序 ID 构建您的应用程序(例如,从“com.example.myapp”更改为“com.example.myapp2”)并在 Google Play 上创建一个全新的列表。
您可能还必须更改代码,以便人们可以安装新应用,即使他们安装了旧应用,例如您需要确保没有冲突的内容提供者。
您将失去现有的安装基础、评论等,并且必须想办法让现有客户卸载旧应用并安装新版本。
再次确保您拥有用于此版本的密钥库和密码的安全备份。