Android

안드로이드 [Kotlin] - 프로가드(Proguard) 설정하기

🤖 Play with Android 🤖 2022. 12. 26. 14:28
728x90


프로가드(Proguard)란?

앱은 IP 도난, 앱 복제, 민감한 데이터 손실, 브랜드 평판 손상 등과 같이 다양한 위협에 취약하다. 또한 보안 위협과 함께 또 하나의 중요하게 고려해야 하는 것은 앱 성능이다. 애플리케이션에서 불필요한 코드와 요소를 제거하면 더 작고 빠른 앱을 만들 수 있다. 코드 난독화는 오픈 소스 애플리케이션에서 매우 중요하다고 할 수 있다.

 

프로가드는 컴파일된 앱 패키지의 코드를 난독화해서 다른 사람이 해당 패키지를 디컴파일 했을 때 해독하기 어렵게 만드는 일종의 보안 장치이다.

 

 

 

프로가드가 필요한 이유

  • 코드 난독화를 통해 디컴파일시 본인의 코드가 노출되는 것을 방지 할 수 있다.
  • 불필요한 메서드를 제거하여 멀티덱스를 피할 수 있다.

 

 

 

프로가드의 특징

축소(Shrinking)

축소는 APK의 크기를 줄이는 것을 말한다. ProGuard를 사용하면 앱 내 사용되지 않는 변수, 메서드, 클래스를 탐지할 수 있다. 사용하지 않는 코드는 애플리케이션과 라이브러리에서 모두 제거된다. 축소는 두 단계로 이루어져 있다.

  • 코드 축소 : 사용하지 않는 변수, 메소드, 클래스, 속성을 애플리케이션과 해당 라이브러리 종속성에서 제거 -> "멀티덱스" 제거
  • 리소스 축소 : 애플리케이션과 해당 라이브러리 종속성에서 사용되지 않는 리소스 파일을 제거

 

멀티덱스란?

안드로이드 앱을 구성하는 코드는 컴파일되어 덱스(dex) 파일로 만들어진다.

 

  • 하나의 덱스(dex) 파일에는 최대 65536개의 메서드만 참조할 수 있다.
  • 만약 프로젝트의 코드가 65536개의 메서드를 초과하게 되면 덱스(dex) 파일이 여러 개가 생성된다.

 

실제 필자의 개인 배포앱 내에 dex가 여러개 생성된 것을 확인할 수 있었다.

멀티 덱스를 사용하여 컴파일할 수 있지만, 빌드 과정에서 앱 내의 파일을 여러 개의 덱스파일로 나누어야 하므로 빌드 속도가 느려지고 APK의 용량이 커지게 된다.

 

 

최적화

최적화는 바이트코드를 최적화하는 것을 말한다. 사용하지 않는 명령어는 앱 성능에 부정적인 영향을 미칠 수 있다. 생성된 코드의 작은 세그먼트에 있는 중복 명령어는 peephole 최적화 기술을 통해 제거된다. 이 단계에서 중복된 코드가 제거되고 더 짧은 명령어로 대체될 수 있는 명령어가 식별되어 제거되게 된다.

 

 

난독화

난독화는 코드를 읽기 어렵게 만드는 과정이다. 무단으로 액세스 권한을 얻은 제 3자는 코드는 이해할 수 없다. 사용되지 않는 코드를 제거한 후 나머지 클래스, 필드, 메서드의 이름을 임의 문자를 사용하여 변경한다. 코드 세그먼트의 원래 의도를 해커로부터 숨기기 위해 난독화가 사용된다.

 

 

 

 

 

안드로이드 프로가드(Android Proguard) 적용해보기

App - build.gradle 설정

(필자는 Gradle Kotlin DSL로 스크립트를 작성했기 때문에 일반적인 Groovy 문법과는 조금 다를 수 있다.)

buildTypes {
        named("debug") {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
        named("release") {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }

 

 

프로가드 활성화 및 debug.pro 추가

buildTypes {
        named("debug") {
            // 프로가드 활성화
            isMinifyEnabled = true
            // 기본 프로가드 설정
            proguardFile(getDefaultProguardFile("proguard-android-optimize.txt"))
            // 프로젝트에 필요한 프로가드 설정
            proguardFile("proguard-rules.pro")
            // 디버그에 필요한 프로가드 설정
            proguardFile("proguard-debug.pro")
        }
        named("release") {
            // 프로가드 활성화
            isMinifyEnabled = true
            // 기본 프로가드 설정
            proguardFile(getDefaultProguardFile("proguard-android-optimize.txt"))
            // 프로젝트에 필요한 프로가드 설정
            proguardFile("proguard-rules.pro")
            // 디버그에 필요한 프로가드 설정
            proguardFile("proguard-debug.pro")
        }
    }
  • 디버그에 필요한 프로가드까지 설정해야 하므로 proguardFile을 나누어 주었다.
  • 이때 뒤에 s를 제거해야 하나의 File에 하나의 파일만 담을 수 있다.

 

 

proguard-debug.pro 설정

# Begin: Debug Proguard rules

-dontobfuscate                              #난독화를 수행하지 않도록 함
-keepattributes SoureFile,LineNumberTable   #소스파일, 라인 정보 유지

# End: Debug ProGuard rules

-dontwarn okio.** 
-dontwarn retrofit2.**

맨 밑의 두 줄은 Retrofit과 okio에서 발생하는 경고를 무시해주는 코드이다. 프로그램이 동작하는 것에는 이상이 없다.

 

 

적용결과 확인

dex 파일이 하나로 줄고 앱 용량도 감소했다.

 

  • 10개 이상으로 나누어져 있던 dex 파일이 하나로 줄었다.
  • 또한 앱 용량도 전체적으로 감소한 것을 확인할 수 있었다.