티스토리 뷰

반응형

[Android] ProGuard 코드 난독화 / 최적화 설정


ᆞProGuard란 

출처 : http://proguard.sourceforge.net/

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.


무료툴이며코드상에서 사용되지 않는 불필요한 코드를 찾고 제거해서 최적화 시켜줌과 동시에 변수의 이름을 의미없는 이름으로 짧게 바꿔 난독화를 해준다. 


* 좀더 강력한 기능을 원하면 http://www.guardsquare.com/dexguard 에서 유료버전을 사용해도 될듯 하다.




ᆞAndroid Studio에서 ProGuard 설정하기 

현재는 안드로이드에서 공직적으로 지원해서 간단한 Gradle 설정으로 적용시킬 수 있다.

출처 : http://developer.android.com/intl/ko/tools/help/proguard.html 


  1    Gradle Builds 설정

프로젝트를 생성하면 아래와 같이 build.gradle의 buildTypes{}에 proguard 설정이 되어있다.

minifyEnabled false라고 기본설정 되어 있는 부분을 true로 바꿔준다. release에서 알 수 있듯 프로젝트를 release할 때 ProGuard가 적용 된다.

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

proguard-android.txt는 android SDK폴더의 tools/proguard/proguard-android.txt에서 수정 할 수 있다. 

ProGuard 메뉴얼을 살펴보면 자세한 설정을 할 수 있다.


추가로 규칙을 정의해 별도로 *-rules.pro 파일을 아래와 같이 적용시켜 주면 기본설정을 변경하지 않고 추가 설정을 할 수 있다

   ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
            'proguard-rules.pro', 'proguard-rules-new.pro'
        }
    }
 
   productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'other-rules.pro'
        }
    }
   ...


Debug Build된 APK로 테스트 하고 싶을 땐 release부분을 복사해서 debug로 바꿔주면 된다.

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

   ...



  2    ProGuard 규칙

-dontoptimize 최적화 하지 않기

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

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

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

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


위 옵션을 proguard-rules-new.pro 또는 proguard-rules-new.pro나 새 .pro 파일에 규칙을 추가해서 등록하도록 한다. 자세한 규칙은  http://proguard.sourceforge.net/manual/usage.html 참조




ᆞ적용 전/후 간단 결과 



아래가 적용 전 화면이다.

라이브러리 클래스 이름이 모두 기존 클래스명으로 나와있고 오른쪽 화면에는 없지만 메소드 명도 그대로 나와있다

Mainactivity의 unusedMethod 메소드 같은 경우에는 상용된 곳이 없지만 그대로 컴파일되어 디컴파일 했을 때에도 나오는걸 알 수 있다.



아래가 적용 화면이다.

라이브러리 클래스 이름이 a,b,c,d...처럼 알파벳 단자리로 표기되어있으며 사용되지 않은 unuesdMethod는 코드에서 사라진 것을 볼 수 있다. 

아래처럼 난독화도 외어있고 최적화도 되어있다. 하지만 난독화가 되어있어도 코드상의 흐름은 더 오랜 시간이 걸리겠지만 충분히 파악 할 수 있을 것이다. 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함