jarsigner: no se puede firmar jar: java.util.zip.ZipException: tamaño comprimido de entrada no válida (se esperaba 463 pero obtuvo 465 bytes)

78

cuando estoy firmando el apk, aparece "jarsigner: no puedo firmar jar: java.util.zip.ZipException: entrada inválida tamaño comprimido (se esperaba 463 pero obtuve 465 bytes)" este mensaje de error. El tamaño de la apk es de casi 1 MB. Cuando reduzco el tamaño a 500 KB, firma con éxito. ¿Por qué esto así? ... ¿Alguna idea?

indira
fuente
5
en algún momento sucede cuando intentas firmar una apk de depuración
Midhun KM

Respuestas:

105

Estás intentando firmar un .apk. Necesita exportar un .apkarchivo sin firmar y luego firmarlo con jarsigner.

Ouael
fuente
Error en el POM: de hecho, el archivo se firmó dos veces.
Martin
13
O simplemente puede eliminar la firma del apk existente con un solo comando. Ver: stackoverflow.com/a/30722523/117471
Bruno Bronosky
Estoy realmente decepcionado de que esta siga siendo la respuesta aceptada 2 años después de que se dio una solución real.
Bruno Bronosky
Tenía lo mismo. Cuando elimine la firma existente, recuerde eliminar también las entradas de firma del archivo MANIFEST.MF.
Krzysztof Jabłoński
Sin embargo, esta respuesta sigue siendo buena porque brinda información sobre por qué está sucediendo, lo que es útil para solucionar problemas en diferentes casos de uso. Por ejemplo, mi problema fue con AppCenter, que de hecho me advirtió que estaba intentando renunciar a un paquete firmado, así que tuve que eliminar el signingConfig de mi build.gradle ... ¡caballos para cursos y todo eso!
Matt Fletcher
106

Definitivamente puede firmar un apk ya firmado varias veces usando diferentes claves :

Tenga en cuenta que puede firmar un APK varias veces con diferentes claves.

Por ejemplo, logré firmar un Debug-Apk con la clave de lanzamiento para poder probar las actualizaciones de las versiones publicadas. Además, pude firmar un apk ya publicado con la clave de depuración para reproducir errores.

Esto es lo que debes hacer

  1. Cambiar el nombre del .apkarchivo a.zip
  2. Desempaquete el .ziparchivo y elimine la META-INFcarpeta
  3. Comprima la carpeta nuevamente y cámbiele el nombre a .apk
  4. Firma el apk:
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \
              -keystore my-release-key.keystore my_application.apk alias_name

Para la clave de depuración, el alias debe ser androiddebugkeyy la contraseña android. El almacén de claves de depuración es predeterminado $HOME/.android/debug.keystore. Consulte también Iniciar sesión en modo de depuración .

Jörg
fuente
¡Me salvas el día y posiblemente también mis aplicaciones! Eclipse se bloquea cada vez que intento exportar mis aplicaciones Firmado o no, así que la única forma de hacerlo era la línea de comandos y luego tuve este error, ¡la única solución que funcionó! gracias de nuevo
Guillaume
@Guillaume, para evitar que el eclipse se bloquee, desactive "Construir automáticamente" (Proyecto-> Construir automáticamente)
Luten
El archivo CERT.RSA que contiene la firma se almacena en la carpeta META-INF que está sugiriendo eliminar. Lo que en efecto es lo mismo que quitar la firma. Por eso es que puede firmarlo con la clave de depuración. Por lo tanto, no significa que haya firmado el apk con dos claves diferentes.
Rajesh
He firmado la aplicación correctamente, pero aparece el siguiente error al instalar la aplicación "error: hay un problema al analizar el paquete". ¿Cuál podría ser el problema? Por favor ayude ...
KK_07k11A0585
2
Para que conste, este método no funcionó para mí, incluso después de eliminar la carpeta META-INF, todavía obtengo la ZipException
Sterling Archer
54

Esta es la versión de 1 línea / 1 paso de la respuesta de @ Joerg anterior:

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

Eso usa la funcionalidad incorporada de "eliminar del archivo existente" del zipcomando. Cuando ejecuta ese comando, debería ver:

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

... como salida. Esos archivos son la firma existente. Eliminarlos le permite volver a firmarlo.

También me gustaría reiterar que debe asegurarse de pasar los argumentos -sigalg SHA1withRSAy -digestalg SHA1al jarsignerpara evitar este problema: https://code.google.com/p/android/issues/detail?id=19567

Bruno Bronosky
fuente
Tenga cuidado con zip -d foo.apk META-INF / * : puede eliminar más archivos de los necesarios.
Danny Schoemann
@DannySchoemann ¿Qué significa? Veo 3 archivos en META-INF / gdata / types / com.google.schemas.contact.2008 y META-INF / services / com.fasterxml.jackson.core.JsonFactory. Entonces, ¿estaré seguro si solo se eliminan los archivos de manifiesto y certificado?
Kaay
@ kaay- Parece correcto, pero no lo sé con certeza, es posible que tengas que experimentar lo que necesitas eliminar.
Danny Schoemann
3

Por lo que me enfrenté a este error, ocurre cuando intenta firmar un archivo .apk alineado con zipa.
Parece que jarsigner no puede soportar algunos de los cambios de zipalign. Esto no ocurre con frecuencia.

Luten
fuente
Zipaligning un apk no impide que se firme. Tendrá que ejecutar zipalign nuevamente después de firmar para que vuelva a estar alineado.
dmdrummond
3
@dmdrummond No previene, pero debería. La alineación modifica el zip. La firma a veces no logra firmar el zip alineado con este error. ¿Por qué votar en contra?
Luten
Ahora ha cambiado el significado de su respuesta. Su respuesta anterior sugirió enfáticamente que no era posible firmar un archivo alineado con zip. Eso fue incorrecto.
dmdrummond
@dmdrummond, No, no fue así. Puede volver a leer la versión previa a la edición ( stackoverflow.com/posts/13026461/revisions )
Luten
0

Encontré esto al firmar mi archivo .aab. La eliminación de la firma duplicada (una vez como parte de la agrupación, una vez manualmente) la solucionó. Esto fue parte del andamio predeterminado de la aplicación nativa de reacción.

El app/build.gradlearchivo incluye una sección android/buildTypes/releaseque tenía su signingConfigclave establecida. Al generar archivos apk parecía ser ignorado, pero cuando se cambia a formato .aab parece que hizo aplicar esa firma. Cuando hice mi propia firma en CI, se quejó porque ya estaba firmada.

Jeroen Vannevel
fuente