jarsigner: не вдається підписати jar: java.util.zip.ZipException: невірний розмір стиснутого запису (очікується 463, але отримано 465 байт)


78

коли я підписую apk, я отримую "jarsigner: неможливо підписати jar: java.util.zip.ZipException: невірний розмір стиснутого запису (очікується 463, але отримано 465 байт)" це повідомлення про помилку. Розмір apk становить майже 1 Мб. Коли я зменшую розмір до 500 КБ, успіх підписання. Чому це так? .. Будь-яка ідея?



5
іноді це трапляється, коли ви намагаєтесь підписати apk для налагодження
Midhun KM

Відповіді:


105

Ви намагаєтеся підписати вже підписаний .apk. Вам потрібно експортувати непідписаний .apkфайл, а потім підписати його jarsigner.


Помилка в POM - справді файл був підписаний двічі.
Мартін

13
Або ви можете просто видалити підпис з існуючого apk за допомогою однієї команди. Див: stackoverflow.com/a/30722523/117471
Bruno Bronosky

Я справді розчарований тим, що це все ще прийнята відповідь через 2 роки після того, як було дано фактичне рішення.
Бруно Броноскі,

Мав те саме. Видаляючи існуючий підпис, не забудьте також видалити записи підпису з файлу MANIFEST.MF.
Кшиштоф Яблонський

Ця відповідь все ж хороша, оскільки вона надає інформацію про те, чому це відбувається, що корисно для усунення несправностей у різних випадках використання. Наприклад, моя проблема була з AppCenter, який насправді попередив мене про те, що я намагався подати у відставку підписаний пакет, тому мені довелося видалити з мого build.gradle signConfig ... коней на курси і все таке!
Matt Fletcher

106

Ви точно можете підписати вже підписаний apk кілька разів, використовуючи різні клавіші :

Зверніть увагу, що ви можете підписати файл .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. Див. Також Підписання в режимі налагодження .


ви врятуєте мій день, а можливо і мої додатки! Eclipse аварійно завершує роботу кожного разу, коли я намагаюся експортувати свої програми Підписано чи ні, тому єдиним способом для мене був командний рядок, і тоді у мене була ця помилка, єдине рішення, яке спрацювало! ще раз спасибі
Гійом

@Guillaume, щоб уникнути аварії затемнення - вимкніть "Побудувати автоматично" (Проект-> Побудувати автоматично)
Лютень

Файл CERT.RSA, що містить підпис, зберігається в папці META-INF, яку ви пропонуєте видалити. Що насправді те саме, що видалення підпису. Ось чому ви можете підписати його за допомогою ключа налагодження. Тож це не означає, що ви підписали apk двома різними клавішами.
Раджеш

Я успішно підписав apk, але при встановленні програми з’являється помилка нижче "помилка - виникла проблема синтаксичного аналізу пакета" У чому може бути проблема, будь ласка, допоможіть ..
KK_07k11A0585

2
На протокол, цей метод у мене не спрацював, навіть після видалення папки META-INF я все одно отримую ZipException
Sterling Archer

54

Це версія 1 Liner / 1 Step відповіді @ Joerg вище:

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 / * - він може видалити більше файлів, ніж потрібно.
Danny Schoemann

@DannySchoemann Що означає? Я бачу 3 файли в META-INF / gdata / kind / com.google.schemas.contact.2008 та META-INF / services / com.fasterxml.jackson.core.JsonFactory. Тож чи буду я в безпеці, якщо видалятимуться лише файли маніфесту та сертифіката?
kaay

@ kaay - Це виглядає правильно, але я точно не знаю, можливо, доведеться експериментувати, яке потрібно видалити.
Danny Schoemann,

3

Згідно з документами googles, ви можете підписати apk кілька разів http://developer.android.com/guide/publishing/app-signing.html#signapp . Якщо вам не вдається отримати непідписану збірку, хоча ви можете просто надути apk, а потім повторно запустити його, ви зможете підписати його.


3

Наскільки я зіткнувся з цією помилкою, вона виникає, коли ви намагаєтеся підписати файл .apk зі зрівняльним zipaligned.
Схоже, що ярсигнер не витримує деяких змін zipalign. Це трапляється не часто.


Zipaligning apk не заважає його підписувати. Вам доведеться знову запустити zipalign після підписання, щоб повернути його у вирівняний стан.
dmdrummond

3
@dmdrummond Це не заважає, але має. Вирівнювання змінює zip. Підписання іноді не дає змоги підписати вирівняний zip-файл із цією помилкою. Чому проти?
Лютен

Тепер ви змінили значення своєї відповіді. Ваша попередня відповідь настійно наводила на думку, що неможливо підписати файл, вирівняний за архівом. Це було неправильно.
dmdrummond

@dmdrummond, Ні, ні. Ви можете перечитати preedit версію ( stackoverflow.com/posts/13026461/revisions )
Лютні

0

Я зіткнувся з цим, підписуючи свій файл .aab. Видалення дубліката підпису (один раз як частина зв’язку, один раз вручну) виправило це. Це було частиною замовчувального реагування на рідне додаток для реагування.

app/build.gradleФайл включає в себе розділ , android/buildTypes/releaseякий мав свій signingConfigнабір ключів. При генерації .apk файли, які, здавалося, ігнорували , але при перемиканні на .aab формат, схоже , це було застосувати це підписання. Коли я тоді власноруч підписував у CI, він скаржився, бо вже був підписаний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.