1.proguard下载地址
http://proguard.sourceforge.net/下载proguard,目前我下载并使用的是proguard5.3.3。
2.打包jar包
proguard是对打包后的jar包进行混淆编译,将包名、类名等转为a~z格式,从而起到混淆作用。所以首先对项目中需要混淆编译的代码进行打包。详细打包过程参见“eclipse打包jar过程”一文。
3.proguard混淆编译
进入下载好的proguard5.3.3目录的bin目录下,双击“proguardgui.bat”即可打开该软件,如下图:
接着按照下面截图步骤一步步操作:
上面保存好该jar包的.pro文件后,在Editplus直接打开该.pro文件。打开后修改下图指定内容:
上面红色框出的内容,是本jar运行时不需要设置的入口函数类。其他jar按自己需要设置,具体设置格式后面有介绍。此处是将com.kingmes.command包下的所有类不用混淆,但其子包下的类还是会混淆,如果子包也不需要混淆,需要对每一个子包设置。如下:
-keep public class com.kingmes.socket.webutil.* {*;}
-keep public class com.kingmes.socket.config.* {*;}
-keep public class com.kingmes.socket.message.* {*;}//下面的子包中的类需要单独设置
-keep public class com.kingmes.socket.message.data.* {*;}
-keep public class com.kingmes.socket.message.data.json.* {*;}
-keep public class com.kingmes.socket.message.data.json.base.* {*;}
-keep public class com.kingmes.socket.message.data.json.requestbase.* {*;}
设置好后再次打开proguard,导入刚刚修改后的.pro文件:
导入后切换到Process,可以查看导入的配置内容是否正确。检查后点击“Process!”即可进行混淆。
混淆成功,最后会提示“Processing complete successfully”。然后使用jd-gui软件打开混淆后的jar包,如下:
上图中框出的类名、变量名、函数名均用a、b、c表示。
4.pro文件配置说明
参数:
-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} 设置源文件中给定的字符串常量
5.注意事项
由于混淆后包名、类名、函数方法名已经不是原名称,如果外部方法仍用原名称调用肯定会报错。此时不能对这些类或者方法进行混淆,保留原名称,尤其是入口函数类中的main函数。如果混淆了,执行时会提示找不到该类或该main函数。在jar包中单独调用的可以直接混淆。
网友评论