该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ProGuard简介
是一个压缩、优化和混淆java字节码的免费工具,它可以删除无用的类、字段、方法和属性,可以删除没用的注释,最大限度的优化字节码文件,它还可以使得简短的无意义的名称来重命名已经存在的类、字段、方法和属性:
①删除不可见的字符、注释等无用代码,创建紧凑的代码文档,为了更快的网络传输,快速装载和更小的内存占用。
②重命名,使得创建的程序和程序库很难使得反向工程
③能删除来自原文件的没有调用的代码
④充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件
参数
-include{filename} 从给定的文件中读取配置参数
-basedirectory{basedirectory} 指定基础目录为以后相对应的档案名称
-injars{class_path} 指定要处理的应用程序jar、war、ear和目录
-outjars{class_path} 指定处理完要输出的jar、war、ear和目录名称
-libraryjars{class_path} 指定要处理的应用程序jar、war、ear和目录所需要的程序库文件
-dontskipnibpubliclibraryclasses 指定不去忽略非公共的类库
保留选项
-keep {Modifier} {类成员} 保护指定的类文件和类成员
-keepclassmembers {类文件}{类成员} 保护指定类的成员,如果此类收到保护,它们会保护的更好
-keepclasswithmembers{} 保护指定的类和类成员,但条件是所有指定的类和类成员要存在
-keepnames {类名称} 保护指定的类和类成员的名称
-keepclassmembername{类名称} 保护指定的类的成员名称
-keepclasswithmembernames{类名称} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-printseeds{文件名称} 列出类和类的成员-keep选项的清单,标准输出给定的文件
压缩
-dontshrink 不压缩输入的类文件
优化
-dontoptimize 不优化输入的类文件
-assumenosideeffects{类文件} 优化时假设指定的方法,没有任何副作用
-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
混淆
-dontobfuscate 不混淆输入的类文件
-printmapping{文件名}
-applymapping{文件名} 重用映射增加混淆
-obfuscationdictionary{文件名} 使用给定文件的关键字作为要混淆方法的名称
-overloadaggressively 混淆时应用侵入式重载
-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆
-flattenpackagehierarchy{文件名} 重新包装所有重命名的包并放在给定的单一包中
-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
-renamesourcefileattribute{string} 设置原文件中给定的字符串常量
混淆带来的问题
虽然混淆对我们的代码反逆向起到比较良好的作用,但是过度的混淆也会带来很多调试的困难,如
①混淆错误,用到第三方jar的时候,必须告诉ProGuard不要检查,否则ProGuard会报错
②运行错误,当code不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种问题很多
③调试定位比较痛苦,打印的错误信息中错误堆栈是混淆后的代码,开发者自己也看不懂,这个时候需要自己存一份map,来记录对应的混淆映射关系。