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

时间:2011-02-23 09:29:06

标签: android

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

6 个答案:

答案 0 :(得分:104)

你肯定是able to sign an already signed apk multiple times using different keys

  

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

E.g。我完成了使用发布密钥签署Debug-Apk,以便我能够测试已发布版本的升级。此外,我能够使用调试密钥对已经发布的apk进行签名以再现错误。

这是你应该做的

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

    对于调试密钥,别名应为androiddebugkey,密码为android。调试密钥库默认为$HOME/.android/debug.keystore。另请参阅Signing in Debug Mode

答案 1 :(得分:94)

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

答案 2 :(得分:49)

这是@ Joerg上述答案的 1 Liner / 1 Step 版本:

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

使用内置"从现有档案中删除" zip命令的功能。当您运行该命令时,您应该看到:

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

...作为输出。这些文件是现有的签名。删除它们允许您再次签名。

我还想重申,您应该确保将-sigalg SHA1withRSA-digestalg SHA1个参数传递给jarsigner以避免此问题:https://code.google.com/p/android/issues/detail?id=19567

答案 3 :(得分:4)

我在签署我的 .aab 文件时遇到了这个问题。删除重复签名(一次作为捆绑的一部分,一次手动)修复了它。这是默认的 react-native 应用脚手架的一部分。

app/build.gradle 文件包含一个 android/buildTypes/release 部分,该部分设置了 signingConfig 键。生成 .apk 文件时,它似乎被忽略了,但是当切换到 .aab 格式时,它看起来确实应用了该签名。当我在 CI 中进行自己的签名时,它抱怨说它已经被签名了。

答案 4 :(得分:3)

根据googles文档,您可以多次签署apk http://developer.android.com/guide/publishing/app-signing.html#signapp。如果你无法获得一个未签名的版本,虽然你可以通过膨胀apk然后重新加入它,然后你就可以签名了。

答案 5 :(得分:3)

就我遇到此错误而言,当您尝试签署zipaligned .apk文件时会发生此错误 看起来像jarsigner不能忍受一些zipalign的变化。 这种情况不会经常发生。