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

相關文章
相關標籤/搜索