jarsigner : jar에 서명 할 수 없음 : java.util.zip.ZipException : 잘못된 항목 압축 크기 (예상 된 463이지만 465 바이트를 얻음)


78

apk에 서명 할 때 "jarsigner : cannot sign jar : java.util.zip.ZipException : invalid entry compression size (expected 463 but got 465 bytes)"이 오류 메시지가 표시됩니다. APK 크기는 거의 1MB입니다. 크기를 500KB로 줄이면 서명이 성공합니다. 왜 그렇게? .. 어떤 아이디어?



5
언젠가 당신이 디버그 APK 로그인 할 때 발생
Midhun KM

답변:


105

이미 서명 된에 서명하려고합니다 .apk. 서명되지 않은 .apk파일 을 내 보낸 다음 jarsigner.


POM의 버그 — 실제로 파일이 두 번 서명되었습니다.
Martin

13
또는 단일 명령으로 기존 apk에서 서명을 제거 할 수 있습니다. 참조 : stackoverflow.com/a/30722523/117471
Bruno Bronosky 2015 년

나는 이것이 실제 해결책이 주어진 지 2 년이 지난 후에도 여전히 받아 들여지는 대답이라는 점에 정말 실망했습니다.
Bruno Bronosky

똑 같았다. 기존 서명을 제거 할 때 MANIFEST.MF 파일에서도 서명 항목을 제거해야합니다.
Krzysztof Jabłoński

이 답변은 다른 사용 사례의 문제를 해결하는 데 도움이되는 원인 에 대한 정보를 제공하기 때문에 여전히 좋습니다 . 예를 들어, 내 문제는 AppCenter와 관련된 것이 었는데, 실제로 서명 된 패키지를 사임하려한다는 경고를 받았으므로 build.gradle ... 말에서 signingConfig를 제거해야했습니다.
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입니다. 디버그 모드로 로그인을 참조하십시오 .


당신은 내 하루를 저장하고, 아마도 내 앱도 구할 수 있습니다! 내 앱을 Signed로 내보내거나 내보내려고 할 때마다 Eclipse가 충돌하므로 명령 줄을 사용하는 것이 유일한 방법이며이 오류가 발생했습니다. 다시 한번 감사
기욤

(자동으로 프로젝트 -> 빌드) "자동 빌드를"해제 - @Guillaume은, 일식의 충돌을 피하기 위해
Luten

서명을 보유한 CERT.RSA 파일은 제거를 제안하는 META-INF 폴더에 저장됩니다. 사실상 서명을 제거하는 것과 동일합니다. 이것이 바로 디버그 키로 서명 할 수있는 이유입니다. 따라서 두 개의 다른 키로 apk에 서명했다는 의미는 아닙니다.
Rajesh 2014

APK에 성공적으로 서명했지만 앱을 설치하는 동안 "오류-패키지를 구문 분석하는 데 문제가 있습니다."라는 오류가 발생합니다. 무엇이 문제하시기 바랍니다 도움이 될 수 있습니다 ..
KK_07k11A0585

2
기록을 위해 META-INF 폴더를 삭제 한 후에도이 방법이 작동하지 않았습니다. 여전히 ZipException
Sterling Archer

54

이것은 위의 @Joerg 답변 의 1 Liner / 1 Step 버전입니다.

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 / *에 주의하십시오 -필요한 것보다 더 많은 파일을 삭제할 수 있습니다.
대니 Schoemann

@DannySchoemann 무슨 뜻이야? META-INF / gdata / kinds / com.google.schemas.contact.2008 및 META-INF / services / com.fasterxml.jackson.core.JsonFactory에 3 개의 파일이 있습니다. 그렇다면 매니페스트 및 인증서 파일 만 제거해도 안전할까요?
kaay

@ kaay- 맞아 보이지만 확실히 모르겠습니다. 삭제해야 할 것을 실험해야 할 수도 있습니다.
대니 Schoemann


3

이 오류가 발생하는 한 zipaligned .apk 파일에 서명하려고 할 때 발생합니다.
jarsigner가 zipalign 변경 사항 중 일부를 견딜 수없는 것 같습니다. 이것은 자주 발생하지 않습니다.


apk를 Zipalign한다고해서 서명되는 것을 막지는 않습니다. 서명 후 zipalign을 다시 실행하여 정렬 된 상태로 되돌려 야합니다.
dmdrummond

3
@dmdrummond 방지하지는 않지만 그래야합니다. 정렬하면 zip이 수정됩니다. 때때로 서명이이 오류와 함께 정렬 된 zip에 서명하지 못합니다. 왜 반대 투표?
Luten

이제 답변의 의미를 변경했습니다. 이전 답변은 zip-aligned 파일에 서명 할 수 없다고 강력하게 제안했습니다. 그것은 틀 렸습니다.
dmdrummond 2014-08-05

@dmdrummond, 아니요, 그렇지 않았습니다. 사전 편집 버전을 다시 읽을 수 있습니다 ( stackoverflow.com/posts/13026461/revisions )
Luten

0

.aab 파일에 서명 할 때이 문제가 발생했습니다. 중복 서명을 제거하면 (번들링의 일부로 한 번, 수동으로 한 번) 수정되었습니다. 이것은 기본 반응 네이티브 앱 스캐 폴딩의 일부였습니다.

app/build.gradle파일은 섹션이 포함되어 android/buildTypes/release그 한 signingConfig키 세트를. 파일을 .apk 파일 생성 할 때 무시 듯하지만 .aab 형식으로 전환 할 때 그것은 것 같습니다 했던 그 서명을 적용합니다. 그런 다음 CI에 자체 서명을했을 때 이미 서명했기 때문에 불만을 토로했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.