java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java之代码混淆插件ProGuard

Java之代码混淆插件ProGuard使用及说明

作者:enjoy嚣士

本文介绍了使用ProGuard对Java项目进行代码混淆,以保护业务逻辑,详细说明了Maven项目配置、ProGuard版本及使用方法,强调了生成的jar包与mapping.txt文件需对应的重要性

背景

接之前的文章,用java实现了C++库函数,并对外提供接口,但是Java可以反编译看到源码业务逻辑等,所以决定使用代码混淆功能,虽然混淆之后也能看到业务逻辑,但是增加了难度而已。

环境

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 文件要对应起来,防止出问题无法定位到问题点。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文