REF - https://black-jin0427.tistory.com/89
Android Proguard 가 필요한 이유
1. 코드 난독화를 통해 디컴파일시 본인의 코드가 노출되는 것을 방지 할 수 있습니다.
2. 불필요한 메서드를 제거하여 멀티덱스를 피할 수 있습니다.
- 멀티덱스란?
안드로이드 앱을 구성하는 코드는 컴파일 되어 덱스(dex) 파일로 만들어 집니다. 하나의 덱스(dex) 파일에는 최대 65536개의 메소드만 참조 할 수 있습니다. 만약 프로젝트의 코드가 65536개의 메소드를 초과하게 되면 덱스(dex)파일이 여러개가 생성됩니다.
그러면 멀티 덱스를 사용하여 컴파일 할 수 있지만, 빌드 과정에서 앱 내의 파일을 여러개의 덱스파일로 나누어야 하므로 빌드 속도가 느려지고 APK 의 용량이 커지게 됩니다.
Analyze APK 를 통해 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번을 확인해 주세요
소스 파일의 라인을 섞지 않는 옵션 (이거 안해주면 나중에 stacktrace보고 어느 line에서 오류가 난 것인지 확인 불가)
-keepattributes SourceFile,LineNumberTable
소스 파일 변수 명 바꾸는 옵션
-renamesourcefileattribute SourceFile
보통 라이브러리는 딱히 난독화 할 필요없을 때 이렇게 적어준다.
-keep class 라이브러리패키지명.** { *; }
워닝뜨는거 무시할때
-ignorewarnings
지정해서 워닝 무시할 때
-dontwarn 패키지명.**
아래의 3가지 것들은 default 요소들이지만 중요한 option이라 설명한다.
#-dontoptimize #없애면 난독화 X
#-dontobfuscate #없애면 최적화 X
#-keepresourcexmlattributenames manifest/** #없애면 manifest 난독화 X