1. Proguard란?
힘들게 작업한 코드들을 남이 디컴파일해서 카피한다면, 허무(?)해질뿐 만 아니라 회사 입장에서는 엄청난 손해를 볼 수 있습니다.
그래서 코드 난독화라는 것이 필요한데, 이러한 코드 난독화를 해주는 서비스 중 하나가 안드로이드 스튜디오에서 기본으로 제공하는 Proguard입니다.(유료버전: Dexguard)
2. 사용 이유
위에서 말한 코드 난독화도 필요하지만, 앱의 크기를 줄이는 것 또한 배포할 앱 개발에 있어서 빼놓을 수 없는 부분입니다.
1) 코드 난독화를 통해 디컴파일(Decompile) 시 소스 코드가 노출되는 것을 방지할 수 있다.
코드 난독화: 워딩 그대로 작성된 코드를 읽기 어렵게 만드는 작업. ex) 알고리즘이나 로직, 자료형, 변수명 등을 보기 어렵게 만들거나 숨긴다.
2) 불필요한 메서드를 제거하여 multiDex 생성을 피하여 앱의 크기를 줄인다.
- 안드로이드 소스 코드 -> 컴파일 -> dex 파일 -> 한 dex파일은 65536개의 메서드 참조 가능
- 메서드가 65536개가 넘어가면 dex 파일(가상머신에서 실행)이 여러 개가 생성된다.
- dex 파일이 여러 개(멀티) 생성되고, 결과적으로 빌드 속도가 느려지며 APK의 용량이 커지게 된다.
👀 dex파일이란? Binary파일로, 기계어로 되어있는 안드로이드 런타임에서 궁극적으로 실행되는 코드가 있는 파일.
3. 사용되는 시기
APK가 생성되는 과정 중 앱 관련 코드 (R.java 파일, 소스코드, 자바 인터페이스)를 javac(java compiler)이 컴파일하여 바이트 코드(.class 파일)로 변환하는데 이 때, Proguard 과정이 일어난다.(=> dex 생성)
4. 난독화 Proguard 동작 원리
간단하게 정리하면,
1) 필요 이상으로 복잡한 코드를 만들거나 아무 것도 하지 않는 코드를 삽입하고
2) 관련이 없는 여러 함수들을 뒤섞고
3) 데이터를 알아보기 힘들게 인코딩한다.
5. Proguard 사용법
1) 빌드 타입을 나눠준다.
build.gradle
buildTypes {
debug {
// 프로가드 비활성화
minifyEnabled false
// 기본 프로가드 설정
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
// 프로가드 활성화
minifyEnabled true
// 기본 프로가드 설정
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
2) 프로가드 활성화 및 depug.pro 설정
buildTypes {
debug {
// 프로가드 활성화
minifyEnabled true
// 기본 프로가드 설정
proguardFile getDefaultProguardFile('proguard-android.txt')
// 프로젝트에 필요한 프로가드 설정
proguardFile 'proguard-rules.pro'
}
release {
// 프로가드 활성화
minifyEnabled true
// 기본 프로가드 설정
proguardFile getDefaultProguardFile('proguard-android.txt')
// 프로젝트에 필요한 프로가드 설정
proguardFile 'proguard-rules.pro'
}
}
3) 추가적인 프로가드 설정 방법
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
// 이곳에 원하는 방식을 작성해주면 된다.
# naver
-keep public class com.nhn.android.naverlogin.** { public protected *; }
# kakao
-keep class com.kakao.sdk.**.model.* { <fields>; }
# gson
-keep class * extends com.google.gson.TypeAdapter
4) proguard 옵션
-keepattributes SourceFile,LineNumberTable: 소스 파일의 라인을 섞지 않는 옵션 (stacktrace를 통해 어느 line에서 오류가 난 것인지 확인)
-renamesourcefileattribute SourceFile: 소스 파일 변수 명 바꾸는 옵션 (보통 라이브러리는 딱히 난독화 할 필요없을 때 이렇게 적어준다.)
-keep class 라이브러리패키지명.** { *; }: 딱히 난독화 할 필요없을 때 이렇게 적어준다.
-ignorewarnings: warning 무시
-dontwarn 패키지명.**: 지정한 패키지의 warning 무시
#-dontoptimize: #없애면 난독화 하지 않는다.
#-dontobfuscate: #없애면 최적화 하지 않는다.
#-keepresourcexmlattributenames manifest/**: #없애면 manifest 난독화 하지 않는다.
'안드로이드' 카테고리의 다른 글
RecyclerView를 데코해보자 ! - ItemDecoration (0) | 2023.08.15 |
---|---|
TextView로 CustomButton을 만든다고!? (0) | 2023.08.15 |
Glide 관찰기 (Feat. 속도, 캐시) (0) | 2023.08.15 |
[ Android ] PNG와 SVG (0) | 2020.12.20 |
[ Android ] DP란? SP? PX!? DPI..? (0) | 2020.12.20 |