我们都知道通过一些反编译工具可以对 .class 文件进行反编译就可以看到源码这样来说是不安全的,所以就要对源码进行处理。我们项目中用到的即为代码混淆工具ProGuard。
在应用中借鉴的几篇文章:
https://www.cnblogs.com/nevermorewang/p/8041548.html
https://blog.youkuaiyun.com/sqzhao/article/details/42292089
https://www.cnblogs.com/cr330326/p/5534915.html
下面是本人在实际应用中的使用案例:
- pom.xml文件中添加maven-proguard插件
<build>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.10</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<attach>true</attach>
<attachArtifactClassifier>pg</attachArtifactClassifier>
<!-- attach 的作用是在 install 与 deploy 时将生成的 pg 文件也安装与部署 -->
<options> <!-- 详细配置方式参考 ProGuard 官方文档 -->
<!--<option>-dontobfuscate</option>-->
<option>-ignorewarnings</option> <!--忽略所有告警-->
<option>-dontshrink</option> <!--不做 shrink -->
<option>-dontoptimize</option> <!--不做 optimize -->
<option>-dontskipnonpubliclibraryclasses</option>
<option>-dontskipnonpubliclibraryclassmembers</option>
<option>-repackageclasses com.ganinfo.service.expired.pg</option>
<!--平行包结构(重构包层次),所有混淆的类放在 pg 包下-->
<!-- 以下为 Keep,哪些内容保持不变,因为有一些内容混淆后(a,b,c)导致反射或按类名字符串相关的操作失效 -->
<option>-keep class **.package-info</option>
<!--保持包注解类-->
<option>-keepattributes Signature</option>
<!--JAXB NEED,具体原因不明,不加会导致 JAXB 出异常,如果不使用 JAXB 根据需要修改-->
<!-- Jaxb requires generics to be available to perform xml parsing and without this option ProGuard was not retaining that information after obfuscation. That was causing the exception above. -->
<option>-keepattributes SourceFile,LineNumberTable,*Annotation*</option>
<!--保持源码名与行号(异常时有明确的栈信息),注解(默认会过滤掉所有注解,会影响框架的注解)-->
<!-- <option>-keepclassmembers enum org.noahx.proguard.example.project2.** { *;}</option>-->
<!--保持枚举中的名子,确保枚举 valueOf 可以使用-->
<!-- <option>-keep class com.ganinfo.effective.constant.** { *;}</option>-->
<!--保持 Bean 类,(由于很多框架会对 Bean 中的内容做反射处理,请根据自己的业务调整) -->
<!--暴露给引用服务的方法类,该类不进行混淆-->
<option>-keep class xxx.xxx.xxx.xxx.ClassName{
<methods>;
}
</option>
<!-- 保持对外的接口性质类对外的类名与方法名不变 -->
</options>
<outjar>${project.build.finalName}-pg</outjar>
<libs>
<lib>${java_home/jre/lib}/rt.jar</lib>
</libs>
</configuration>
</plugin>
</plugins>
</build>
2.打包完成之后进行反编译的结构:
可以看到除了指定对外进行暴露的类,其他类及方法名等都进行了混淆。