java

proguard混淆编辑过程

2017-04-11  本文已影响0人  匿名wm

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包中单独调用的可以直接混淆。

上一篇 下一篇

猜你喜欢

热点阅读