Android/App개발2010. 10. 28. 14:18

코드 난독화툴을 안드로이드 프로젝트에 적용하는 포스트를 이미 올린바 있습니다.
이번에는 프로젝트에서 일부 클래스들만 묶어서 배포하고자 하는 경우 jar파일로 만드는 경우가 있을 것인데 이 경우 jar file하나만 proguard를 적용하는 방법에 대해 설명하겠습니다.

프로가드 gui툴을 이용하면 편하게 진행이 가능합니다.
프로가드 사용시 중요한 것이 옵션을 어떻게 지정할 것인가에 대한 것인데.. 그 중에도 -keep옵션이 아주 중요하다 할 것입니다.
안드로이드 소스코드 난독화를 위해서 레퍼런스로 사용할 만한 옵션을 아래 나열해 보았습니다.

# 각종 옵션들 : 설명은 생략~~ proguard site의 설명을 참조하시길...

-dontskipnonpubliclibraryclassmembers

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontpreverify

-verbose


# keep option들.. 

# keep옵션이란 난독화시 난독화를 하지 않아야 하는 코드들을 미리 지정하는 것으로 

# 안드로이드 jar파일이나 프로젝트의 경우 아래의 keep옵션들이 필요할 것입니다.

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Application

-keep public class * extends android.app.Service

-keep public class * extends android.content.BroadcastReceiver

-keep public class * extends android.content.ContentProvider

-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembers,allowshrinking class * {

    public <init>(android.content.Context,android.util.AttributeSet);

}

-keepclasseswithmembers,allowshrinking class * {

    public <init>(android.content.Context,android.util.AttributeSet,int);

}

# Also keep - Enumerations. Keep the special static methods that are required in

# enumeration classes.

-keepclassmembers enum  * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

# Keep names - Native method names. Keep all native class/method names.

-keepclasseswithmembers,allowshrinking class * {

    native <methods>;

}


위 옵션들과 함께 입력파일과 출력파일을 지정하고 참조하고 있는 라이브러리까지 지정하는 스크립트 코드는 아래와 같습니다.


# 난독화를 진행할 입력 파일명

-injars myjar.jar

# 난독화를 거친 출력 파일명

-outjars out_myjar.jar


# 입력파일이 참조하는 라이브러리들...

# 안드로이드용 jar라면 android.jar를 반드시 포함해야 할것이다.

# 그 외에 혹시 추가로 참조하는 라이브러리가 있다면 추가해 주어야 한다.

-libraryjars /Users/yosamlee/Desktop/android-sdk-mac_x86/platforms/android-7/android.jar

-libraryjars /Users/yosamlee/_TOOL/workspace/MyJar/lib/referencelib.jar



위의 스크립트를 모두 모아서 확장자 *.pro로 저장한다.


proguard설치 폴더로 가서 bin폴더의 proguardgui를 실행한다. 아래와 같은 커맨드라인 명령을 콘솔에서 입력하면 됩니다.


java -jar ../lib/proguardgui.jar




위 화면에서 "Load configuration ..."을 선택 후 앞서 저장해 둔 스크립트파일을 오픈합니다


스크립트 파일이 성공적으로 열렸다면 Process tab에서 "Process!"버튼을 선택하면 난독화 과정을 거칩니다.


...

  Number of branch peephole optimizations:     0

  Number of simplified instructions:           0

  Number of removed instructions:              0

  Number of removed local variables:           0

  Number of removed exception blocks:          0

  Number of optimized local variable frames:   0

Shrinking...

Removing unused program classes and class elements...

  Original number of program classes: 26

  Final number of program classes:    26

Obfuscating...

Writing output...

Preparing output jar [/Users/yosamlee/_TOOL/workspace/MyJar/bin/out_myjar.jar]

  Copying resources from program jar [/Users/yosamlee/_TOOL/workspace/MyJar/bin/myjar.jar]

Processing completed successfully


정상적으로 과정이 진행되었다면 위와 같은 성공하였다는 메세지를 보게 될것입니다.


이제 out_myjar.jar파일을 리버스엔지니어링 해보길 바랍니다.

원하는 만큼 난독화가 진행되었는지 말이죠~!

만족할 만한 결과가 나왔기를 바랍니다.


ps) 이미 느끼신 분들도 계시겠지만 위 과정은 proguardgui버전에서 그대로 수행이 가능합니다. 저는 왜 수동으로 스크립트를 만들었냐면요.... 옵션들이 하도 많아서 헤깔려서요. GUI버전이 편하신 분들은 그걸 사용하셔도 됩니다.







Posted by 삼스

댓글을 달아 주세요

  1. 희미한 달빛이 샘물 위에 떠있으면,나는 너를 생각한다.

    2013.07.13 07:16 [ ADDR : EDIT/ DEL : REPLY ]
  2. 당신은 내가사랑할 만한 사람이 아니예요,사랑하지 않으면 안될 사람이예요.

    2013.07.18 09:47 [ ADDR : EDIT/ DEL : REPLY ]