본문 바로가기

카테고리 없음

[안드로이드] Proguard / R8 완전 정리(안드로이드 코드 최적화와 난독화)

반응형

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

 

 

 

반응형