본문 바로가기
카테고리 없음

[android studio] app 난독화

by KEI NETWORK 2019. 9. 17.
728x90

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 로 감소하였습니다.

 

빌드 후 mapping seed usage cofing 파일을 만들어주는 옵션
-printmapping map.txt
-printseeds seed.txt
-printusage usage.txt
-printconfiguration config.txt

소스 파일의 라인을 섞지 않는 옵션 (이거 안해주면 나중에 stacktrace보고 어느 line에서 오류가 난 것인지 확인 불가)
-keepattributes SourceFile,LineNumberTable

소스 파일 변수 명 바꾸는 옵션
-renamesourcefileattribute SourceFile

보통 라이브러리는 딱히 난독화 할 필요없을 때 이렇게 적어준다.
-keep class 라이브러리패키지명.** { *; }

워닝뜨는거 무시할때
-ignorewarnings
지정해서 워닝 무시할 때
-dontwarn 패키지명.**

아래의 3가지 것들은 default 요소들이지만 중요한 option이라 설명한다.
#-dontoptimize #없애면 난독화 X
#-dontobfuscate #없애면 최적화 X
#-keepresourcexmlattributenames manifest/** #없애면 manifest 난독화 X

이상으로 Proguard 사용법!

728x90

댓글