jarsigner:无法签名jar:java.util.zip.ZipException:无效input压缩大小(预计463但得到465字节)

当我签署的apk,我得到“jarsigner:无法签署jar:java.util.zip.ZipException:无效input压缩大小(预计463但得到465字节)”这个错误消息。 apk的大小差不多是1MB。 当我缩小到500KB时,签名成功。 为什么这样?任何想法?

您正在尝试签署已签名的.apk 。 您需要导出一个未签名的.apk文件,然后用jarsigner对其进行签名。

你绝对可以使用不同的密钥多次签名一个已经签名的apk :

请注意,您可以使用不同的密钥多次对APK进行签名。

例如,我完成了与释放键签署一个Debug-Apk,以便我能够testing发行版本的升级。 此外,我能够签署一个已经发布的apk与debugging密钥重现错误。

这是你应该做的

  1. .apk文件重命名为.zip
  2. 解压缩.zip文件并删除META-INF文件夹
  3. 再次压缩文件夹并将其重命名为.apk
  4. 签署apk:
  jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \ -keystore my-release-key.keystore my_application.apk alias_name 

对于debugging密钥,别名应该是androiddebugkey和密码android 。 debugging密钥库是默认的$HOME/.android/debug.keystore 。 另请参阅logindebugging模式 。

这是@ Joerg上面的答案的1class/ 1步版本:

 zip -d foo.apk META-INF/\* 

它使用zip命令中内置的“从现有存档中删除”function。 当你运行这个命令时你应该看到:

 deleting: META-INF/MANIFEST.MF deleting: META-INF/CERT.SF deleting: META-INF/CERT.RSA 

作为输出。 这些文件是现有的签名。 删除它们可以让你再次签名。

我还想重申一下,您应该确保将-sigalg SHA1withRSA-digestalg SHA1parameter passing给jarsigner以避免此问题: https : //code.google.com/p/android/issues/detail? -digestalg SHA1 = 19567

根据谷歌文件,你可以多次签署一个apk http://developer.android.com/guide/publishing/app-signing.html#signapp 。 如果你无法获得一个未签名的版本,虽然你可以只是膨胀apk然后重新生成它,那么你将能够签署它。

至于我遇到这个错误,当你尝试签署一个zipaligned .apk文件时就会发生这种错误。
看起来像jarsigner无法忍受一些zipalign变化。 这不经常发生。