【问题标题】:jarsigner: unable to sign jar: java.util.zip.ZipException: invalid entry compressed size (expected 463 but got 465 bytes)jarsigner:无法签名 jar:java.util.zip.ZipException:无效的条目压缩大小(预期为 463,但得到了 465 字节)
【发布时间】:2011-02-23 09:29:06
【问题描述】:

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

【问题讨论】:

标签: android


【解决方案1】:

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

【讨论】:

  • POM 中的错误 — 确实该文件被签名了两次。
  • 或者您可以使用单个命令从现有 apk 中删除签名。见:stackoverflow.com/a/30722523/117471
  • 在给出实际解决方案 2 年后,这仍然是公认的答案,我真的很失望。
  • 也一样。删除现有签名时,请记住也从 MANIFEST.MF 文件中删除签名条目。
  • 这个答案仍然很好,因为它提供了关于它发生的为什么的信息,这有助于解决不同的用例。例如,我的问题是 AppCenter,它实际上警告我我正在尝试为已签名的包签名,所以我不得不从我的 build.gradle 中删除 signingConfig ... 课程马匹等等!
【解决方案2】:

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

请注意,您可以使用不同的密钥多次签署一个 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

对于调试密钥,别名应为androiddebugkey,密码为android。调试密钥库默认为$HOME/.android/debug.keystore。另见Sign your debug build

【讨论】:

  • 你拯救了我的一天,可能还有我的应用程序!每次我尝试导出我的应用程序签名与否时,Eclipse 都会崩溃,所以对我来说唯一的方法是命令行,然后我遇到了这个错误,唯一有效的解决方案!再次感谢
  • @Guillaume,为避免 Eclipse 崩溃 - 关闭“自动构建”(项目->自动构建)
  • 保存签名的 CERT.RSA 文件存储在您建议删除的 META-INF 文件夹中。这实际上与删除签名相同。这就是为什么您可以使用调试密钥对其进行签名的原因。所以这并不意味着您已经使用两个不同的密钥对 apk 进行了签名。
  • 我已成功签署 apk,但在安装应用程序时出现以下错误“错误 - 解析包时出现问题”。可能是什么问题请帮忙..
  • 作为记录,这个方法对我不起作用,即使删除 META-INF 文件夹后我仍然得到 ZipException
【解决方案3】:

这是上面@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

【讨论】:

  • 小心 zip -d foo.apk META-INF/* - 它可以删除比需要更多的文件。
  • @DannySchoemann 是什么意思?我在 META-INF/gdata/kinds/com.google.schemas.contact.2008 和 META-INF/services/com.fasterxml.jackson.core.JsonFactory 中看到 3 个文件。那么,如果只删除清单和证书文件,我会安全吗?
  • @kaay- 看起来不错,但我不确定,您可能需要尝试删除哪些内容。
  • 我的META-INF 中有很多androidx.*,所以一定要一一删除这三个文件。
  • 尝试此操作后,我收到此错误警告:签名者的证书是自签名的。有什么想法吗?
【解决方案4】:

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

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

【讨论】:

  • 伟大的观察!在尝试通过 CI 发布捆绑包时,我被困在了这个问题上。谢谢。
  • 向您的先生致敬!对于那些跟随的人,您需要注释掉发布下的“signingConfig signingConfigs.debug”行或设置您自己的。
  • 为了进一步补充这一点,这里是 React Native 文档,它指定了您需要做什么。 link
  • 你一定在北方,因为你是明星!
  • 优秀的人。我无法猜到很多年了
【解决方案5】:

根据 google 的文档,您可以多次签署 apk http://developer.android.com/guide/publishing/app-signing.html#signapp。如果您无法获得未签名的构建,尽管您可以将 apk 膨胀然后重新打包,然后您就可以对其进行签名。

【讨论】:

    【解决方案6】:

    就我遇到此错误而言,它发生在您尝试签署 zipaligned .apk 文件时。
    看起来 jarsigner 无法忍受一些 zipalign 更改。 这种情况并不经常发生。

    【讨论】:

    • 压缩对齐 apk 并不会阻止它被签名。您必须在签名后再次运行 zipalign 以使其恢复对齐状态。
    • @dmdrummond 它不会阻止,但应该阻止。对齐会修改 zip。签名有时无法通过此错误对对齐的 zip 进行签名。为什么要投反对票?
    • 您现在已经改变了答案的含义。您之前的回答强烈建议无法签署 zip 对齐文件。那是不正确的。
    • @dmdrummond,不,没有。您可以重新阅读预编辑版本 (stackoverflow.com/posts/13026461/revisions)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多