안드로이드

[Android] 프로가드(Proguard)에 대해 알아 보자

코딩하는후운 2022. 10. 25. 11:26
반응형

Android Proguard에 대해 알아보자

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

-멀티덱스(multidex)란?
안드로이드 앱을 구성하는 코드는 컴파일 되어 덱스(dex)파일로 만들어집니다.
하나의 덱스(dex)파일에는 최대 65536개의 메소드만 참조 할 수 있습니다.
만약 프로젝트의 코드가 65536개의 메소드를 초과하게 되면 덱스(dex)파일이 여러개가 생성됩니다.

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

가능하다면 프로가드를 설정해주면 좋겟죠?


코드 난독화 및 APK최적화를 위한 Android Proguard 사용법에 대해 살펴보겠습니다.

buildTypes{
  release{
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
}

App-build.gradle 에서 확인해보면 위와 같이 설정되어 있습니다. 위 코드를 보고 "프로가드 설정이 되어있네?"라고
생각하시면 오산입니다.


1.빌드 타입을 디버깅과 릴리즈 버전으로 나눠줍니다.
buildTypes{
  debug{
    //프로가드 활성화
    minifyEnabled true

    //기본 프로가드 설정
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }

  release{
    //프로가드 활성화
    minifyEnabled true

    //기본 프로가드 설정
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
}

프로가드를 디버깅 버전과 릴리즈 버전으로 나눠서 설정해 주는 것이 좋습니다.

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

위를 자세히 보면 proguardFiles로 되어있는 것을 확인할 수 있습니다.(뒤에 s가 붙어있다.)
참고로 위 코드와 아래코드는 같은 코드입니다.
proguardFile getDefaultProguardFile('proguard-android.txt')
proguardFile 'proguard-rules.pro'


2. 프로가드 활성화 및 debug.pro추가
buildTypes{
  debug{
    //프로가드 활성화
    minifyEnabled true

    //기본 프로가드 설정
    proguardFile getDefaultProguardFile('proguard-android.txt')
    //프로젝트에 필요한 프로가드 설정
    proguardFile 'proguard-rules.pro'
    //디버그에 필요한 프로가드 설정
    proguardFile 'proguard-debug.pro'
  }

  release{
    //프로가드 활성화
    minifyEnabled true

    //기본 프로가드 설정
    proguardFile getDefaultProguardFile('proguard-android.txt')
    //프로젝트에 필요한 프로가드 설정
    proguardFile 'proguard-rules.pro'
  }

}

minifyEnabled 값을 true로 바꿔 주면 프로가드가 적용됩니다.
디버그 시 proguard-debug.pro를 추가해 줌으로써 난독화 및 라인 지워지는 것을 예외 처리 할 수 있습니다.


proguard-debug.pro

# Begin: Debug Proguard rules

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

# End: Debug ProGuard rules

위는 proguard-debug.pro 파일로 똑같이 작성해 주시면 됩니다.
프로젝트마다 다르겠지만 아래와 같은 버그가 발생했습니다.


3.프로가드시 발생한 버그 처리하기

okio와 retrofit2라이브러리에서 발생한 경고 인데요 저같은 경우 이를 무시해 주는 코드를 넣어 해결했습니다.

proguard-rules.pro
-dontwarn okio.**
-dontwarn retrofit2.**

proguard-rules.pro위와 같은 코드를 추가해 주었습니다.
-dontwarn 패키지명.*은 지정한 경고를 무시해 주는 코드입니다.


4. 적용 결과 확인하기
프로가드를 적용한 APK와 아닌 APK를 비교 분석 해보았습니다.
분석 방법은 Build탭 - Analyze APK를 통해 확인.

-프로가드 사용전
용량 37.2, classes.dex파일이 3개

-프로가드 적용후
classes.dex파일이 하나로 바뀌었다. 용량 33.7로 감소


5.디컴파일하여 난독화 확인해보기
프로가드를 적용한 APK와 아닌 APK를 직접 디컴파일 해서 얼마나 난독화가 잘 이뤄졌는지 확인을 직접 해보면 좋습니다.


https://chelsea-kbj.tistory.com/9

 

[Mac] 안드로이드 APK 파일 Decompile 하기

저는 주로 쇼핑몰 앱 개발 및 운영을 하는 아이폰/안드로이드 앱 개발자입니다. 요즘 보안에 민감해서 그런지 ISMS 인증 등 앱 취약점 점검들을 많이 하고있습니다. 취약점 점검을 하면 주로 앱

chelsea-kbj.tistory.com

 

참조 :

https://black-jin0427.tistory.com/89?category=727620

 

[Android, Proguard] 안드로이드 프로가드 설정하기

안녕하세요. 블랙진입니다. 이번에는 코드 난독화 및 APK 최적화를 위한 프로가드에 대해 알아보겠습니다. Android Proguard 가 필요한 이유 1. 코드 난독화를 통해 디컴파일시 본인의 코드가 노출되

black-jin0427.tistory.com

 

반응형