Java之代码混淆插件ProGuard使用及说明
作者:enjoy嚣士
本文介绍了使用ProGuard对Java项目进行代码混淆,以保护业务逻辑,详细说明了Maven项目配置、ProGuard版本及使用方法,强调了生成的jar包与mapping.txt文件需对应的重要性
背景
接之前的文章,用java实现了C++库函数,并对外提供接口,但是Java可以反编译看到源码业务逻辑等,所以决定使用代码混淆功能,虽然混淆之后也能看到业务逻辑,但是增加了难度而已。
环境
- maven项目管理
- Java 1.8
- proguard 2.7.0
pom配置
<!-- ProGuard 混淆插件 -->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.7.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
<obfuscate>true</obfuscate>
<attach>false</attach>
<options>
########################################
# 不做裁剪和优化(SDK必须)
########################################
<option>-dontoptimize</option>
<option>-dontshrink</option>
<option>-dontwarn</option>
########################################
# 保留对外 API
########################################
<option>
-keep public class org.test.api.** { *; }
</option>
########################################
# 内部实现允许混淆
########################################
<option>
-keep,allowobfuscation class org.test.internal.** { *; }
</option>
########################################
# Java 8 必须保留
########################################
<option>-keepattributes Signature</option>
<option>-keepattributes *Annotation*</option>
<option>-keepattributes Exceptions</option>
<option>-keepattributes InnerClasses</option>
<option>-keepattributes EnclosingMethod</option>
<option>-keepattributes BootstrapMethods</option>
########################################
# 枚举安全
########################################
<option>
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
</option>
########################################
# 序列化安全
########################################
<option>
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
}
</option>
########################################
# 混淆强度增强
########################################
<option>-allowaccessmodification</option>
<option>-overloadaggressively</option>
<option>-useuniqueclassmembernames</option>
<option>-flattenpackagehierarchy</option>
########################################
# 输出 mapping, 方便调试
########################################
<option>-printmapping target/mapping.txt</option>
<option>-keepattributes LineNumberTable</option>
</options>
</configuration>
</plugin>说明
生成的 jar包 和 target/mapping.txt 文件要对应起来,防止出问题无法定位到问题点。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
