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

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

Ответ 1

Вы пытаетесь подписать уже подписанный .apk. Вам нужно экспортировать файл unsigned .apk, а затем подписать его с помощью jarsigner.

Ответ 2

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

Обратите внимание, что вы можете подписывать APK несколько раз с помощью разных клавиш.

например. Я выполнил подписание Debug-Apk с ключом release, чтобы я смог протестировать обновления выпущенных версий. Кроме того, я смог подписать уже выпущенный apk с отладочным ключом для воспроизведения ошибок.

Это то, что вы должны делать

  • Переименуйте файл .apk в .zip
  • Распакуйте файл .zip и удалите папку META-INF
  • Замените папку еще раз и переименуйте ее в .apk
  • Подпишите apk:
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \
              -keystore my-release-key.keystore my_application.apk alias_name

Для ключа отладки псевдоним должен быть androiddebugkey и пароль android. Отстойное хранилище ключей по умолчанию $HOME/.android/debug.keystore. См. Также Включение режима отладки.

Ответ 3

Это версия 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

Ответ 4

В соответствии с документами googles вы можете подписать apk несколько раз http://developer.android.com/guide/publishing/app-signing.html#signapp. Если вы не можете получить неподписанную сборку, хотя вы можете просто надуть apk, а затем rejar it, вы сможете ее подписать.

Ответ 5

Насколько я столкнулся с этой ошибкой, это происходит, когда вы пытаетесь подписать zipaligned.apk файл.
Похоже, что jarsigner не выдерживает некоторых zipalign изменений. Это часто случается.