proguard混淆编辑过程

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)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面...
    于晓飞93阅读 56,987评论 38 230
  • 说明:本文参考(翻译)自Android SDK根目录下的proguard目录下的说明文档,是其中的一篇。,文中除了...
    一件小毛衣阅读 85,902评论 9 86
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • 应用混淆(ProGuard) ProGuard是一个免费的JAVA类文件压缩,优化,混淆器。 它探测并删除没有使用...
    Reathin阅读 14,055评论 0 20
  • 1.What and why? What? 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的...
    言者无知_n4c阅读 7,005评论 0 1