java 代码混淆

Proguard是一个Java字节码混淆工具,用于保护知识产权并减小代码体积。通过ProguardMaven插件,开发者可以方便地将其集成到Maven构建流程中,进行混淆处理。配置包括在pom.xml中添加插件信息,创建混淆配置文件proguard.cfg,然后运行Maven命令执行混淆。混淆效果可以通过反编译工具检查。
摘要由CSDN通过智能技术生成

什么是Proguard?

Proguard是一个Java字节码混淆器,可以使Java字节码难以阅读和理解。它可以删除未使用的类、字段、方法并缩小生成的代码大小。在保护Java应用程序中的知识产权方面有广泛的应用。

Proguard Maven插件

Proguard Maven插件是一个Maven插件,可以轻松地将Proguard集成到Maven构建中。该插件支持对Java项目进行混淆,包括生成war、jar、apk等形式的输出。

配置步骤

  1. 在pom.xml文件中添加以下代码,指定proguard-maven-plugin插件及其版本:

<build>
  <plugins>
   <plugin>
       <groupId>com.github.wvengen</groupId>
       <artifactId>proguard-maven-plugin</artifactId>
       <version>2.6.0</version>
       <configuration>
           <!--需要混淆处理的Jar文件,必须要在outputDirectory下-->
           <injar>test-1.1.0.jar</injar>
           <!--混淆后输出的Jar文件,必须要在outputDirectory下,一般保持injar一致即可(覆盖)-->
           <outjar>test-1.1.0.jar</outjar>
			<!--开启混淆-->
           <obfuscate>true</obfuscate>
			<!--使用根目录下的proguard.cfg混淆配置-->
           <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
           <!--指定需要加入混淆过程中的库文件-->
           <libs>
               <lib>${java.home}/lib/rt.jar</lib>
               <lib>${java.home}/lib/jce.jar</lib>
               <lib>${java.home}/lib/jsse.jar</lib>
           </libs>
           <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
           <!--混淆后Jar输出的基本路径-->
           <outputDirectory>${project.basedir}/output</outputDirectory>
       </configuration>
      </plugin>
  </plugins>
</build>

      2.在项目根目录下创建一个proguard.cfg文件,并添加以下配置代码:

#指定Java的版本
-target 1.8
#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
# 忽略压缩
-dontshrink
#是否关闭字节码级别的优化
-dontoptimize
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings

#对异常、注解信息予以保留
-keepattributes MethodParameters,Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

# 保留Java核心库中所需的类和方法
-keep class java.** { *; }
-keep interface java.** { *; }
-keep enum java.** { *; }

# 保留方法参数名
-keepparameternames
# 保留目录
-keepdirectories
# 保留包名
-keeppackagenames cn.test.**
# 保留枚举成员属性
-keepclassmembers enum cn.test.** { *; }

# 保留所有可被公开访问的元素
-keep class cn.test.** {
    public protected *;
}

# 保留指定注解下的成员属性
-keepclassmembers class cn.test.** {
    @org.springframework.beans.factory.annotation.Autowired *;
    @javax.annotation.Resource *;
    @javax.inject.Inject *;
    @javax.persistence.PersistenceContext *;
    @org.springframework.beans.factory.annotation.Value *;
}

# 指定包名方式:配置相关类保留字段和方法
-keep class cn.test.**.config.** {
    <fields>;
    <methods>;
}
# 指定配置类后缀方式:配置相关类保留字段和方法
-keep class cn.test.**.**Properties {
    <fields>;
    <methods>;
}

# dao层用于映射数据库表的类和 controller 层映射前台参数的类,都需要保留类成员
-keep class cn.test.**.domain.** {
    <fields>;
    <methods>;
}
-keep class cn.test.**.**DTO {
    <fields>;
    <methods>;
}
-keep class * implements java.io.Serializable {
    <fields>;
    <methods>;
}

# 保留AOP切面相关
-keep class cn.test.**.aop.** {
    <fields>;
    <methods>;
}
-keep class cn.test.**.**Aop {
    <fields>;
    <methods>;
}
-keep class cn.test.**.aspect.** {
    <fields>;
    <methods>;
}
-keep class cn.test.**.**Aspect {
    <fields>;
    <methods>;
}
-keep class cn.test.**.interceptor.** {
    <fields>;
    <methods>;
}
-keep class cn.test.**.**Interceptor {
    <fields>;
    <methods>;
}

# 对有main方法的类予以保留
-keepclasseswithmembers public class * { public static void main(java.lang.String[]); }

3.运行Maven命令进行混淆,生成混淆后的Jar文件: mvn proguard:proguard

4.混淆效果(可通过jd-gui.exe反编译工具查看)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tof21

支持原创

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值