IT_Programming/Dev Tools

[펌] Obfuscator Proguard 간단 사용법

JJun ™ 2011. 2. 14. 11:11

-----------------------------------------------------------------------------------------------

                                                            출처: http://puremon.egloos.com/172320

-----------------------------------------------------------------------------------------------


[명령줄 (-옵션들을 뒤쪽에 연속으로 붙여씀)]

java.exe -jar C:\proguard3.11\lib\proguard.jar


-injars classes
-outjars out
-libraryjars C:\XCE_SKVM_1_3_5\classes\classes.jar
-allowaccessmodification
-overloadaggressively
-dontusemixedcaseclassnames
-verbose
-keep public class * extends javax.microedition.midlet.MIDlet
-keep public class * extends org.kwis.msp.lcdui.Jlet



[옵션 설명]
-injars classes // 입력 디렉터리 또는 아카이브(.jar)
-outjars out      // 출력 디렉터리 또는 아카이브(.jar)

-libraryjars C:\XCE_SKVM_1_3_5\classes\classes.jar 

  // 해당 플랫폼 라이브러리 디렉터리 또는 아카이브

-allowaccessmodification // 접근 권한 수정 허용
-overloadaggressively     // 동일한 이름의 필드 또는 메써드 생성을 허용(바이트 코드 레벨에서

                                    // 허용되는 동일한 멤버 이름)


-dontusemixedcaseclassnames // 대, 소문자 섞인 클래스명을 허용하지 않음
-verbose // 진행상황을 장황하게 표시
-keep public class * extends javax.microedition.midlet.MIDlet
  // MIDlet(MIDP, SKVM) 클래스를 상속받은 public 클래스를 변경하지 않음


-keep public class * extends org.kwis.msp.lcdui.Jlet
  // Jlet(WIPI) 클래스를 상속받은 public 클래스를 변경하지 않음


* 웬만하면 GUI버전(proguardgui.jar)을 이용해서 설정파일(.pro)을 만들어 사용하기를 권장.

   (다른 많은 최적화 옵션이 함께 저장됨)

 

 

 


 

 

 

-----------------------------------------------------------------------------------------------

                                                  출처: http://gtko.springnote.com/pages/1210806

-----------------------------------------------------------------------------------------------


ProGuard 소개
ProGuard (http://sourceforge.net/projects/proguard)는 자바클래스의 축소(shrinker), 최적화(optimizer), 아퓨스케이터(obfuscator) 등을 위한 오픈소스 프로젝트다.
 
 
1) 특징
프로가드는 먼저 대상 입력(일반적 jar, war, zip, ear 또는 디렉토리)에 대해 사용하지 않는 클래스, 필드, 

메소드, 속성등을 제거한다. 다음으로 바이트 코드를 최적화하고, 사용되지 않는 명령을 제거한다.
마지막으로 남아 있는 클래스, 필드, 메소드 등의 이름을 사람이 알아보기 힘들게 짧은 이름으로 변경한다.


               예) name -> a


프로가드는 어떤 코드는 그대로 두고, 어떤 코드는 제거하고, 어떤 코드를 어퓨스케이트할지 결정하기 위해 하나 이상의 진입점(entry points)을 명시할 수 있다. 이런 진입점은 일반적으로 main, applet!!, middlet 등을 갖는 클래스들이다. 명령행을 지원, ant 등에서 사용할 수 있다.
 

 

2) 단계

축소단계(shirink step): 진입점에서 시작하여 재귀적으로 메소드를 실행하며 어떤 클래스, 클래스 멤버들이

                                 사용되었는지 결정. 다른 클래스는 무시. 


최적화 단계(optimization step): 바이트 코드 최적화 수행, 진입점이 아닌 클래스 및 메소드들은

                                             private, static, final 등이 될수 있고, 사용되지 않는 매개변수들은

                                             제거될 수 있으며, 크기가 짧은 메소드들은 인라인 메소드로 변경된다.


어퓨스케이션(obfuscation): 진입점이 아닌 클래스, 클래스 멤버들의 이름을 짧고 의미 없는 이름으로 변경.

                                       이 과정에서 진입점을 유지는 것은 원래의 이름으로 사용될 수 있다는 것을

                                       보장한다.

 

 
3) 설치
다운로드 한 zip을 해재해서 proguard.jar는 이클립스 프로젝트의 lib 디렉토리에 위치 시킨다.

문서, 예제, 소스등은 적당한 곳에 배치한다.

 
proguard/ant/task.properties
proguard = proguard.ant.ProGuardTask
proguardconfiguration = proguard.ant.ConfigurationTask
 


ANT Script
    <target name="obfuscate" depends="build" description="Obfuscate...">
        <taskdef resource="proguard/ant/task.properties"
            classpath="lib/proguard.jar" />
        <proguard printseeds=on">
            <!-- Specify the input jars, output jars, and library jars. -->

            <injar file="${dir.dist}/lib/fileviewer.ori.jar" />
            <outjar file="${dir.dist}/lib/fileviewer.jar" />

            <libraryjar file="${java.home}/lib/rt.jar" />
            <libraryjar file="${dir.lib}/${os.family}/swt-win32.jar" />
            <!-- libraryjar file="junit.jar"           / -->
            <!-- libraryjar file="servlet.jar"         / -->
            <!-- libraryjar file="jai_core.jar"        / -->
            <!-- ...                                   / -->
            <!-- Preserve all public applications. -->
            <keepclasseswithmembers access="public">
                <method access="public static" type="void" name="main" parameters="java.lang.String[]" />
            </keepclasseswithmembers>

            <!-- Preserve all annotations. -->

            <keepattribute name="*Annotation*" />

            <!-- Preserve all native method names and the names of their classes. -->

            <keepclasseswithmembernames>
                <method access="native" />
            </keepclasseswithmembernames>

            <!-- Preserve the methods that are required in all enumeration classes. -->

            <keepclassmembers extends="java.lang.Enum">
                <method access="public static" type="**[]" name="values" parameters="" />
                <method access="public static" type="**" name="valueOf" parameters="java.lang.String" />
            </keepclassmembers>

            <!-- Explicitly preserve all serialization members. The Serializable
             interface is only a marker interface, so it wouldn't save them.
             You can comment this out if your library doesn't use serialization.
             If your code contains serializable classes that have to be backward
             compatible, please refer to the manual. -->

            <keepclassmembers implements="java.io.Serializable">
                <field access="final" type="long" name="serialVersionUID" />
                <method access="private" type="void" name="writeObject" parameters="java.io.ObjectOutputStream" />
                <method access="private" type="void" name="readObject" parameters="java.io.ObjectOutputStream" />
                <method type="java.lang.Object" name="writeReplace" parameters="" />
                <method type="java.lang.Object" name="readResolve" parameters="" />
            </keepclassmembers>

            <!-- Your application may contain more items that need to be preserved;
             typically classes that are dynamically created using Class.forName -->

        </proguard>
    </target>