什么是Proguard?
Proguard是一个Java字节码混淆器,可以使Java字节码难以阅读和理解。它可以删除未使用的类、字段、方法并缩小生成的代码大小。在保护Java应用程序中的知识产权方面有广泛的应用。
Proguard Maven插件
Proguard Maven插件是一个Maven插件,可以轻松地将Proguard集成到Maven构建中。该插件支持对Java项目进行混淆,包括生成war、jar、apk等形式的输出。
配置步骤
-
在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反编译工具查看)