美文网首页java
proguard混淆编辑过程

proguard混淆编辑过程

作者: 匿名wm | 来源:发表于2017-04-11 15:45 被阅读0次

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

    相关文章

      网友评论

        本文标题:proguard混淆编辑过程

        本文链接:https://www.haomeiwen.com/subject/kehuattx.html