2011-02-23 44 views
62

當我簽署apk時,我得到「jarsigner:無法簽名jar:java.util .zip.ZipException:無效輸入壓縮大小(預期463但得到465字節)「此錯誤消息。 apk的大小差不多是1MB。當我縮小到500KB時,簽署成功。爲什麼這樣?任何想法?jarsigner:無法簽名jar:java.util.zip.ZipException:無效輸入壓縮大小(預計463但得到465字節)

+0

http://stackoverflow.com/questions/3267216/can-i-使用 – kreker 2016-01-18 00:07:09

+3

重新簽署一個不同於證書的文件,但它有時會發生在您嘗試簽署調試apk時 – KrIsHnA 2016-04-03 16:33:52

回答

84

您正在嘗試簽署已經簽署的.apk。 您需要導出未簽名的.apk文件,然後使用jarsigner對其進行簽名。

+0

POM中的錯誤 - 實際上該文件被簽署了兩次。 – Martin 2013-06-21 11:58:20

+8

或者您可以使用單個命令從現有的apk中移除簽名。請參閱:http://stackoverflow.com/a/30722523/117471 – 2015-06-09 03:30:10

+0

我真的很失望,這仍然是一個實際的解決方案後2年被接受的答案。 – 2017-09-06 15:00:34

98

你肯定是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。另見Signing in Debug Mode

+0

你節省了我的一天,並可能我的應用程序!每次嘗試導出我的應用程序時,Eclipse都崩潰了,所以唯一的辦法就是命令行,然後我有這個錯誤,只有解決方案有效!再次感謝 – Guillaume 2012-06-12 07:05:39

+0

@Guillaume,避免日食崩潰 - 關閉「自動生成」(項目 - >自動生成) – Luten 2014-08-04 09:08:34

+0

持有簽名的CERT.RSA文件存儲在您建議刪除的META-INF文件夾中。這實際上與刪除簽名相同。所以這就是爲什麼您可以使用調試密鑰對其進行簽名的原因。所以這並不意味着你已經用兩個不同的密鑰簽署了apk。 – Rajesh 2014-12-26 10:29:15

3

就我所面臨的這個錯誤而言,它發生在您嘗試簽署zipaligned .apk文件時。
看起來像jarsigner無法忍受一些zipalign變化。 這不會經常發生。

+0

Zipaligning apk不會阻止它被簽名。簽名後您必須再次運行zipalign才能將其恢復到對齊狀態。 – dmdrummond 2014-07-30 19:49:01

+3

@dmdrummond它不會阻止,但它應該。對齊修改zip。簽署有時無法簽署對齊的zip與此錯誤。 爲什麼downvote? – Luten 2014-07-31 09:31:07

+0

你現在已經改變了你的答案的含義。您之前的回答強烈建議您無法簽署一個zip對齊的文件。這是不正確的。 – dmdrummond 2014-08-05 10:11:26

41

這是1班輪/ 1檔版@約爾格的回答以上:

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

+0

請小心使用_zip -d foo.apk META-INF/\ * _ - 它可以刪除比需要更多的文件。 – 2016-07-20 09:53:54

+0

@DannySchoemann含義是什麼?我在* META-INF/gdata/kinds/com.google.schemas.contact.2008 *和 META-INF/services/com.fasterxml.jackson.core.JsonFactory中看到3個文件。所以如果只有清單和證書文件被刪除,我會安全嗎? – kaay 2016-10-05 08:55:31

+0

@ kaay-看起來不錯,但我不確定,你可能需要試驗一下你需要刪除的東西。 – 2016-10-06 11:45:47