您是否错误地使用了调试密钥签名?
Google Play不允许您发布使用调试密钥库签名的应用。如果您尝试上传这样的APK,则Google Play将失败,并显示消息“您上传了在调试模式下签名的APK。您需要在发布模式下对APK进行签名”。
但是,如果您尝试上传使用调试密钥库签名的更新,则将不会看到此消息。Google Play将显示有关SHA1指纹的问题中显示的消息。
因此,首先,请检查是否使用错误的调试密钥对应用程序进行了签名。
如何检查使用了哪些签名密钥?
从APK收集信息
您可以使用Java使用以下命令检查原始APK和更新APK签署了哪些证书keytool
:
keytool -list -printcert -jarfile original.apk
keytool -list -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指纹值,所有者身份值和有效期自/直到日期。
如果该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 not validated”消息,以及有关证书链或时间戳的警告;在这种情况下,它们无关紧要。
比较APK之间的Owner,SHA1和Expiry值
如果Owner / X.509身份值为CN=Android Debug, O=Android, C=US
,则您已使用调试密钥(而非原始发行密钥)对APK进行了签名。
如果 SHA1指纹值是原始和更新的APK不同,那么你根本没有使用两个的APK相同的签名密钥
如果业主 / X.509标识值是不同的,或证书失效日期两个之间的APK不同,那么你是不是使用两个的APK相同的签名密钥
请注意,即使两个证书之间的Owner / X.509值相同,也不意味着证书是相同的-如果其他任何不匹配的内容(例如指纹值),则证书也将不同。
搜索原始密钥库,检查备份
如果两个APK的证书信息不同,则必须找到原始密钥库,即Google Play(或keytool
)告诉您的具有第一个SHA1指纹值的文件。
搜索您可以在计算机上找到的所有密钥库文件以及所有备份中的密钥库文件,直到拥有具有正确SHA1指纹的密钥库文件为止:
keytool -list -keystore my-release.keystore
只需按Enter提示输入密码即可,如果您只是想快速检查SHA1值,则不必输入密码。
我在任何地方都找不到原始的密钥库
如果找不到原始密钥库,则永远不会无法发布对此特定应用程序的任何更新。
Android在“ 签名您的应用程序”页面上明确提到了这一点:
警告:将您的密钥库和私钥保存在安全的地方,并确保您具有安全的备份。如果您将某个应用发布到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上创建一个全新的列表。
可能还需要更改代码,以便人们即使安装了旧应用程序也可以安装新应用程序,例如,您需要确保没有冲突的内容提供者。
您将失去现有的安装基础,评论等,并且将必须找到一种方法来吸引现有客户卸载旧应用程序并安装新版本。
再次,确保您拥有用于此版本的密钥库和密码的安全备份。