【发布时间】:2011-02-23 09:29:06
【问题描述】:
当我签署 apk 时,我收到“jarsigner:无法签署 jar:java.util.zip.ZipException:无效条目压缩大小(预期为 463 但得到 465 字节)”此错误消息。 apk 大小几乎为 1MB。当我将大小减小到 500KB 时,签名成功。为什么会这样?..有什么想法吗?
【问题讨论】:
-
有时会在您尝试签署调试 apk 时发生
标签: android
当我签署 apk 时,我收到“jarsigner:无法签署 jar:java.util.zip.ZipException:无效条目压缩大小(预期为 463 但得到 465 字节)”此错误消息。 apk 大小几乎为 1MB。当我将大小减小到 500KB 时,签名成功。为什么会这样?..有什么想法吗?
【问题讨论】:
标签: android
您正在尝试签署已签署的.apk。
你需要导出一个未签名的.apk文件,然后用jarsigner签名。
【讨论】:
你肯定是able to sign an already signed APK multiple times using different keys:
请注意,您可以使用不同的密钥多次签署一个 APK。
例如我使用发布密钥完成了对 Debug-Apk 的签名,以便能够测试已发布版本的升级。此外,我能够使用调试密钥签署已发布的 APK 以重现错误。
这是你应该做的
.apk 文件重命名为.zip
.zip文件并删除META-INF文件夹.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。
【讨论】:
这是上面@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
【讨论】:
META-INF 中有很多androidx.*,所以一定要一一删除这三个文件。
我在签署 .aab 文件时遇到了这个问题。删除重复签名(一次作为捆绑的一部分,一次手动)修复它。这是默认的 react-native 应用脚手架的一部分。
app/build.gradle 文件包含一个部分 android/buildTypes/release,该部分具有其 signingConfig 键集。在生成 .apk 文件时,它似乎被忽略了,但在切换到 .aab 格式时,它看起来确实应用了该签名。然后当我自己在 CI 中签名时,它会抱怨,因为它已经签名了。
【讨论】:
根据 google 的文档,您可以多次签署 apk http://developer.android.com/guide/publishing/app-signing.html#signapp。如果您无法获得未签名的构建,尽管您可以将 apk 膨胀然后重新打包,然后您就可以对其进行签名。
【讨论】:
就我遇到此错误而言,它发生在您尝试签署 zipaligned .apk 文件时。
看起来 jarsigner 无法忍受一些 zipalign 更改。
这种情况并不经常发生。
【讨论】: