已发布的Android apk出现错误:“Package file was not signed correctly”

41

我最近将我的应用程序上传到安卓市场,但是在下载后由于错误而无法运行

包文件未正确签名

我最初使用eclipse发布该程序。右键单击导出,在创建密钥库之后发布,但它无法正常工作。

然后我下载了keytool和jarsigner,并使用它们来签署了一个升级版,然后将其发布。 然而,这仍然出现相同的错误。

我不知道我哪里做错了,由于无法删除该应用程序,因此无法重试,请问有谁能帮助我吗?

谢谢


嗯,我已经做了这个,但现在我却得到了一个“不兼容的更新”错误。o_0 - Artem Russakovskii
1
虽然被接受的答案可能对你的情况是正确的,但它不是唯一的。请检查Melloware所说的内容,那是解决我的问题的方法。实际上,SDK 1.7不能工作!除非有人在某个地方修复了这个问题,否则请使用旧版本。 - zmilojko
8个回答

53
你可能仍然在设备上安装了调试版本的应用,现在你下载了另一个相同的应用副本,导致出现此错误。
请完全卸载设备上的应用,然后再从市场下载它,这样应该就可以解决问题了。

1
在同一设备上不能有两个应用程序实例。如果他拥有相同版本号的调试副本,他必须先卸载它才能下载。但是,在调试版本上安装更高版本可能是罪魁祸首。 - jqpubliq
应用数据在哪里(从设置中)?在手机上?还是在电脑上? - theJerm
@mbaird 感谢您的回复 - 在谷歌上没有找到我需要的内容,但我会继续寻找。 - theJerm
手机如何识别另一个实例是同一应用程序的实例? - Omnifarious
1
查看我的答案,解决在平板电脑上开发时遇到的常见问题。https://dev59.com/TXE85IYBdhLWcg3w_Itr#19746947 - boltup_im_coding
显示剩余3条评论

23

好的,我遇到了与之前相同的问题,但是建议的解决方法都对我没用。我一直以来都是用相同的方式给我的应用签名,而且Android市场也一直都能接受它,只是用户却无法从市场上下载,出现了“未签名的包”错误。

最后发现是因为我安装了JDK7来完成另一个项目,它成了默认的JDK版本,但由于某种原因,JDK7中的keytool签名方式可能不被Android所支持。所以我重新回到了JDK 1.6.0_23并重新构建了我的应用,然后把它放到市场上,所有问题都恢复了正常。

希望这篇翻译能够帮助其他人。


我曾经遇到过同样的问题。这就是罪魁祸首(至少在我的情况下)!我想知道JDK7中有什么变化,以致于它的keytool与JDK6不兼容... - Santa
我已经添加了一个新的答案,用JDK7签署APK。 - Xavi Ivars
Melloware,我也遇到了同样的问题。我认为你提供的使用1.6重建应用程序的解决方案是完全正确的。但是我正在使用Unix系统。我该如何指定应用程序应该使用1.6版本进行构建呢?我是通过在终端上执行命令来构建应用程序的。 - Hardik Trivedi
在Unix系统中,您需要更改JAVA_HOME环境变量或在命令行中强制指定Java6。 - Melloware
1
请注意,虽然不同的签名算法有时可能是问题所在,但这并不是我的情况。1.7和1.6都使用dsaWithSHA1进行签名,但1.6可以正常工作,而1.7则不能。此外,由1.7签名的APK仅在Android 2.2上出现问题,原因不明。 - Erhannis
如果使用Java 1.7创建apk并在Android 2.2设备上运行,会出现问题。@Melloware,如果您将此提示添加到您的答案中会更好。 - Devrim

16

请注意,在平板电脑上,如果您安装了应用程序的调试版本,然后像通常一样将其卸载(将其拖到垃圾桶中直到出现“卸载”),这还不够。因为平板电脑有多个用户的可能性,您必须转到

 Settings > Apps > All

然后滚动到底部。在那里,您将看到您的应用程序。点击它,然后在操作栏(三个点)中点击菜单,然后选择卸载所有用户。然后您就可以开始使用了。


2
我曾经遇到过这种情况——在平板电脑上使用调试版本,将其放入 Play 商店的测试版中,尝试下载时出现错误。我通过设置卸载了它,但直到我按照您的指示操作后才解决了问题。谢谢! - Andrea

4

使用JDK7签名APK时会出现问题。您可以通过将以下内容添加到build.xml来解决该问题。

<presetdef name="signjar">
    <signjar sigalg="MD5withRSA" digestalg="SHA1" />
</presetdef>

Source: KIYUT Developer Blog


很抱歉,我不了解MonoDroid,不知道它是否使用标准Android项目使用的相同文件。如果我没记错,在标准的Android项目中,build.xml位于项目的根文件夹中。 - Xavi Ivars
哦,我找不到build.xml文件。我正在使用Eclipse;相当标准,对吧?其他文件中是否有对应的文件,例如project.properties、default.properties、AndroidManifest.xml或.project? - Erhannis
@theJerm 看看这个:http://forums.xamarin.com/discussion/28178/package-file-was-not-signed-correctly。这是正确的解决方案,但你必须在MonoDroid中稍微不同地使用它(我也是Xamarin开发者)。 - Ursin Brunner

4
最近,我通过命令行签署了我的apk文件,但出现了错误。通过这个链接中的说明,我成功解决了这个问题: http://developer.android.com/tools/publishing/app-signing.html
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

1

这个错误通常是因为您试图推送一个使用与您在初始提交中使用的不同密钥签名的更新。您需要找到第一次发布应用程序时使用的密钥,并使用它来签署更新。


3
你所提到的错误是上传市场时出现的错误。当他尝试运行该应用程序时,他会遇到一个错误。 - Mark B
1
在我的情况下,这是因为我不小心使用了JDK7 keytool签署我的应用程序,而市场可能不喜欢。切换回1.6 keytool后,这个问题就解决了。 - Melloware

1

0

我对Android还很陌生,但是我神奇地解决了这个问题 :D
我在我的应用程序中使用了Java 1.7,并使用命令行工具[keytool、jarsigner和zipalign]签署了我的应用程序,但是仍然出现了相同的错误。
然后我回到Eclipse并使用Android工具“导出已签名的应用程序包”,使用最初发布我的应用程序的相同密钥库获取了该APK文件;然后使用命令行对其进行了zipalign操作[顺便提一下,在清单中必须增加versioncode]。我取消发布了旧的APK并发布了这个新的APK。一旦你这样做了,不要立即测试它
不确定需要等待多长时间,但当我检查时,我的应用程序在4小时后开始正常工作 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接