<h1>一、开始原因</h1>
<p> 因公司需要,故研究 proguard 混淆代码,期间踩了不少坑,记录一下过程,避免下次再次踩坑,也希望可以帮到大家。代码环境: spring-boot 2.2.5, jdk 1.8, maven 3.6</p>
<p> </p>
<h1>二 、proguard 使用 (使用 xml ,maven插件的形式配置使用,以下配置为最终配置)</h1>
<p> 1、在需要混淆的代码 pom.xml 中添加以下 plugin</p>
<pre class="blockcode"><code class="language-XML"><plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<executions>
<execution>
<!--混淆时刻,这里是打包的时候混淆-->
<phase>package</phase>
<!--使用插件的什么功能,当然是混淆-->
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<proguardVersion>6.2.2</proguardVersion>
<!--是否将生成的PG文件安装部署-->
<!--<attach>true</attach>-->
<!--是否混淆-->
<!--<obfuscate>true</obfuscate>-->
<!--指定生成文件分类-->
<!--<attachArtifactClassifier>pg</attachArtifactClassifier>-->
<!-- 加载配置文件 -->
<proguardInclude>../proguard.cfg</proguardInclude>
<!-- 对什么东西进行加载,这里仅有classes成功,毕竟你也不可能对配置文件及JSP混淆吧-->
<injar>classes</injar>
<!--class 混淆后输出的jar包 或 文件夹-->
<outjar>${project.build.finalName}.jar</outjar>
<!-- <outjar>${project.build.finalName}-pg</outjar>-->
<!-- 输出目录-->
<outputDirectory>${project.build.directory}</outputDirectory>
<libs>
<!-- Include main JAVA library required.-->
<lib>${java.home}/lib/rt.jar</lib>
<!-- Include crypto JAVA library if necessary.-->
<lib>${java.home}/lib/jce.jar</lib>
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>5.3.3</version>
</dependency>
</dependencies>
</plugin></code></pre>
<p> 2、上面配置中 <proguardInclude>../proguard.cfg</proguardInclude>,proguard.cfg 这个文件。</p>
<pre class="blockcode"><code class="language-java"># -keep {Modifier} {class_specification} 防止类和成员被移除或者被重命名
# -keepclassmembers {modifier} {class_specification} 防止成员被移除或者被重命名
# -keepclasseswithmembers {class_specification} 防止拥有该成员的类和成员被移除或者被重命名
# -keepnames {class_specification} 防止成员被重命名
# -keepclasseswithmembernames {class_specification} 防止拥有该成员的类和成员被重命名
# -keepclasseswithmembers
# -basedirectory directoryname 在配置文件中出现的相对路径均是相对于该路径
# JDK目标版本1.8
-target 1.8
# 不做收缩(删除注释、未被引用代码)
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
# 不用大小写混合类名机制
-dontusemixedcaseclassnames
# 不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 不混淆所有包名
#-keeppackagenames
# 指定要保留在输出文件内的目录(解决 spring autowire 装配失败的问题)
-keepdirectories
#-keepdirectories target\classes\cn\hongxin\busi\online\cgform\business\RestBusiness.class
#-keepdirectories cn.hongxin.busi.online.cgform.business.*
# 需要保持的属性:异常,注解等
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
#混淆时是否记录日志
#-verbose
# 不混淆所有的set/get方法
-keepclassmembers public class * {void set*(***);*** get*();}
-keep class cn.hongxin.codegenerate.generate.** { *;}
-keep class cn.hongxin.codegenerate.SettingUtils { *;}
-keep class cn.hongxin.codegenerate.database.** { *;}
-keepclassmembers class cn.hongxin.busi.online.cgform.controller.** { private *;}
-keep class cn.hongxin.busi.online.config.** { *;}
-keep class cn.hongxin.busi.online.cgreport.entity.** { *;}
-keep class cn.hongxin.busi.online.cgreport.mapper.** { *;}
-keep class cn.hongxin.busi.online.cgform.mapper.** { *;}
-keep class cn.hongxin.busi.online.cgform.business.** { *;}
-keep class cn.hongxin.busi.online.cgform.enums.ExecuteSqlEnum { *;}
-keep class cn.hongxin.busi.online.cgform.util.SqlParamUtil { *;}
-keep class cn.hongxin.busi.client.impl.* { *;}
-keep class cn.hongxin.busi.client.aop.* { !private <methods>; }
# 指定IOnlCgformHeadServic |
|