반응형
1. 난독화가 필요한 이유
앱을 개발하다 보면, 코드 보호가 중요한 이슈로 떠오릅니다. 특히, 오픈소스나 보안이 중요한 앱에서 코드 분석을 방지하기 위해서 **난독화(obfuscation)**는 필수적이다. 그 이유를 몇 가지가 있다.
- 디컴파일 방지
APK 파일은 .dex 파일로 변환되어 기기에 설치됩니다. 이 파일을 역으로 디컴파일하면 원본 소스를 복원할 수 있다. 코드 난독화는 이를 어렵게 만들어 소스 코드의 유출을 방지한다. - 저작권 보호
애플리케이션이 다른 앱의 코드를 그대로 가져와서 사용하는 것을 방지하는 데 유효하다. 난독화된 코드는 타인이 쉽게 이해하거나 재사용하기 어렵다. - 보안 강화
민감한 알고리즘이나 사용자 인증 방식 등을 난독화하여 해커들이 해당 로직을 분석하고 악용하는 것을 방지할 수 있다. 예를 들어, API 키나 암호화 키가 소스 코드에 하드코딩되어 있다면 이를 난독화해 놓으면 정보 유출 위험을 줄일 수 있다. - API 키, 알고리즘 보호
앱에 포함된 API 키나 중요한 암호화 알고리즘을 보호하는 데도 난독화가 효과적이다. 코드 내에서 쉽게 찾을 수 있는 중요한 정보들이 자주 악용될 수 있기 때문에 이를 난독화함으로써 공격자로부터 정보를 숨길 수 있다.
2. Proguard vs R8
Proguard와 R8은 안드로이드 앱에서 다음을 수행하는 코드 최적화 도구이다:
- ✂️ 불필요한 코드 제거 (shrink)
- 📦 클래스 병합, 줄이기 (optimize)
- 🕵️♀️ 코드 난독화 (obfuscate)
- ✅ 리소스 최적화 (R8만 지원)
항목 | Proguard | R8 |
---|---|---|
적용 시점 | 예전 기본 도구 | Android Gradle Plugin 3.4 이상 기본 |
속도 | 느림 | 빠름 |
최적화 수준 | 보통 | 높음 |
Kotlin 지원 | 제한적 | 최적화됨 |
리소스 최적화 | 지원 안 됨 | 지원됨 |
📌 현재는 R8이 기본 도구이며, Proguard 설정 파일만 그대로 사용 가능
3. 기본 설정 (build.gradle)
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
4. 주로 발생하는 문제들
1) 앱 크래시 / 동작 안함
원인: 중요한 클래스나 메서드가 최적화되며 삭제됨
해결: proguard-rules.pro에 예외 등록
# 예시: Retrofit 인터페이스 보존
-keep interface com.example.api.** { *; }
# Gson 클래스 보존
-keep class com.google.gson.** { *; }
2) 리플렉션, 라이브러리 충돌
- 리플렉션으로 로드되는 클래스는 난독화되면 로드 실패
- Jetpack, Firebase, Glide 등은 공식 예외 rule 참조 필요
- 실무 팁
- minifyEnabled는 디버그 빌드에선 꺼둔다.
- -dontwarn 남용은 위험! → 경고를 무시하지 말고 원인 파악하기
- 최종 빌드 시 mapping.txt 꼭 보관 (디버깅 필수)
5. 참고 리소스
앱 축소, 난독화 및 최적화 | Android Studio | Android Developers
사용하지 않는 코드와 리소스를 삭제하기 위해 출시 빌드에서 코드를 축소하는 방법을 알아보세요.
developer.android.com
반응형