Java代码混淆工具ProGuard使用指南(附有1.8以上和以下使用工具)

 更新时间:2025年05月08日 10:59:57   作者:往上爬的泥  
ProGuard是一个开源的Java class文件缩小器、优化器、混淆器和预验证器,它通过删除未使用的类、字段、方法和属性,优化字节码指令,并重命名类、字段和方法,使反编译后的代码难以理解,从而提高应用的安全性,本文给大家详细介绍了ProGuard使用指南,需要的朋友可以参考下

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使用的资料请关注脚本之家其它相关文章!

相关文章

  • log4j2日志异步打印(实例讲解)

    log4j2日志异步打印(实例讲解)

    下面小编就为大家带来一篇log4j2日志异步打印(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Spring Boot异常处理静止trace

    Spring Boot异常处理静止trace

    这篇文章主要介绍了Spring Boot异常处理静止trace,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java ObjectMapper使用详解

    Java ObjectMapper使用详解

    ObjectMapper类是Jackson的主要类,它可以帮助我们快速的进行各个类型和Json类型的相互转换,本文给大家介绍Java ObjectMapper的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • mybatis的ParamNameResolver参数名称解析

    mybatis的ParamNameResolver参数名称解析

    这篇文章主要为大家介绍了mybatis的ParamNameResolver参数名称解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java synchronize线程安全测试

    Java synchronize线程安全测试

    这篇文章主要介绍了Java synchronize线程安全测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Spring的嵌套事务(Propagation.NESTED)到底是个啥案例代码讲解

    Spring的嵌套事务(Propagation.NESTED)到底是个啥案例代码讲解

    SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务,可以选择将状态回滚到某个小事务发生时的样子,本文通过案例代码讲解Spring的嵌套事务(Propagation.NESTED)到底是个啥,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • 详解Springboot Oauth2 Server搭建Oauth2认证服务

    详解Springboot Oauth2 Server搭建Oauth2认证服务

    这篇文章主要介绍了Springboot Oauth2 Server 搭建Oauth2认证服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Java ConcurrentModificationException异常解决案例详解

    Java ConcurrentModificationException异常解决案例详解

    这篇文章主要介绍了Java ConcurrentModificationException异常解决案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • SpringBoot 动态定时器的使用方法

    SpringBoot 动态定时器的使用方法

    这篇文章主要介绍了SpringBoot 动态定时器的使用方法,非常不错,具有一定的参考借鉴借鉴价值,需要的朋友可以参考下
    2018-05-05
  • Spring实战之获取方法返回值操作示例

    Spring实战之获取方法返回值操作示例

    这篇文章主要介绍了Spring实战之获取方法返回值操作,涉及spring配置文件与方法返回值操作相关使用技巧,需要的朋友可以参考下
    2019-12-12

最新评论