java项目一般是打包成jar运行或者作为依赖给第三方使用的,有的时候,可能不想被别人反编译,于是就对关键部分进行混淆,让代码变得普通人看不懂的地步,很多关键字和变量都是用单个字母表示,达到一种类似加密的效果。
java中混淆框架proguard,准确来说是一个插件,不需要对他进行编码,只需要进行配置即可。代码混淆,并不是把所有代码进行混淆,这样反而会出错,比如枚举类型如果也进行混淆,那么在使用反射创建实例,并给实例赋值的时候,枚举类型会反序列化失败。
proguard提供了可以对哪些包,类,方法等不进行混淆的配置,我们可以将枚举配置在这里。
因为springboot提供了打包插件spring-boot-maven-plugin,所以我们的混淆需要在springboot打包的插件之前,就是我们要对混淆之后的代码通过spring-boot-maven-plugin进行打包。
下面是一个配置示例proguard.cfg:
# 指定不警告尚未解决的引用和其他问题
-dontwarn
# JDK目标版本1.8
-target 1.8
# 不做收缩(删除注释、未被引用代码)
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
# 混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
# 不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
# 指定不跳过包可见的库类成员(字段和方法)。
# 默认情况下,proguard在解析库类时会跳过包可见的库类成员。当我们确实引用了包可见的类成员时,需要设置此项
-dontskipnonpubliclibraryclassmembers
# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 不混淆所有包名
#-keeppackagenames
# 需要保持的属性:异常,注解等
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
# spring 相关的注解,不要混淆
-keepclassmembers class * {
@org.springframework.** *;
@javax.annotation.PostConstruct *;
@javax.annotation.PreDestroy *;
}
# spring 相关的注解,不要混淆
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired <fields>;
@org.springf