This question already has answers here:
The apk must be signed with the same certificates as the previous version

(11个答案)


已关闭6年。




我正在使用Android Studio来构建我的Android项目,并且当我将APK上传到Google Play时,尽管我使用了与早期版本的应用相同的 key 存储区,但它仍向我显示此错误:

最佳答案

首先,这里的Google Play不太可能出错。您确定没有误使用调试 key 吗?

检查使用的签名 key

您应该使用以下命令仔细检查旧APK和新APK包含哪些证书:

jarsigner -verify -verbose:summary -certs old.apk
jarsigner -verify -verbose:summary -certs new.apk

这将显示有关在每个APK中签名的文件的信息,如下所示:
sm  4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)

    X.509, CN=My App, O=My Company, C=DE, L=Köln
    [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]

如果新的APK表示为X.509, CN=Android Debug, O=Android, C=US,则您已使用调试 key 而不是原始发行 key 对APK进行了签名。

如果X.509身份字符串在其他方面不同,或者两个APK之间的证书日期不同,则您刚刚确认已对两个APK使用而不是使用相同的签名 key 。

您可以忽略任何“CertPath not validated”消息。在这种情况下无关紧要。

搜索原始 keystore

如果证书信息不同,则需要查找原始 keystore ,即Google Play告诉您的具有第一个SHA1值的文件。

搜索所有可以找到的 keystore 文件,直到获得具有正确SHA1指纹的 keystore 文件为止:
keytool -list -keystore my-release.keystore

我找不到原始的 keystore

如果找不到原始 keystore ,则永远不会能够发布对此特定应用程序的任何更新。

Android在Signing Your Application页面上明确提到了这一点:



在首次发布APK之后,必须使用完全相同的 key 对所有后续版本进行签名。

我可以从原始APK中提取原始签名 key 吗?

不行。这是不可能的。 APK仅包含公共(public)信息,而不包含您的私钥信息。

我可以迁移到新的签名 key 吗?

不会。即使您找到原始文件,也无法使用键A签署APK,然后使用键A和B签署下一个更新,然后仅用键B签署下一个更新。

从技术上讲,可以使用多个 key 对APK(或任何JAR文件)进行签名,但是Google Play不接受具有多个签名的APK。

我能做些什么?

您将必须使用新的应用程序ID(例如,从“com.example.myapp”更改为“com.example.myapp2”)构建您的应用程序,然后在Google Play上创建一个全新的列表。

可能还需要更改代码,以便人们即使安装了旧应用程序也可以安装新应用程序,例如您需要确保没有冲突的内容提供商。

您将失去现有的安装基础,评论等,并且将必须找到一种方法来吸引现有客户卸载旧应用程序并安装新版本。

同样,请确保您拥有用于此版本的 keystore 和密码的备份。

10-07 19:19
查看更多