jarsigner: kann nicht signiert jar: java.util.zip.ZipException: ungültige komprimierte Eintragsgröße (erwartete 463, aber 465 Byte)

78

Wenn ich die apk signiere, erhalte ich die Fehlermeldung "jarsigner: jar: java.util.zip.ZipException kann nicht signiert werden: ungültiger Eintrag komprimierte Größe (erwartete 463, aber 465 Bytes)". Die apk Größe beträgt fast 1MB. Wenn ich die Größe auf 500 KB reduziere, ist das Signieren erfolgreich. Warum das so? .. Irgendeine Idee?

indira
quelle
5
Manchmal passiert es, wenn Sie versuchen, eine Debug-Apk zu unterzeichnen
Midhun KM

Antworten:

105

Sie versuchen, eine bereits signierte zu unterschreiben .apk. Sie müssen eine nicht signierte .apkDatei exportieren und dann mit signieren jarsigner.

Ouael
quelle
Fehler im POM - tatsächlich wurde die Datei zweimal signiert.
Martin
13
Oder Sie können die Signatur einfach mit einem einzigen Befehl aus der vorhandenen apk entfernen. Siehe: stackoverflow.com/a/30722523/117471
Bruno Bronosky
Ich bin wirklich enttäuscht, dass dies auch 2 Jahre nach der tatsächlichen Lösung die akzeptierte Antwort ist.
Bruno Bronosky
Hatte das gleiche. Denken Sie beim Entfernen der vorhandenen Signatur daran, auch die Signatureinträge aus der MANIFEST.MF-Datei zu entfernen.
Krzysztof Jabłoński
Diese Antwort ist jedoch immer noch gut, da sie Informationen darüber enthält, warum dies geschieht. Dies ist hilfreich bei der Fehlerbehebung bei verschiedenen Anwendungsfällen. Zum Beispiel war mein Problem mit AppCenter, das mich tatsächlich warnte, dass ich versuchte, ein signiertes Paket zurückzutreten, also musste ich die signingConfig von meinem build.gradle entfernen ... Pferde für Kurse und all das!
Matt Fletcher
106

Sie können eine bereits signierte apk definitiv mehrmals mit verschiedenen Schlüsseln signieren :

Beachten Sie, dass Sie eine APK mehrmals mit verschiedenen Schlüsseln signieren können.

ZB habe ich es geschafft, eine Debug-Apk mit dem Release-Schlüssel zu signieren, damit ich Upgrades der veröffentlichten Versionen testen konnte. Außerdem konnte ich eine bereits veröffentlichte apk mit dem Debug-Schlüssel zum Reproduzieren von Fehlern signieren.

Das sollten Sie tun

  1. Benennen Sie die .apkDatei in um.zip
  2. Entpacken Sie die .zipDatei und entfernen Sie den META-INFOrdner
  3. Zippen Sie den Ordner erneut und benennen Sie ihn in um .apk
  4. Unterschreiben Sie die apk:
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \
              -keystore my-release-key.keystore my_application.apk alias_name

Für den Debug-Schlüssel sollte der Alias androiddebugkeyund das Kennwort sein android. Der Debug-Keystore ist standardmäßig $HOME/.android/debug.keystore. Siehe auch Anmelden im Debug-Modus .

Jörg
quelle
Sie retten meinen Tag und möglicherweise auch meine Apps! Eclipse stürzt jedes Mal ab, wenn ich versuche, meine Apps zu exportieren. Signiert oder nicht. Der einzige Weg für mich war die Befehlszeile. Dann hatte ich diesen Fehler, die einzige Lösung, die funktionierte!
Guillaume
@ Guillaume, um einen Absturz der Sonnenfinsternis zu vermeiden - deaktivieren Sie "Automatisch erstellen" (Projekt-> Automatisch erstellen)
Luten
Die CERT.RSA-Datei, die die Signatur enthält, wird im META-INF-Ordner gespeichert, den Sie entfernen möchten. Dies entspricht in der Tat dem Entfernen der Signatur. Deshalb können Sie es mit dem Debug-Schlüssel signieren. Das bedeutet also nicht, dass Sie die apk mit zwei verschiedenen Schlüsseln signiert haben.
Rajesh
Ich habe die apk erfolgreich signiert, aber bei der Installation der App wird der folgende Fehler angezeigt: "Fehler - Beim Parsen des Pakets ist ein Problem aufgetreten." Was könnte das Problem sein, bitte helfen Sie ..
KK_07k11A0585
2
Für die Aufzeichnung hat diese Methode für mich nicht funktioniert, auch nach dem Löschen des META-INF-Ordners erhalte ich immer noch die ZipException
Sterling Archer
54

Dies ist die 1 Liner / 1 Step- Version der obigen Antwort von @ Joerg:

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

Dabei wird die integrierte Funktion "Aus vorhandenem Archiv löschen" des zipBefehls verwendet. Wenn Sie diesen Befehl ausführen, sollten Sie Folgendes sehen:

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

... als Ausgabe. Diese Dateien sind die vorhandene Signatur. Wenn Sie sie entfernen, können Sie sie erneut unterschreiben.

Ich möchte auch wiederholen, dass Sie sicher sein sollten, die Argumente -sigalg SHA1withRSAund -digestalg SHA1an jarsignerzu übergeben, um dieses Problem zu vermeiden: https://code.google.com/p/android/issues/detail?id=19567

Bruno Bronosky
quelle
Seien Sie vorsichtig mit zip -d foo.apk META-INF / * - es kann mehr Dateien als nötig löschen.
Danny Schoemann
@DannySchoemann Was bedeutet das? Ich sehe 3 Dateien in META-INF / gdata / species / com.google.schemas.contact.2008 und META-INF / services / com.fasterxml.jackson.core.JsonFactory. Bin ich also sicher, wenn nur die Manifest- und Zertifizierungsdateien entfernt werden?
Kaay
@ kaay- Das sieht richtig aus, aber ich weiß nicht genau, du musst vielleicht experimentieren, was du löschen musst.
Danny Schoemann
3

Soweit ich auf diesen Fehler gestoßen bin, tritt er auf, wenn Sie versuchen, eine zipaligned .apk-Datei zu signieren.
Es sieht so aus, als ob Jarsigner einige der Zipalign-Änderungen nicht ertragen kann. Dies kommt nicht oft vor.

Lauten
quelle
Das Zipalignieren eines apk verhindert nicht, dass es signiert wird. Sie müssen zipalign nach dem Signieren erneut ausführen, um es wieder in einen ausgerichteten Zustand zu versetzen.
dmdrummond
3
@dmdrummond Es verhindert nicht, aber es sollte. Durch Ausrichten wird der Reißverschluss geändert. Beim Signieren kann die ausgerichtete Zip-Datei mit diesem Fehler manchmal nicht signiert werden. Warum abstimmen?
Luten
Sie haben jetzt die Bedeutung Ihrer Antwort geändert. Ihre vorherige Antwort deutete stark darauf hin, dass es nicht möglich war, eine zip-ausgerichtete Datei zu signieren. Das war falsch
dmdrummond
@dmdrummond, nein, hat es nicht. Sie können die Preedit-Version ( stackoverflow.com/posts/13026461/revisions )
Luten