简介
- 官网、使用手册
- Proguard 是一个适用于 Java 平台混淆代码的工具,也可以用于 Android,虽然我们直接称为混淆,实际上 Proguard 包括 shrink(压缩),optimize(优化),obfuscate(混淆),preverify(预校验)四步
- shrink: 检测并移除没有用到的类,变量,方法和属性
- optimize: 优化代码,非入口节点类会加上 private/static/final, 没有用到的参数会被删除,一些方法可能会变成内联代码
- obfuscate: 使用短又没有语义的名字重命名非入口类的类名,变量名,方法名。入口类的名字保持不变
- preverify: 预校验代码是否符合 Java1.6 或者更高的规范(唯一一个与入口类不相关的步骤)
- 支持客户端、Grandle、Ant等,Maven需要第三方插件
- 6个常用Java源代码保护工具: https://www.cnblogs.com/jpfss/p/11533257.html
- 相关文章
Springboot案例
1 | <build> |
- proguard.conf (放在pom根目录)
1 | # 本案例源码摘要; 基于springboot的详细推荐配置参考下文[SpringBoot案例](#SpringBoot案例) |
- 解决混淆后,Bean类名找不到的问题
1 |
|
SpringBoot推荐配置
- proguard.conf
1 | -include ../../../proguard-common.conf |
- proguard-common.conf
1 | # 不打印 NOTE |
配置参数
基本
- 配置文件中可以添加注释,注释以#开头,从#到该行末尾的文字都会看做注释,不支持多行注释
- 在配置文件中空格和换行有相同的效果,能用空格的地方都可以用换行,反之亦然
- 有些配置规则中需要指定文件或文件夹的路径,如果路径中包含空格,则需要将路径用单引号或双引号括起来
- 配置规则中除-injars,-outjars之间有先后顺序上的要求外,其他参数顺序随意
参数说明
1 | #递归的从给定文件中读取参数 |
Class Specifications
1 | # 方括号: [] # 方括号代表里面的内容是可选的 |
零散案例
1 | # 匹配所有是public,但不是final,不是abstract的类 |
- 取反案例(指定混淆类)
1 | ## 仅混淆指定包下的类 |
案例
- proguad-rules.pro
1 | #指定非混淆类 |
常见问题
- 方法局部变量混淆问题
- 参考上文需要配置
-keepattributes !LocalVariableTable,!LocalVariableTypeTable
- 此时局部变量都会被混淆,一般混淆为类名小写驼峰
- 参考上文需要配置
多模块混淆问题
可将依赖包通过assembly方式进行打包 https://www.jianshu.com/p/ab0f57855ce9
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<!-- report-table-core模块 -->
<build>
<plugins>
<!-- proguard混淆插件. spring-boot-maven-plugin需要放到此插件的后面 -->
<!-- 之后打包后,会生成 proguard_map.txt 的映射文件(源码名称和混淆后名称的映射) -->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>run-proguard</id>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- JDK8及以下需要添加外部依赖的jar包, 否则部分场景容易报错: java.lang.VerifyError: Bad type on operand stack -->
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jce.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
<proguardInclude>${project.parent.basedir}/proguard.conf</proguardInclude>
<attach>true</attach>
<attachArtifactClassifier>pg</attachArtifactClassifier>
<!-- 依赖模块 -->
<assembly>
<inclusions>
<!-- 此时此模块中的依赖无法传递,需要手动引入 -->
<inclusion>
<groupId>cn.aezo.share.reporttable</groupId>
<artifactId>report-table-common</artifactId>
</inclusion>
</inclusions>
</assembly>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<executions>
<!-- 阻止默认的部署 -->
<execution>
<id>default-deploy</id>
<phase>none</phase>
</execution>
<!-- 自定义部署 -->
<execution>
<id>deploy-essential</id>
<phase>deploy</phase>
<goals>
<goal>deploy-file</goal>
</goals>
<configuration>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<classifier>pg</classifier>
<packaging>jar</packaging>
<!-- 使用固定的pom文件安装到本地仓库,否则会自动生成(可能会丢失依赖从而导致依赖传递失败) -->
<pomFile>${basedir}/pom.xml</pomFile>
<file>${basedir}/target/${project.name}-${project.version}-pg.jar</file>
<repositoryId>aezocn-maven-repo</repositoryId>
<url>file:///Users/smalle/gitwork/github/aezo-maven-repo</url>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 主项目中使用 -->
<dependency>
<groupId>cn.aezo.share.reporttable</groupId>
<artifactId>report-table-core</artifactId>
<version>${report-table.version}</version>
<classifier>pg</classifier>
<exclusions>
<exclusion>
<groupId>cn.aezo.share.reporttable</groupId>
<artifactId>report-table-common</artifactId>
</exclusion>
</exclusions>
</dependency>或者以maven-assembly-plugin -> proguard-maven-plugin -> spring-boot-maven-plugin顺序进行打包,参考https://huaweicloud.csdn.net/638764d9dacf622b8df8b1c5.html
- springboot proguard 代码混淆相关问题 https://huaweicloud.csdn.net/638764d9dacf622b8df8b1c5.html