1.混淆工具版本
proguard是一款java代码混淆工具。 在开发组件功能对涉及到公司的核心代码时,我们需要对项目组件进行jar包加密。
2、混淆工具使用步骤
2.1 解压后,执行 bin目录下的proguardgui.bat
2.2、执行proguardgui.bat后
如图:
2.2.1、注意不要关闭dos窗口
执行proguardgui.bat后会出现一个cmd命令框,不要关闭,最小化即可。
2.3、 点击左侧菜单栏中的“input/output”按钮
2.4、点击右侧菜单栏中的“add input...”按钮,导入需要被混淆的jar包,选择文件类型-所有文件
2.5、点击右侧菜单栏中的“add output...”按钮,填写配置我们需要混淆后输出的jar包
输出的jar包需要自己手动填写,jar包名称可以自定义 ,所有的jar包类型。
2.6、配置好jar包输入输出后
如图:
2.7、添加支持库
即eclipse里java project里的libraries所有library的jar包,或者是idea maven项目中的依赖文件
2.7.1、点击下方“library jars,aara,wars,wars,zips,apks,and directories”框右侧“add”按钮
2.7.2、idea 的lib文件 例如:git 拉取的项目位置 \....\target\.....\web-inf\lib (下面有所有依赖的jar包)
当前项目中需要依赖的jar包等
导出maven工程lib依赖
pom.xml 方法一: <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-dependency-plugin --> <!--将所依赖的jar包插件导到 -maven将依赖项复制到target/lib中--> <dependency> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-dependency-plugin</artifactid> <version>3.1.1</version> </dependency> 方法二: <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-dependency-plugin</artifactid> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 拷贝项目依赖包到lib/目录下 --> <outputdirectory>${project.build.directory}/lib</outputdirectory> <!-- 间接依赖也拷贝 --> <excludetransitive>false</excludetransitive> <!-- 带上版本号 --> <stripversion>false</stripversion> </configuration> </execution> </executions> </plugin>
2.8、添加需要的jar包资源
2.9、全不选
2.10、推荐勾选,ukf kk c
2.10.1、混淆规则
2.11、使用默认规范
2.12、当前创建jar的环境
2.13、点击“process”,再点击“save configuration”,在弹出的对话框中,输入要保存的配置文件
首先在指定文件夹下创建一个空test.pro文件,选中test.pro),最后点击“保存”:
2.14、保存完test.pro文件之后,关闭proguard,开始手动修改配置文件test.pro
test.pro文件内容在保存时已自动生成内容,我们只需添加自定义的修改即可,内容如下:
具体内容:
proguard.pro 文件的混淆规则(test.pro)
2.14.1、自定义配置文件说明
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*
2、解决找不到引用的类是第三方包里面的情况,因为这种情况会在混淆过程中报错,导致不能混淆代码,需要配置以下参数:
#不要警告找不到com.alibaba.fastjson.**这个包里面的类的相关引用 -dontwarn com.alibaba.fastjson.** #保持com.alibaba.fastjson.**这个包里面的所有类和所有方法而不混淆 -keep class com.alibaba.fastjson.**{*;}
3、混淆代码:
#不优化 代码/配置/变量 -optimizations !code/allocation/variable #忽略警告 -ignorewarnings #忽略泛型 -keepattributes signature #忽略注解 -keepattributes *annotation* #不要警告找不到com.alibaba.fastjson.**这个包里面的类的相关引用 -dontwarn com.alibaba.fastjson.** #保持com.alibaba.fastjson.**这个包里面的所有类和所有方法而不混淆 -keep class com.alibaba.fastjson.**{*;} #保持这个类及其内容不被混淆 -keep class com.licenseauthorization.clientservices.common.config.interceptorconfig{*;} #保持只保留类名 -keep class com.licenseauthorization.clientservices.common.config.licensecheckedfilter #保持只保留类名 -keep class com.licenseauthorization.clientservices.common.config.licensechecklistener #保持该类下所有的共有方法不被混淆 -keep class com.licenseauthorization.clientservices.licensematch.licenseverify{public <methods>;} #保持这个包里面的所有类和所有方法而不混淆 -keep class com.licenseauthorization.clientservices.common.utils.**{*;} #保持这个包里面的所有类和所有方法而不混淆 -keep class com.licenseauthorization.license.entity.**{*;}
4、重新启动proguard,加载配置文件test.pro,点击左菜单“proguard”,然后点击“load configuration”,选择之前配置好的pro文件,打开即可,如图:
5、选择做菜单“process”,点击下方“view configuration”,查看配置文件内容是否正确,最后点击下方右侧“porcess!”,程序开始进行混淆,如图:
6、出现“processing completed successfully”,代表混淆成功!如图:
3、可能遇到的问题
1.提示:warning: can’t find referenced class xxx
解决:-dontwarn javax.crypto.** -keep class javax.crypto.** 其他类似警告也如此处理
2.提示 there were 4 unresolved references to classes or interfaces. you may need to add missing …
解决:如果jar包没有问题,则 在proe文件中,加一行 -ignorewarnings
3.问题:
解决:当前的proguard 版本过低,需要换更高的proguard版本,或者是将依赖的jar包降低到可以让proguard解析
4.问题
构建该jar包需要的依赖结构不够完整,就是创建这个jar包的代码实现所需要引用的import的依赖不完整 (具体可以将所有的jar包都导出来,具体看maven工程导出所有的lib 依赖)
您似乎缺少一些类,导致类层次结构不完整,请参阅手册中的疑难解答页面:
proguard manual: home | guardsquare
5.问题:在编写pro文件做jar包数据混淆的时候没有写对代码,或者是代码规范出错
原因:
4、其他查阅
proguard.pro 文件的混淆规则
proguard包括四个功能,shrinker(压缩), optimizer(优化),obfuscator(混淆),preverifier(预校验),他们的作用分别是:
shrink: 检测并移除没有用到的类,变量,方法和属性;
optimize: 优化代码,非入口节点类会加上private/static/final, 在字节码级别执行优化,让应用运行的更快。。
obfuscate: 增大反编译难度,类和类成员会被随机命名,除非用keep保护。
preverify: 预校验代码是否符合java1.6或者更高的规范.
除了proguard之外,还有一个dexguard,是专门用来优化混淆android应用的。它包括资源混淆,字符串加密,类加密和dex文件分割等。它是在android编译的时候直接产生dalvik字节码.......
混淆后我们会在工程目录app/build/outputs/mapping/release(debug)下找到一个mapping.txt文件,这就是混淆规则,我们可以根据这个文件把混淆后的代码反推回源本的代码,所以这个文件比较重要,请妥善保管
5、优先查阅
#不优化 代码/配置/变量 -optimizations !code/allocation/variable #忽略警告 -ignorewarnings #忽略泛型 -keepattributes signature #忽略注解 -keepattributes *annotation* #不要警告找不到com.alibaba.fastjson.**这个包里面的类的相关引用 -dontwarn com.alibaba.fastjson.** #保持com.alibaba.fastjson.**这个包里面的所有类和所有方法而不混淆 -keep class com.alibaba.fastjson.**{*;} #保持这个类及其内容不被混淆 -keep class com.licenseauthorization.clientservices.common.config.interceptorconfig{*;} #保持只保留类名 -keep class com.licenseauthorization.clientservices.common.config.licensecheckedfilter #保持只保留类名 -keep class com.licenseauthorization.clientservices.common.config.licensechecklistener #保持该类下所有的共有方法不被混淆 -keep class com.licenseauthorization.clientservices.licensematch.licenseverify{public <methods>;} #保持这个包里面的所有类和所有方法而不混淆 -keep class com.licenseauthorization.clientservices.common.utils.**{*;} #保持这个包里面的所有类和所有方法而不混淆 -keep class com.licenseauthorization.license.entity.**{*;}
-keep class com.xzt.demotwo.* # 一颗星只保持本包的类名(不包含内容) -keep class com.xzt.demotwo.** # 二颗星表示保持本包和子包下的类名(不包含内容) #只保持本包的类名和内容 -keep class com.xzt.demotwo.*{*;} #可以保持本包和子包的类名和内容 -keep class com.xzt.demotwo.**{*;} #你还可以在<fields>或<methods>前面加上private 、public、native等来进一步指定不被混淆的内容,如 #包下的所有公共方法 -keep class com.xzt.demotwo{ public <methods>; } #保持某个具体的类名不被混淆 -keep class com.xzt.demotwo.mainactivity #保持某个具体的类及其内容不被混淆 -keep class com.xzt.demotwo.mainactivity{*;} #保持类中特定内容,而不是所有的内容可以使用如下: -keep class com.xzt.demotwo.mainactivity{ 〈init〉;#匹配所有构造器 〈fields〉;#匹配所有域 〈methods〉;#匹配所有方法 } #表示mainactivity下的所有public方法都不会被混淆,当然你还可以加入参数,比如以下表示用jsonobject作为入参的构造函数不会被混淆 -keep class com.xzt.demotwo { public <init>(org.json.jsonobject); } #保持类中特定内容,还可以进一步缩小范围 -keep class com.xzt.demotwo.mainactivity{ public ;#保持该类下所有的共有方法不被混淆 public *;#保持该类下所有的共有内容不被混淆 private ;#保持该类下所有的私有方法不被混淆 private *;#保持该类下所有的私有内容不被混淆 public (java.lang.string);#保持该类的string类型的构造方法 } #在方法后加入参数,限制特定的构造方法 -keep class com.xzt.demotwo.mainactivity{ public (string); } #要保留一个类中的内部类及其内容不被混淆需要用 $ 符号 -keep class com.xzt.demotwo.mainactivity$myclass{*;} #使用java的基本规则来保护特定类不被混淆,比如用extends,implement等这些java规则, #如下:保持android底层组件和类不要混淆 -keep public class * extends android.app.activity -keep public class * extends android.app.application -keep public class * extends android.app.service -keep public class * extends android.content.broadcastreceiver -keep public class * extends android.content.contentprovider -keep public class * extends android.view.view #如果不需要保持类名,只需要保持该类下的特定方法保持不被混淆, #需要使用keepclassmembers,而不是keep,因为keep方法会保持类名。 #保持mainactivity类下test(string)方法不被混淆 -keepclassmembernames class com.xzt.demotwo.mainactivity{ public void test(java.lang.string); }
# 如果拥有某成员,保留类和类成员 -keepclasseswithmembernames class com.xzt.demotwo.mainactivity
以上就是java代码混淆工具proguard使用指南(附有1.8以上和以下使用工具)的详细内容,更多关于java proguard使用的资料请关注代码网其它相关文章!
发表评论