코드 축소(또는 Tree Shaking): 앱에서 사용하지 않는 클래스, 필드, 메서드, 속성 및 라이브러리 종속성을 감지하여 안전하게 삭제합니다(64k 참조 제한을 해결하기 위한 유용한 도구).
리소스 축소: 앱의 라이브러리 종속성에서 사용하지 않는 리소스를 포함하여 패키징된 앱에서 사용하지 않는 리소스를 삭제합니다. 리소스 축소는 코드 축소와 함께 사용하여 사용하지 않는 코드를 삭제하고 마찬가지로 더 이상 참조되지 않는 리소스도 안전하게 삭제할 수 있습니다.
난독화: 클래스와 멤버 이름을 줄여 DEX 파일 크기를 줄입니다.
최적화: 코드를 검사하고 다시 작성하여 앱 DEX 파일의 크기를 더 줄입니다. 예를 들어, if/else 구문의 else {} 브랜치가 전혀 사용되지 않음을 R8에서 감지한 경우 R8이 else {} 브랜치 코드를 삭제합니다.
악용적으로 사용자가 코드를 뜯었을때 난독화처리를하여 읽을수 이해하기 어렵게 만드는 장점도 있습니다.
buildTypes {
getByName("release") {
minifyEnabled true
shrinkResources true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
위와 같이
minifyEnabled trueshrinkResources true
로 설정해주면 R8 난독화를 간단하게 사용할 수 있습니다.
(Android Gradle 플러그인 3.4.0 이상에서)
신경을 많이써야한다는 점이 어렵습니다.
예) Google에 remote config 를 통한 값을 가져오는 통신에서 data에 난독화가 적용되어 정상적인 값을 못가져오는 현상
난독화 하지않을 부분은 위쪽 코드 proguardFiles에 명시된 곳에 예외처리를 해줘야합니다.
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.
#
# 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
# 광고 적용
-keep summit.lol.couter.scene.Ads {*;}
-keep summit.lol.couter.scene.view {*;}
# 데이터 통신
-keep com.xwray.groupie.* {*;}
이후 apk 를 빌드하고 제대로 난독화가 적용됬는지 확인해 보겠습니다.
순서:
1. Dex2Jar
2. jd-gui
1. apk 파일을 다운받은 dex2jar-2.0 폴더안에 넣어줍니다.
(저는 test.apk 파일이라고 넣어줬습니다.)
2. CMD 창을 열어 apk 파일이 있는 dex2jar-2.0 폴더로 이동합니다.
3. 명령어를 이용하여 apk 파일을 jar 파일로 만들어줍니다.
4. 다운받은 jd-gui 를 통해 생성된 jar 파일을 Open 해줍니다.
아래 화면처럼 모든 변수 및 작성한 변수 및 함수명이 그대로 보인다면 난독화가 적용되지않은 것.
<난독화 적용 전>
아래 이미지 처럼 class 명 부터 변수 및 함수명이 모드 변하게됩니다.( ※ proguard 파일에서 예외처리한 부분 제외 )
<난독화 적용 후>