• 开源混淆工具ProGuard配置详解及配置实例
    时间:2012-07-28   作者:开源吧   出处:开源吧

    ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.

    ProGuard的作用:
     
    1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.
    2.创建的程序和程序库很难使用反向工程.
    3.所以它能删除来自源文件中的没有调用的代码
    4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件.
     
    参数:
     
    -include {filename}    从给定的文件中读取配置参数
    -basedirectory {directoryname}    指定基础目录为以后相对的档案名称
    -injars {class_path}    指定要处理的应用程序jar,war,ear和目录
    -outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称
    -libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
    -dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。
    -dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。

    保留选项

    -keep {Modifier} {class_specification}    保护指定的类文件和类的成员
    -keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好
    -keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
    -keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
    -keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
    -keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
    -printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件
     
    压缩

    -dontshrink    不压缩输入的类文件
    -printusage {filename}
    -whyareyoukeeping {class_specification}    
     
    优化

    -dontoptimize    不优化输入的类文件
    -assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用
    -allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员
     
    混淆

    -dontobfuscate    不混淆输入的类文件
    -printmapping {filename}
    -applymapping {filename}    重用映射增加混淆
    -obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称
    -overloadaggressively    混淆时应用侵入式重载
    -useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆
    -flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中
    -repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中
    -dontusemixedcaseclassnames    混淆时不会产生形形色色的类名
    -keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
    -renamesourcefileattribute {string}    设置源文件中给定的字符串常量


    Ant Example:

    <!-- This Ant build file illustrates how to process applications,
         by including ProGuard-style configuration options.
         Usage: ant -f applications2.xml -->

    <project name="Applications" default="obfuscate" basedir="../..">

    <target name="obfuscate">
      <taskdef resource="proguard/ant/task.properties"
               classpath="lib/proguard.jar" />

      <proguard>

        <!-- Specify the input jars, output jars, and library jars. -->

        -injars  in.jar
        -outjars out.jar

        -libraryjars ${java.home}/lib/rt.jar
        <!-- -libraryjars junit.jar    -->
        <!-- -libraryjars servlet.jar  -->
        <!-- -libraryjars jai_core.jar -->
        <!-- ...                       -->

        <!-- Save the obfuscation mapping to a file, and preserve line numbers. -->

        -printmapping out.map
        -renamesourcefileattribute SourceFile
        -keepattributes SourceFile,LineNumberTable

        <!-- Preserve all annotations. -->

        -keepattributes *Annotation*

        <!-- Preserve all public applications. -->

        -keepclasseswithmembers public class * {
            public static void main(java.lang.String[]);
        }

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

        -keepclasseswithmembernames class * {
            native &lt;methods&gt;;
        }

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

        -keepclassmembers class * extends java.lang.Enum {
            public static **[] values();
            public static ** valueOf(java.lang.String);
        }

        <!-- 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 class * implements java.io.Serializable {
            static final long serialVersionUID;
            static final java.io.ObjectStreamField[] serialPersistentFields;
            private void writeObject(java.io.ObjectOutputStream);
            private void readObject(java.io.ObjectInputStream);
            java.lang.Object writeReplace();
            java.lang.Object readResolve();
        }

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

      </proguard>
    </target>

    </project>

    网友留言/评论

    我要留言/评论

    相关文章

    在代码重构中蜕变:这几天,要对我半年前写的代码进行一些整理工作,在看代码时发现当时有很多地方写得不够好,俗称的有“坏味道”,呵呵,重构,必须的。
    搞懂java中的synchronized关键字:实际上,我关于java的基础知识的90%以上都来自Thinking in Java。对于其中的synchronized关键字,当时就是浏览一下,大概知道意思,也没有细看。后来一直没有用过这个关键字。昨天看Thinking in Patterns with Java中的Observer模式,看了其中的Observable类的源码,发现里面几乎所有的方法都用了synchronized关键字(不是全部),其中个别用了synchronized(this){}的区块。于是,我发觉有必要好好理解一下这个关键字了。
    JAVA中synchronized与static synchronized 的区别:通过分析这两个关键字的分析,我们可以理解java中锁的概念。一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。
    建造者模式(Builder)举例介绍:Builder模式的定义是:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 首先它意图是要构建一个复杂的对像,而这个复杂的对像往往需要由好几个子对像或分步聚来完成最终的这个对象的构建,而这个复杂对象的子对像经常需要不断的变化,但它的构建过程是相对是稳定的。
    有关Android Activity生命周期详解:生命周期,对于初学者来讲可能比较深奥。在各种面试中,常常会被问到xxx的生命周期是什么样子的,比如:Servlet的生命周期,Spring Bean的生命周期。今天就详细的讲解一下Android Activity 的生命周期。文章主要涉及到如下几个部分:生命周期图,测试代码,结果分析。
    使用Java进行冒泡排序(冒泡排序示例):冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
    Java面试题中关于HashMap的小小总结:面试过程中往往会被问关于HashMap的问题,比如:说说Hashpmap的原理,HashMap怎样保证key的唯一性。下面小编给大家简单介绍一下关于HashMap的小小总结。
    JAVA正则表达式:Pattern类与Matcher类详解:java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
    线上解决Resin服务响应过慢的几个方法:最近Web服务访问量过大,由于服务器配置比较差,数量也较少,导致服务响应过慢。为了优化服务和提高响应,下面总结出几条查询Resin问题的方法。
    Java 中 Listener 模式示例:Listener模式在Java中很常见,并且很有用,下面例举一下Java的Listener模式,希望对大家有所帮助。