SpringBoot使用Proguard混淆代码

SpringBoot使用Proguard混淆代码

项目使用Gradle作构建,使用的框架是SpringBoot、Mybatis、Mybatis Plus,sql都写在mybatis的xml文件中。
网上有些博客是直接使用Maven的proguard插件,或者是Gradle的proguard插件。可是我这里没有用这些插件,由于对构建工具依赖比较大。建议仍是直接把proguard下载回来,配置到本身电脑的path下来使用就行了, 解耦

要点

  1. 建议逐个包定义混淆规则,这样思路更清晰
  2. dao层须要保存包名和类名,由于Mybatis的xml文件中引用了dao层的接口
  3. controller层注意在使用@PathVariable@RequestParam时须要显式声明参数名
  4. dao层用于映射数据库表的类和controller层映射前台参数的类,都须要保留类成员
  5. 修改spring的bean命名策略,改为按类的全限定名来命名

实操

1.修改bean命名策略:java

@SpringBootApplication
public class ServerApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(ServerApplication.class)
                .beanNameGenerator((def,reg)->def.getBeanClassName())
                .run(args);
    }
}

2.springboot打包:gradle clean,而后gradle buildspring

3.编写混淆规则&调试混淆结果:sql

个人项目就叫server,打包好springboot的jar包后,本身手动解压出jar包文件,编写配置文件并执行proguard.bat @proguard.cnf调试。须要耐心反复校验混淆效果。如下是个人proguard.cnf文件:数据库

# 基础目录,下面injars、outjars、libraryjars参数都基于此目录
-basedirectory build/libs/server-1.0/BOOT-INF/

# 须要作混淆的jar或目录
-injars classes

# 混淆后输出的jar或目录
-outjars classes-pro

# 混淆时须要引用的java库,这些库的类不会作混淆
-libraryjars <java.home>/lib/rt.jar
-libraryjars lib

# 不警告
-dontwarn

# 不理会警告,不然混淆失败
-ignorewarnings

# 不压缩
-dontshrink

# 不优化
-dontoptimize

# 一个类中的成员不使用重复的命名,如Student类混淆后不能出现a属性和a方法。
-useuniqueclassmembernames

# 不混淆注解
-keepattributes *Annotation*

# 不混淆泛型
-keepattributes Signature

# 保留程序入口
-keep @org.springframework.boot.autoconfigure.SpringBootApplication class * {*;}

# config 能够作混淆

# constants 能够作混淆

# controller 能够混淆

# dao 保留所有类及类成员,方法命名也不能变,由于与xml文件作了关联
-keep class com.abc.device.dao.** {*;}

# entity 保留所有类
-keep class com.abc.device.entity.** {*;}

# service 能够混淆
#-keep interface * extends com.baomidou.mybatisplus.service {*;}

# shiro 能够混淆

# util 能够混淆

# vo 用keepclasseswithmembers保留类名和类成员,keepclassmembers保留部分的类成员,剩下的都混淆

-keepclasseswithmembers class com.abc.device.vo.DeviceServicePropMsg {*;}
-keepclasseswithmembers class com.abc.device.vo.DeviceNewestMsgTime {*;}
-keepclassmembers class com.abc.device.vo.DeviceImportVo {*;}
-keepclassmembers class com.abc.device.vo.DeviceNewestMsgTime {*;}
-keepclassmembers class com.abc.device.vo.Option {*;}
-keepclassmembers class com.abc.device.vo.UpdateRolePermVo {*;}

4.从新打包:springboot

混淆后,能够手工拷贝class文件到原来的jar包中替换classes目录,我为了方便,写了个proguard.bat来执行:bash

md build\libs\server-1.0 && ^
cd build\libs\server-1.0 && ^
jar xf ..\server-1.0.jar && ^
cd ..\..\..\ && ^
proguard.bat @proguard.cnf && ^
rd /S/Q build\libs\server-1.0\BOOT-INF\classes && ^
ren build\libs\server-1.0\BOOT-INF\classes-pro classes && ^
jar c0fM build\libs\server-1.0-pro.jar -C build\libs\server-1.0/ . && ^
rd /S/Q build\libs\server-1.0

其实逻辑都很简单:
建立build\libs\server-1.0
进入build\libs\server-1.0
解压springboot打出来的jar包:jar xf ..\server-1.0.jar
退回到server目录:cd ..\..\..\
按混淆配置文件执行混淆:proguard.bat @proguard.cnf
删除目录:rd /S/Q build\libs\server-1.0\BOOT-INF\classes
重命名目录:ren build\libs\server-1.0\BOOT-INF\classes-pro classes
从新打包jar:jar c0fM build\libs\server-1.0-pro.jar -C build\libs\server-1.0/ .
删除目录:rd /S/Q build\libs\server-1.0mybatis

相关文章
相关标签/搜索