이동식 저장소

[Android] proguard-rules.pro는 무엇인가 본문

Primary/Android

[Android] proguard-rules.pro는 무엇인가

해스끼 2022. 7. 7. 22:27

Android 프로젝트를 만들면 수많은 Gradle Scripts 파일이 생성된다. 나머지는 대충 알겠는데 ``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

흠... 일단 ProGuard가 뭔지부터 공부해 보자.

ProGuard

ProGuard 공식 웹에서는 ProGuard를 이렇게 소개하고 있다.

Use ProGuard, Guardsquare’s open-source shrinker for Java bytecode, to enhance and optimize your code.

Java 바이트코드를 shrink하는 오픈 소스 라이브러리라고 한다. 

code obfuscation

더 읽어보면, ProGuard의 기능은 크게 축소(shrink), 최적화(optimize)와 난독화(obfuscation)로 나뉜다. 

축소 (shrink)

축소 단계에서는 빌드 결과물의 크기를 줄인다. Android에서는 APK 또는 AAB의 크기를 줄이는 것이 해당한다. ProGuard는 Java 바이트코드에서 불필요한 클래스, 필드, 메서드 등을 제거하여 바이트코드의 크기를 줄인다.

 

축소는 크게 코드 축소리소스 축소 단계로 나뉜다. 코드 축소 단계에서는 사용하지 않는 변수, 메서드 등을 제거하며, 리소스 축소 단계에서는 사용되지 않는 리소스 파일을 제거한다.

최적화 (optimize)

최적화 단계에서는 바이트코드를 최적화하고, 사용되지 않는 JVM 명령어를 없앤다. 실행되지 않는 else문 등이 제거된다. 이 과정에서 중복된 코드가 제거되고, 더 짧은 명령어로 대체될 수 있는 명령어가 제거된다.

난독화 (obfuscation)

난독화 단계에서는 코드를 읽기 어렵게 만든다. Java 바이트코드의 특성상 리버스 엔지니어링이 매우 쉬워, 난독화 과정을 거치지 않으면 앱의 코드를 거의 그대로 복원할 수 있다.

 

대표적으로 클래스의 이름을 무작위 알파벳으로 바꾸는 기법 등이 있다. 이렇게 하면 정적 분석(코드를 실행하지 않고 분석하는 방법)을 방어할 수 있다.

사전 검증 (preverification)

사전 검증 단계에서는 클래스를 빠르게 로드하기 위해 Java 6 또는 Java Micro Edition의 클래스 파일에만 사전 검증 정보를 삽입한다. 어차피 우리는 최소 Java 11을 쓰기 때문에 크게 신경쓰지 않아도 될 듯하다.

``proguard-rules``의 비밀

이제 알겠지? 이 파일에는 사용자 지정 ProGuard 규칙이 저장된다. 여기에서 ProGuard의 동작을 모듈별로 제어할 수 있다.

-dontobfuscate                              # 난독화 단계를 건너뛴다.
-keepattributes SoureFile,LineNumberTable   # 소스파일, 라인 정보 유지 (디버깅을 위해)

``app``의 ``bulid.gradle``을 보면 ``proguardFiles`` 옵션이 있는데, 우리가 찾던 ``proguard-rules.pro`` 파일이 지정되어 있다. 여러 파일을 지정할 수도 있다.


실제로 앱 경량화를 적용해 보자.

 

[Android] 앱 경량화 with R8

왜 경량화해야 하는가? APK 파일에는 실행 가능한 바이트코드가 DEX(Dalvik Executable) 형태로 저장되어 있다. DEX 파일에는 앱에서 실행되는 Android framework 메서드, 개발자가 직접 작성한 메서드 등의

thinking-face.tistory.com

 

Comments