회사에서 사내 앱 포탈과 플레이스토어에 등록된 앱의 버전을 올려서 배포를 할 때 종종 이런 메시지를 마주하게 된다.
여러가지 원인이 있을 수 있겠지만, 나 같은 경우에는 앱 서명이 문제였다.
안드로이드 시스템은 보안을 위해 앱을 업데이트할 때, 기존에 설치된 앱과 새로 설치할 앱의 서명이 동일한지
반드시 확인한다. 만약 두 서명이 다르면, 다른 개발자가 만든 악의적인 앱으로 탈취되는 것을 막기 위해 업데이트를 차단하는 것이다.
정확한 서명 정보 확인하기
우선 새로운 버전을 배포하기 전에 기존에 배포되어 있는 최신 버전의 APK와 새로 배포할 APK의 서명 정보를
각각 확인할 필요가 있다.
가장 정확하고 현대적인 방법은 apksigner 도구를 사용하는 것이다.
확인하는 방법은 제법 간단하다.
터미널을 켜고 서명을 확인할 APK가 있는 디렉토리로 이동한다.
그리고 아래의 명령어를 입력하면 된다.
apksigner verify --print-certs 앱이름.apk
// 또는
keytool -printcert -jarfile 앱이름.apk
이렇게 하면 소유자, 발행자, 인증서의 고유한 값인 지문(Fingerprints) 등 상세한 서명 정보를 확인할 수 있다.
새로 배포할 녀석도 마찬가지로 확인해서, 두 APK의 SHA-256 digest 값이 완전히 동일한지 비교해야 한다.
만약 이 값이 다르다면, 서명이 일치하지 않는 것이 문제의 원인인 셈이다.
keytool 명령어의 한계
하지만 여기서 매우 중요한 점이 있다. keytool 명령어는 APK 안의 META-INF/*.RSA 파일을 읽는데, 이는 v1 (JAR signing) 방식의 서명만 확인할 수 있다.
최신 안드로이드 스튜디오는 기본적으로 v2, v3 서명 방식(APK Signing Scheme)을 사용하도록 설정되어 있다.
이 방식은 보안이 훨씬 강력하지만 keytool이 찾는 파일을 사용하지 않는다.
따라서 v2/v3로만 서명된 최신 앱을 keytool로 확인하면, "서명된 jar 파일이 아닙니다." 라는 메시지가 출력된다. 마치 서명되지 않은 것으로 오해할 수 있으니 참고하도록 하자! (그 오해를 했던 사람이 바로 나다.)
아래는 apksigner로 서명 정보를 확인했을 때 나오는 화면이다.

이렇게 확인된 정보와 비교했을 때, 기존 배포된 APK와 서명 정보가 달라서 패키지 충돌을 하게 된다.
해결 방법 및 추가 정보
두 APK의 서명이 다른 것을 확인했다면 해결책은 간단하다.
최초 배포 시 사용했던 것과 동일한 키스토어(.jks 또는 .keystore) 파일을 사용하여 새 버전의 앱을 다시 빌드하고 서명하면 된다.
참고로 이 서명 충돌 문제는 기존 앱을 업데이트할 때만 발생한다.
사용자가 기존 앱을 완전히 삭제하고 새로 설치하는 경우에는 해당 메시지가 발생하지 않는다.
비교할 대상이 없으므로 안드로이드 시스템이 서명 일치 여부를 검사하지 않기 때문이다.
하지만 모든 사용자에게 앱을 삭제하고 재설치하라고 안내할 수는 없으니, 배포 시에는 반드시 서명을 일치시켜야 한다.
서명된 앱 생성은 뭐...
모두 잘 알고 있겠지만

안드로이드 스튜디오 > Build > Generate Signed App Bundle or APK를 클릭하면 된다.
*잘못된 정보가 있을 경우 피드백 부탁드립니다 ( _ _ )
'Android > 트러블슈팅' 카테고리의 다른 글
| [Android] 안드로이드 스튜디오 프록시 설정 이슈 (0) | 2026.02.24 |
|---|---|
| [Android] 16KB 페이지 크기 요구사항 지원 (0) | 2025.09.15 |