APK 파일에 서명이 필요한 이유는 무엇입니까?
모든 Android 앱은 설치하기 전에 디지털 서명을 해야 합니다. 서명은 여러 가지 용도로 사용됩니다.
- 앱 개발자의 신원을 확인합니다.
- APK가 변조되지 않았는지 확인합니다.
- Android가 앱 업데이트를 원본과 일치시킬 수 있도록 허용합니다.
- 모든 Android 기기에 설치하는 데 필요합니다.
데스크탑 도구 필요
APK 서명에는 명령줄 도구(JDK/Android SDK)가 필요합니다. 웹 브라우저에서는 이 작업을 수행할 수 없습니다. 아래 가이드에 따라 컴퓨터에서 APK에 서명하세요.
방법 1: apksigner로 서명(권장)
apksigner는 Android SDK 빌드 도구에 포함된 Google의 공식 APK 서명 도구입니다.
1단계: 키 저장소 생성
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias
2단계: APK에 서명
apksigner sign --ks my-release-key.jks \
--ks-key-alias my-key-alias \
--out signed-app.apk unsigned-app.apk
3단계: 서명 확인
apksigner verify --verbose signed-app.apk
방법 2: jarsigner로 서명(레거시)
# Sign
jarsigner -verbose -sigalg SHA256withRSA \
-digestalg SHA-256 \
-keystore my-release-key.jks \
app-unsigned.apk my-key-alias
# Verify
jarsigner -verify -verbose app-signed.apk
4단계: Zipalign(중요!)
서명 후 zipalign을 사용하여 APK를 최적화합니다.
zipalign -v 4 signed-app.apk aligned-app.apk
디버그 서명(테스트용)
테스트 목적으로 기본 Android 디버그 키 저장소를 사용할 수 있습니다.
# Location of debug keystore:
# Linux/Mac: ~/.android/debug.keystore
# Windows: C:\Users\{USERNAME}\.android\debug.keystore
# Sign with debug key
apksigner sign --ks ~/.android/debug.keystore \
--ks-key-alias androiddebugkey \
--ks-pass pass:android \
app.apk
서명 도구 비교
| 항목 | 앱 서명자 | jarsigner |
|---|---|---|
| V1 시그니처 | ||
| V2 서명 | ||
| V3 시그니처 | ||
| 추천 | 레거시 |
APK 서명자 - 자주 묻는 질문(FAQ)
APK 서명, 키 저장소, Android 코드 서명에 대한 일반적인 질문
Android 11~15에서 정렬 순서(apksigner 전 zipalign)가 중요한 이유
수정되거나 병합된 APK에 서명할 때 개발자와 모더가 저지르는 가장 빈번한 실수 중 하나는 zipalign ~ 후에를 실행하여 패키지에 서명하거나 Google의 Android SDK apksigner 대신 Java의 레거시 jarsigner 유틸리티를 사용하는 것입니다. APK 서명 체계 v2 및 v3은 ZIP 아카이브의 전체 바이너리 레이아웃에 대해 암호화 해시를 계산하므로 서명 후 zipalign로 바이트 오프셋을 수정하면 v2/v3 서명 블록이 즉시 무효화됩니다.
Android 11(API 수준 30)부터 Android 14 및 15에 엄격하게 적용되는 PackageManager에는 최신 SDK 수준을 대상으로 하는 모든 APK에 대해 두 가지 협상 불가능한 조건이 필요합니다.
- 압축되지 않은 4바이트 정렬 resources.arsc: 컴파일된 리소스 테이블(resources.arsc)은 Android가 RAM에 복사하지 않고 직접 메모리 매핑(mmap)할 수 있도록 압축되지 않은 상태로 저장(STORED)하고 4바이트 경계에 정렬되어야 합니다. 항상 zipalign -p -f -v 4 input.apk aligned.apk ~ 전에 서명을 실행하십시오.
- 필수 v2+ 서명 블록: jarsigner(v1 META-INF/ 서명만 작성)를 사용하여 API 30 이상을 대상으로 하는 APK에 서명하면 Android 11~15에서 INSTALL_PARSE_FAILED_NO_CERTIFICATES를 사용한 설치를 거부하게 됩니다. 위의 대화형 명령 생성기를 사용하여 키 저장소에 대한 정확한 apksigner --v2-signing-enabled=true 명령을 빌드하거나 APK 서명 검증자에서 서명된 출력을 확인하세요.