개요
프로젝트 배포 과정에서, Proguard라는 것 때문에 충돌이 발생한 적이 있었는데, 이게 과연 어디서 쓰이는거고 어떻게 설정해야하는지에 대한 제대로된 학습을 해본적이 없는 것 같아서 Proguard에 대해 정리해보려고 한다.
1. ProGuard란?
ProGuard는 Java 및 애플리케이션에서 코드 최적화, 난독화, 축소 및 제거 기능을 제공하는 도구이다.
주로 Android 개발에서 앱 용량을 줄이고, 코드의 원래 형태나 동작 방식을 이해하기 위해 바이너리를 분석하는 작업을 방지하기 위해 사용된다.
1-1. 주요 기능
1) 코드 축소
-> 바이트 코드를 분석해 사용되지 않는(참조되지 않는) 클래스, 필드, 메서드 및 속성을 제거해 애플리케이션 크기를 줄인다.
-> 코드 축소 후 mapping.txt 파일을 확인하면 제거된 클래스와 메서드를 확인할 수 있다.
2) 코드 최적화
-> 중복된 연산 제거
-> 인라인 함수 최적화
# 호출 빈도가 높은 짧은 메서드는 직접 코드에 삽입해 함수 호출 비용을 줄인다.
3) 코드 난독화
-> 클래스, 메서드, 변수 이름 변경
# classA -> a, methodName -> b 등의 형태로 바뀐다.
-> 소스코드 내 주석 및 디버깅 정보를 제거해 분석이 어렵도록 한다.
-> mapping.txt 파일을 통해 난독화된 이름과 원래 이름 간의 매핑을 저장해 디버깅이 가능하도록 한다.
2. ProGuard 설정
모듈 수준의 build.gradle에서 proguard-rules.pro 파일을 다음과 같이 적용하면 된다.
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
추가적인 설정은 proguard-rules.pro 파일에 작성하면 된다.
<proguard-rules.pro>
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
2-1. ProGuard 주요 옵션
: -dontshrink
-> 코드 축소 기능을 비활성화 한다.
: -whyareyoukeeping <클래스>
-> 특정 클래스가 삭제되지 않는 이유를 출력해 디버깅 할 수 있다.
: -dontoptimize
-> 코드 최적화를 비활성화 한다.
: -dontobfuscate
-> 코드 난독화를 비활성화 한다.
: -obfuscationdictionary <파일>
-> 난독화 할 때 사용할 단어 목록을 지정한다.
: -classobfuscationdictionary <파일>
-> 클래스 이름을 난독화할 때 사용할 단어 목록을 지정한다.
: -packageobfuscationdictionary <파일>
-> 패키지 이름을 난독화 할 때 사용할 단어 목록을 지정한다.
: -overloadaggressibely
-> 가능한 많은 메서드 및 필드 이름을 중복해 난독화한다.
: -keep <클래스>
-> 특정 클래스를 보호해 축소 및 난독화하지 않도록 설정한다.
3. 한계점
1) 속도 문제
-> 빌드 시간이 상대적으로 길어질 수 있다.
2) 일부 코드 유지 문제
-> 특정 코드가 예상치 못하게 제거될 가능성이 있다.
3) 리플렉션 문제
-> 리플렉션 기반의 코드 실행을 정확히 분석하지 못하는 경우가 많다.
이러한 한계점 때문에 AGP 3.4 이상에서 사용되는 R8이라는 새로운 난독화 도구를 사용하는 것이 좋다고 한다.
'Android > Android' 카테고리의 다른 글
[Android] 웹뷰(WebView)란? (2) | 2025.06.16 |
---|---|
[Android] Retrofit2 & OkHttp3 (0) | 2025.02.11 |
[Android] 안드로이드 OS 구조 (0) | 2025.02.09 |
[Android] 컴포넌트 - Broadcast Receiver (1) | 2025.01.27 |
[Android] 컴포넌트 - ContentProvider (0) | 2025.01.23 |