ProGuard 代码混淆

本文最后更新于:2025年2月18日 下午

一、流程

1、引入插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<build>
<plugins>
<!-- ProGuard混淆插件-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.5.3</version>
<executions>
<execution>
<!-- 混淆时刻,这里是打包的时候混淆-->
<phase>package</phase>
<goals>
<!-- 使用插件的什么功能,当然是混淆-->
<!-- 这里idea爆红警告也无所谓,只要能成功打包就行 -->
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 是否混淆-->
<obfuscate>true</obfuscate>
<!-- <proguardInclude>${basedir}/proguard.cfg</proguardInclude>-->
<options>
<!-- JDK目标版本11-->
<!-- <option>-target 11</option>-->
<!--JDK8-->
<option>-target 1.8</option>
<!-- 不做收缩(删除注释、未被引用代码)-->
<option>-dontshrink</option>
<!-- 不做优化(变更代码实现逻辑)-->
<option>-dontoptimize</option>
<!-- 不路过非公用类文件及成员-->
<option>-dontskipnonpubliclibraryclasses</option>
<option>-dontskipnonpubliclibraryclassmembers</option>
<!--不用大小写混合类名机制-->
<option>-dontusemixedcaseclassnames</option>

<!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
<option>-allowaccessmodification</option>
<!-- 确定统一的混淆类的成员名称来增加混淆-->
<option>-useuniqueclassmembernames</option>
<!-- 不混淆所有包名-->
<option>-keeppackagenames</option>

<!-- 需要保持的属性:异常,注解等-->
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
<!-- 不混淆所有的set/get方法-->
<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>
<!-- 不混淆bean注解的方法-->
<option>-keepclassmembers public class * {
@org.springframework.context.annotation.Bean *;
}</option>

<!-- 不混淆包下的所有类名,且类中的方法也不混淆-->
<option>-keep class com.czy.echat.EchatApplication {
public static void main(java.lang.String[]);
}</option>
<option>-keep class com.czy.echat.model.**{*;}</option>
<!-- 不混淆mapper类-->
<option>-keep class com.czy.echat.dao.**{*;}</option>
<!-- 不混淆其他类似不能识别的类-->
<option>-keep class com.czy.echat.demo.**{*;}</option>
<option>-keep @org.aspectj.lang.annotation.Aspect class *{*;}</option>
<!--忽略warn消息-->
<option>-ignorewarnings</option>
<!--忽略note消息-->
<option>-dontnote</option>
</options>
<!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
<libs>
<!--jdk11配置-->
<!--<lib>${java.home}/jmods</lib>-->
<!--jdk8配置-->
<lib>${java.home}/lib/rt.jar</lib>
</libs>
<!-- 对什么东西进行加载,这里仅有classes成功,毕竟你也不可能对配置文件及JSP混淆吧-->
<injar>${project.build.finalName}.jar</injar>
<!--class 混淆后输出的jar包-->
<outjar>${project.build.finalName}.jar</outjar>
<!-- 输出目录-->
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
<dependencies>
<dependency>
<groupId>com.guardsquare</groupId>
<artifactId>proguard-base</artifactId>
<version>7.2.1</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.6.RELEASE</version>
<configuration>
<mainClass>com.czy.echat.EchatApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

2、修改启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.czy.echat;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

@SpringBootApplication
public class EchatApplication {

public static void main(String[] args) {
new SpringApplicationBuilder(EchatApplication.class)
.beanNameGenerator(new UniqueBeanNameGenerator())
.run(args);
//SpringApplication.run(EchatApplication.class, args);
}

// 自定义bean名称生成
public static class UniqueBeanNameGenerator extends AnnotationBeanNameGenerator {
/**
* 如果自定义了beanName,就取自定义的,不然取默认的
* @param definition
* @return
*/
@Override
protected String buildDefaultBeanName(BeanDefinition definition) {
return definition.getBeanClassName();// 类名全路径
}
}

}

需要将路径改为自己项目的

刷新Maven依赖,成功引入插件后,即可打包测试。

二、注意事项

1、代码混淆插件必须在Maven打包插件之前!

2、代理切点类的切点类路径不要混淆!

三、参考资料

https://www.cnblogs.com/strongmore/p/18026443#autoid-2-3-0


ProGuard 代码混淆
https://superlovelace.top/2024/09/29/代码混淆/
作者
棱境
发布于
2024年9月29日
更新于
2025年2月18日
许可协议