티스토리 뷰

프로그래밍/Android

[Android] Proguard

DwEnn 2019. 2. 19. 14:54
728x90
반응형

Proguard

  1. Proguard ?
  2. 사용법
  3. References

Proguard ?

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or higher, or for Java Micro Edition.

[원문] : https://www.guardsquare.com/en/products/proguard

ProGuard는 무료 Java 클래스 파일 축소기, 최적화기, 난독화기, 프리버레이터다.

사용되지 않는 클래스, 필드, 방법, 속성을 검출해 제거한다. 그것은 byecode를 최적화하고 사용하지 않는 지시사항을 제거한다.

짧은 의미 없는 이름을 사용하여 나머지 클래스, 필드, 방법의 이름을 바꾼다. 마지막으로, Java 6 이상, 또는 Java Micro Edition에 대해 처리된 코드를 사전 검증한다.

필요한 이유

  • 코드 난독화를 통해 디컴파일시 본인의 코드가 노출되는 것을 방지할 수 있다.

  • 불필요한 메소드를 제거하여 멀티덱스(Multidex)를 피할 수 있다.

멀티덱스(Multidex)

안드로이드 앱을 구성하는 코드는 컴파일 되어 덱스(dex) 파일로 만들어진다.

하나의 덱스파일에는 최대 65536개의 메소드만 참조할 수 있다. 만약 프로젝트의 코드가 65536개의 메소드를 초과하게 되면 덱스파일이 여러 개가 생성된다.

그러면 멀티덱스를 사용하여 컴파일 할 수 있지만, 빌드 과정에서 앱 내의 파일을 여러 개의 덱스파일로 나누어야 하므로 빌드 속도가 느려지고 apk 용량이 커지게 된다.

사용법

프로젝트에 적용

아주 쉽다 app 의 build.gradle 에 다음과 같이

minifyEnalbed true 설정해 주면 된다.

 buildTypes {
         release {
             minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

release 시에 proguard 를 적용하겠다는 것인데

debug 시에도 적용하고 싶다면 releasedebug 로 바꾸어 똑같이 추가하면 된다.

하지만 proguard 적용 시 빌드를 느리게 하기 때문에 release 에 적용하는게 보통이다.

Proguard 옵션

-injars MyApp.jar 난독화를 진행할 입력 파일명

-outjars OutMyApp.jar 난독화를 거친 출력 파일명

-dontoptimize 최적화 하지 않기

-dontshrink 사용하지 않는 메소드 유지

 // 난독화를 수행하지 않을 클래스 정의
 -keep [classType] [packageName].[className] {
  [methodType] [methodName]([params]);
 }
  • classType : class, interface, enum 중 선택 할 수 있다.

  • methodType : 접근지정자, 리턴타입을 모두 포함한다. *** 로 정의 시 임의로 모든 타입에 해당한다.

앞에 private/protected/public 이 포함 된다면 (+static도 추가 가능)

**로 리턴 타입은 아무 것이나 지정 가능하다.

내부로 들어가는 데이터 형은 packageName 을 포함한 풀 네임이어야 한다. ( String 이라면, java.lang.String )

-keep class com.example.classname ClassNotFoundException 에러나 난독화를 진행하지 않고 유지

-keepclassmembers class com.example.classname {접근제어자*;} 특정 클래스의 멤버 원상태로 유지

-keepattributes InnerClasses 내부클래스 원상태 유지 적용

-keepattributes SourceFile, LineNumberTable

소스 난독화 시 Exception 이 발생하면 Unknown Source 로 표시되어 소스 위치를 알 수 없다.

위는 소스 파일의 라인을 섞지 않는 옵션으로, 설정 시 stack trace 에서 소스 파일과 줄 번호를 확인 할 수 있다.

-dontwarn [packageName] 지정해서 경고 무시

-dontnote [packageName] Note를 무시

Note 는 컴파일러로 말하면 Warning 같은 존재이지만 proguard 에서는 컴파일러의 Error 와 같은 취급이다.

* : 바로 아래의 서브 클래스만 해당한다.

** : 서브 클래스의 서브 클래스를 포함한 모든 클래스를 지칭한다.

( 예 : java.** : java 로 시작하는 모든 패키지의 클래스를 의미한다. )

-ignorewarnings 경고 무시

 # 나중에 문제 발생  확인하기 위한 Mapping 파일
 # 빌드 Mapping seed usage config 파일을 만들어주는 옵션
 -printmapping map.txt
 -printseeds seed.txt
 -printusage usage.txt
 -printconfiguration config.txt

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

-repackageclasses [packageName] 이름이 바뀐 모든 클래스 파일을 하나의 지정된 패키지로 옮겨 재 패키징

-dontskipnonpubliclibraryclassmembers 패키지에 표시되는 라이브러리 클래스 멤버(필드 및 메소드) 를 무시하지 않도록 지정


상세 옵션 : https://www.guardsquare.com/en/products/proguard/manual/usage

References

안드로이드 프로가드 설정하기

Android Developers : 코드 및 리소스 축소

ProGuard 코드 난독화/최적화 설정

프로가드 사용법

안드로이드 앱 난독화


반응형
공지사항
최근에 올라온 글