SpringBoot使用Proguard混淆代码
项目使用Gradle做构建,使用的框架是SpringBoot、Mybatis、Mybatis Plus,sql都写在mybatis的xml文件中。
网上有些博客是直接使用Maven的proguard插件,或者是Gradle的proguard插件。但是我这里没有用这些插件,因为对构建工具依赖比较大。建议还是直接把proguard下载回来,配置到自己电脑的path下来使用就好了,解耦
。
要点
- 建议逐个包定义混淆规则,这样思路更清晰
- dao层需要保存包名和类名,因为Mybatis的xml文件中引用了dao层的接口
- controller层注意在使用
@PathVariable
、@RequestParam
时需要显式声明参数名 - dao层用于映射数据库表的类和controller层映射前台参数的类,都需要保留类成员
- 修改spring的bean命名策略,改成按类的全限定名来命名
实操
1.修改bean命名策略:
@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 build
3.编写混淆规则&调试混淆结果:
我的项目就叫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.重新打包:
混淆后,可以手工拷贝class文件到原来的jar包中替换classes目录,我为了方便,写了个proguard.bat
来执行:
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.0
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。