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

ind*_*ira 76 android

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

Jör*_*örg 105

您绝对可以使用不同的密钥多次签署已签名的apk:

请注意,您可以使用不同的密钥多次签署APK.

例如,我完成了使用发布密钥签署Debug-Apk,以便我能够测试已发布版本的升级.此外,我能够使用调试密钥签署已发布的apk以再现错误.

这是你应该做的

  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
Run Code Online (Sandbox Code Playgroud)

对于调试密钥,别名应该是androiddebugkey密码android.调试密钥库是默认的$HOME/.android/debug.keystore.另请参阅在调试模式下登录.

  • 对于记录,这个方法对我来说不起作用,即使在删除META-INF文件夹后我仍然得到ZipException (2认同)

小智 100

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

  • 或者您可以使用单个命令从现有apk中删除签名.请参阅:http://stackoverflow.com/a/30722523/117471 (11认同)

Bru*_*sky 51

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

zip -d foo.apk META-INF/\*
Run Code Online (Sandbox Code Playgroud)

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

deleting: META-INF/MANIFEST.MF
deleting: META-INF/CERT.SF
deleting: META-INF/CERT.RSA
Run Code Online (Sandbox Code Playgroud)

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

我还想重申一下,你应该确保通过-sigalg SHA1withRSA-digestalg SHA1论证jarsigner来避免这个问题:https://code.google.com/p/android/issues/detail?id = 19567


Jer*_*vel 7

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

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