정상에서 IT를 외치다

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

안드로이드

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

Black-Jin 2018. 8. 24. 12:13
반응형


안녕하세요. 블랙진입니다.


이번에는 코드 난독화 및 APK 최적화를 위한 프로가드에 대해 알아보겠습니다.



Android Proguard 가 필요한 이유


1. 코드 난독화를 통해 디컴파일시 본인의 코드가 노출되는 것을 방지 할 수 있습니다.


2. 불필요한 메서드를 제거하여 멀티덱스를 피할 수 있습니다.




- 멀티덱스란


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


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


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




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



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'

proguardFiles 는 콤마(,) 를 통해 나열할 수 있고 proguardFile 을 통해 단일 변수로 입력할 수도 있습니다. 아래 적용할 코드는 proguardFile 로 작성되어 있기 때문에 참고사항으로 적어봤습니다. ㅎㅎ






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.  프로가드 시 발생한 버그 처리하기



프로가드 적용후 빌드하는 과정 에서 5개의 경고가 발생했습니다.


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



proguard-rules.pro

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

proguard-rules.pro 위와 같은 코드를 추가해 주었습니다.

-dontwarn 패키지명.* 은 지정한 경고를 무시해 주는 코드입니다. 이것 외에도 다양한 난독화 옵션이 있는데 이는 스크롤 맨 아래 참고 자료 3번을 확인해 주세요






4. 적용 결과 확인하기


프로가드를 적용한 APK 와 아닌APK 를 비교 분석 해 보았습니다.


분석 방법은 안드로이드 3.0 이상 버전에 있는 Analyze APK 를 통해 확인했습니다.





_프로가드 사용 전



프로가드를 사용하기 전에는 용량이 37.2MB 였으며 classes.dex 파일이 무려 3개나 있습니다. ㄷ_ㄷ

classes.dex 의 메소드 개수를 보면 65501 개이며 이와 같은게 classes2.dex 에도 있습니다



classes3.dex 는 1505 개의 메소드가 있네요. ㅎㅎ




_프로가드 적용 후



짜잔! 프로가드 적용 후 3개로 나뉘어져 있던 dex 파일이 classes.dex 파일 하나로 바뀌었습니다. 메소드 개수도 56673 으로  프로가드를 적용 안한 APK 보다 반이상이나 줄어들었습니다. 또한 용량은 기존 37.2MB 에서 33.7MB 로 감소하였습니다.






5. 디컴파일하여 난독화 확인해보기


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


저는 이 부분은 아래 링크로 남기겠습니다.


안드로이드 APK Dcompile





<추천 링크>


릴리즈 버전으로 컴파일 하는 법이 궁금하다면 -> 릴리즈 버전으로 컴파일 하기


라이브러리 별 구체적인 난독화 옵션 예제가 궁금하다면 -> 안드로이드 프로가드 설정하기 2



<참고 자료>


1. 커니 - 멀티덱스, 섣불리 적용하지 마세요!

2. 커니 - Proguard를 사용한 코드 난독화

3. Proguard 사용하기


반응형
Comments