개발새발 블로그
R8 난독화 적용하기 & apk 디컴파일 확인하기 본문
안녕하세요 개발새발 블로그입니다.
오늘은 R8 난독화 적용 및 예외처리 방법.
이후 apk 파일을 디컴파일하여 난독화가 잘 적용됬는지 확인해보겠습니다.
난독화를 하였을때 장점
코드 축소(또는 Tree Shaking): 앱에서 사용하지 않는 클래스, 필드, 메서드, 속성 및 라이브러리 종속성을 감지하여 안전하게 삭제합니다(64k 참조 제한을 해결하기 위한 유용한 도구).
리소스 축소: 앱의 라이브러리 종속성에서 사용하지 않는 리소스를 포함하여 패키징된 앱에서 사용하지 않는 리소스를 삭제합니다. 리소스 축소는 코드 축소와 함께 사용하여 사용하지 않는 코드를 삭제하고 마찬가지로 더 이상 참조되지 않는 리소스도 안전하게 삭제할 수 있습니다.
난독화: 클래스와 멤버 이름을 줄여 DEX 파일 크기를 줄입니다.
최적화: 코드를 검사하고 다시 작성하여 앱 DEX 파일의 크기를 더 줄입니다. 예를 들어, if/else 구문의 else {} 브랜치가 전혀 사용되지 않음을 R8에서 감지한 경우 R8이 else {} 브랜치 코드를 삭제합니다.
악용적으로 사용자가 코드를 뜯었을때 난독화처리를하여 읽을수 이해하기 어렵게 만드는 장점도 있습니다.
방법
1. 난독화 옵션 키기
buildgradle <app>
1
2
3
4
5
6
7
8
9
10
|
buildTypes {
getByName("release") {
minifyEnabled true
shrinkResources true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
)
}
}
|
위와 같이
minifyEnabled true
shrinkResources true
로 설정해주면 R8 난독화를 간단하게 사용할 수 있습니다. (Android Gradle 플러그인 3.4.0 이상에서)
2. 난독화 적용 후 예외처리.
- 사실 난독화는 적용이 어렵다기보단 난독화를 하지않아야할 class 및 함수를 예외처리하는데 신경을 많이써야한다는 점이 어렵습니다.
예) Google에 remote config 를 통한 값을 가져오는 통신에서 data에 난독화가 적용되어 정상적인 값을 못가져오는 현상
난독화 하지않을 부분은 위쪽 코드 proguardFiles에 명시된 곳에 예외처리를 해줘야합니다.
ex)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# 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
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
# 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
# 광고 적용
# 데이터 통신
|
-dontwarn 패키지명.** : 지정해서 경고 무시
-keep class 패키지명.** : 난독화가 필요하지 않은 경우
-ignorewarnings : 경고 무시
-dontoptimize : 최적화 하지 않기
-dontshrink : 사용하지 않는 메소드 유지
-keepclassmembers : 특정 클래스 멤버 원상태 유지
-keepattributes : 내부 클래스 원상태 유지 적용
이후 apk 를 빌드하고 제대로 난독화가 적용됬는지 확인해 보겠습니다.
순서:
1. apk 파일을 jar파일로 변환해 줍니다.
2. jar 파일을 툴을 이용하여 Open 하여 확인.
1. Dex2Jar
apk파일를 jar파일로 변환해 줍니다.
- URL : http://sourceforge.net/projects/dex2jar
- Download : http://sourceforge.net/projects/dex2jar/files
dex2jar - Browse Files at SourceForge.net
VPN은 해킹을 방지하고 온라인 트래픽 흐름을 위한 암호화된 터널이라고 상상해 보세요. 아무도 터널 안을 통해 볼 수 없으며 사용자의 인터넷 데이터를 손에 넣을 수 없습니다. NordVPN은 공용 Wi-Fi를 사용하거나, 밖에서 개인 계정과 직장 계정에 액세스하거나, 또는 자신의 인터넷 사용 기록을 비공개로 안전하게 유지합니다.
sourceforge.net
2. jd-gui
jar 파일의 내용(소스코드)보여 주는 툴
- URL : https://github.com/pxb1988/dex2jar
- Download : https://github.com/java-decompiler/jd-gui/releases
java-decompiler/jd-gui
A standalone Java Decompiler GUI. Contribute to java-decompiler/jd-gui development by creating an account on GitHub.
github.com
가이드.
1. apk 파일을 다운받은 dex2jar-2.0 폴더안에 넣어줍니다.
(저는 test.apk 파일이라고 넣어줬습니다.)
2. CMD 창을 열어 apk 파일이 있는 dex2jar-2.0 폴더로 이동합니다.
3. 명령어를 이용하여 apk 파일을 jar 파일로 만들어줍니다.
명령어 :
d2j-dex2jar.bat -f -o (생성될 jar 파일이름 설정).jar (디컴파일할 APK 파일 이름).apk
4. 다운받은 jd-gui 를 통해 생성된 jar 파일을 Open 해줍니다.
아래 화면처럼 모든 변수 및 작성한 변수 및 함수명이 그대로 보인다면 난독화가 적용되지않은 것.
아래 이미지 처럼 class 명 부터 변수 및 함수명이 모드 변하게됩니다.( ※ proguard 파일에서 예외처리한 부분 제외 )
이상 난독화 (R8) 적용에 대한 예시 및 디컴파일 확인 방법 가이드였습니다.
감사합니다.
'android' 카테고리의 다른 글
URL Scheme 연동 방법 (0) | 2020.03.05 |
---|---|
무료앱 유료앱 2가지 버전 만들기! Flavors를 적용해보자! (0) | 2020.02.16 |
간단한 예제로 보는 Dagger2 적용해보자! - 개발새발블로그 (0) | 2020.02.02 |
저장된 Json 데이터 읽기 (0) | 2019.12.11 |
WebView안에서 javascript 사용하기 (0) | 2019.12.05 |