ProGuard是一个集Java的压缩、优化、混淆三个功能一工具。提供了命令行、UI方式。以下是使用ant方式的样例
<proguard printseeds="on" ignorewarnings="true" optimize="true"> <injar file="${out.jar}" /> <outjar file="${obfuscate.jar}" /> <libraryjar file="${java.home}/lib/rt.jar"> <fileset dir="${root.dir}"> <include name="libs/**/*.jar" /> <include name="WebContent/WEB-INF/lib/*.jar" /> </fileset> </libraryjar> <keepattribute name="LineNumberTable" /> <!-- 保留废弃的方法 --> <keepattribute name="Deprecated" /> <!-- 保留所有的注解 --> <keepattribute name="*Annotation*" /> <keepattribute name="Exceptions" /> <!-- 保留签名,解决泛型问题 --> <keepattribute name="Signature" /> <!-- Preserve all public classes, and their public and protected fields and methods. --> <keep access="public" > <field access="public protected" /> <method access="public protected" /> </keep> <!-- Preserve all .class method names. --> <keepclassmembernames access="public"> <method type="java.lang.Class" name="class$" parameters="java.lang.String" /> <method type="java.lang.Class" name="class$" parameters="java.lang.String,boolean" /> </keepclassmembernames> <!-- 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" /> <field access="static final" type="java.io.ObjectStreamField[]" name="serialPersistentFields" /> <method access="private" type="void" name="writeObject" parameters="java.io.ObjectOutputStream" /> <method access="private" type="void" name="readObject" parameters="java.io.ObjectInputStream" /> <method type="java.lang.Object" name="writeReplace" parameters="" /> <method type="java.lang.Object" name="readResolve" parameters="" /> </keepclassmembers> </proguard>