1.混淆工具版本html
本文使用的是ProGuard这一款Java代码混淆工具。 由于在咱们实际的开发工做中,有些程序包含了公司核心产品的代码,因此为了保护自身的知识产权,避免程序包不当心外流出去,咱们有必要进行一些保护措施,在程序开发完以后,须要将程序代码进行混淆。java
本文使用的是ProGuard v5.3.3版本。 下载地址:http://www.jb51.net/softs/242707.htmlapache
2.混淆工具安装步骤json
2.1下载后的文件是一个压缩包:eclipse
2.2 解压压缩包ide
3.混淆工具使用步骤函数
3.1 解压后,执行 bin目录下的proguardgui.bat工具
执行proguardgui.bat后如图:优化
注意:执行proguardgui.bat后会出现一个cmd命令框,不要关闭,最小化便可。ui
3.2 点击左侧菜单栏中的“Input/Output”按钮:
3.4 点击右侧菜单栏中的“Add input...”按钮,导入须要被混淆的jar包:
3.5 点击右侧菜单栏中的“Add Output...”按钮,填写配置咱们须要混淆后输出的jar包,输出的jar包须要本身手动填写,jar包名称能够自定义:
配置好jar包输入输出后,如图:
3.6 添加支持库,即eclipse里java project里的libraries全部Library的jar包,点击下方“Library jars,aara,wars,wars,zips,apks,and directories”框右侧“Add”按钮:
添加完毕后,如图所示:
3.7 设置Shrinking,设置如图所示:
3.8 设置Obfuscation,设置如图所示:
3.9 设置Optimization,设置如图所示:
3.10 设置Information,注意Target的jdk版本,设置如图所示:
3.11点击“process”,再点击“save configuration”,在弹出的对话框中,输入要保存的配置文件(首先在指定文件夹下建立一个空test.pro文件,选中test.pro),最后点击“保存”:
3.12 保存完test.pro文件以后,关闭ProGuard,开始手动修改配置文件test.pro,test.pro文件内容在保存时已自动生成内容,咱们只需添加自定义的修改便可,内容以下:
-injars angora_test.jar -outjars angora_test_mix.jar -libraryjars 'C:\Program Files\Java\jre1.8.0_131\lib\rt.jar' -libraryjars 'D:\proguardlib\JavaEWAH-0.3.2.jar' -libraryjars 'D:\proguardlib\RoaringBitmap-0.4.5.jar' #…略 #以上均为以前载入的支持库jar包,此处略 -dontshrink -keeppackagenames -flattenpackagehierarchy '' -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod -keepparameternames #不优化 代码/配置/变量 -optimizations !code/allocation/variable #忽略警告 -ignorewarnings #忽略泛型 -keepattributes Signature #忽略注解 -keepattributes *Annotation* #不要警告找不到com.alibaba.fastjson.**这个包里面的类的相关引用 -dontwarn com.alibaba.fastjson.** #保持com.alibaba.fastjson.**这个包里面的全部类和全部方法而不混淆 -keep class com.alibaba.fastjson.**{*;} -dontwarn com.groovy.util.** -keep class com.groovy.util.**{*;} -dontwarn com.apache.common.** -keep class com.apache.common.**{*;} -dontwarn com.codehaus.groovy.** -keep class com.codehaus.groovy.**{*;} -keep class com.bynear.main.**{*;} -keep class com.bynear.main.dispatcher.**{*;} # Keep names - Native method names. Keep all native class/method names. -keepclasseswithmembers,includedescriptorclasses,allowshrinking class * { native <methods>; } # Keep names - _class method names. Keep all .class method names. This may be # useful for libraries that will be obfuscated again with different obfuscators. -keepclassmembers,allowshrinking class * { java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String,boolean); } # Remove - System method calls. Remove all invocations of System # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.System { public static long currentTimeMillis(); static java.lang.Class getCallerClass(); #…略 } # Remove - Math method calls. Remove all invocations of Math # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.Math { public static double sin(double); public static double cos(double); #…略 } # Remove - Number method calls. Remove all invocations of Number # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.* extends java.lang.Number { public static java.lang.String toString(byte); public static java.lang.Byte valueOf(byte); #…略 } # Remove - String method calls. Remove all invocations of String # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.String { public static java.lang.String copyValueOf(char[]); public static java.lang.String copyValueOf(char[],int,int); #…略 } # Remove - StringBuffer method calls. Remove all invocations of StringBuffer # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.StringBuffer { public java.lang.String toString(); public char charAt(int); #…略 } # Remove - StringBuilder method calls. Remove all invocations of StringBuilder # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.StringBuilder { public java.lang.String toString(); public char charAt(int); #…略 }
3.13 自定义配置文件说明:
3.13.1 这里是列表文本解决Proguard的bug:“java.lang.ClassFormatError: LVTT entry for 'clazz' in class file ** does not match any LVT entry”,须要配置如下参数:
#不优化 代码/配置/变量 -optimizations !code/allocation/variable #忽略警告 -ignorewarnings #忽略泛型 -keepattributes Signature #忽略注解 -keepattributes *Annotation*
3.13.2 解决找不到引用的类是第三方包里面的状况,由于这种状况会在混淆过程当中报错,致使不能混淆代码,须要配置如下参数:
#不要警告找不到com.alibaba.fastjson.**这个包里面的类的相关引用 -dontwarn com.alibaba.fastjson.** #保持com.alibaba.fastjson.**这个包里面的全部类和全部方法而不混淆 -keep class com.alibaba.fastjson.**{*;}
3.13.3 为了保证jar包的正常运行,咱们不混淆main函数所在的类,须要配置如下参数:
#保持com.bynear.main.**这个包里面的全部类和全部方法而不混淆 -keep class com.bynear.main.**{*;} #保持com.bynear.main.dispatcher.**这个包里面的全部类和全部方法而不混淆 -keep class com.bynear.main.dispatcher.**{*;}
3.14 从新启动ProGuard,加载配置文件test.pro,点击左菜单“ProGuard”,而后点击“Load configuration”,选择以前配置好的pro文件,打开便可,如图:
3.15 选择作菜单“Process”,点击下方“View configuration”,查看配置文件内容是否正确,最后点击下方右侧“Porcess!”,程序开始进行混淆,如图:
3.16 出现“Processing completed successfully”,表明混淆成功!如图:
本文只是一个简单的ProGuard入手操做的示例,方便你们快速上手使用,其实ProGuard还有许多自定义的内容,你们能够在网上搜索更多关于ProGuard的内容进行了解。