ProGuard使用文檔


介紹

是一個對於Java字節碼的免費的壓縮器,優化器,混淆器和審核器;

l  它檢測並刪除未使用的類,字段,方法和屬性。

l  它優化字節碼並刪除未使用的指令。

l  它重命名其余類、字段和方法使用短毫無意義的名字。

 

官方文檔

使用文檔

https://www.guardsquare.com/en/products/proguard/manual/usage

常見問題文檔:

https://www.guardsquare.com/en/products/proguard/manual/troubleshooting

 

 

了解通配符:

指定類時,可以使用如下通配符

  •   class 關鍵字表示任意的類或接口
  •   interface 關鍵字只表示接口
  •   enum 關鍵字表示枚舉類
  •  interface 和 enum 關鍵字可以加上 !表示除...之外
  •   ?匹配任意字符,不包括包分隔符
  •   匹配任意多個字符,不包括包分隔符
  •  ** 匹配任意多個字符,包括包分隔符
  •  為了向后兼容,* 也可以表示任意的類,包括包分隔符
  •  extends 和 implements 關鍵字是等效的,表示繼承或實現 A 的類,但不包括 A 本身
  •  @ 關鍵字用於表示使用指定注解修飾的類和類成員

指定類的成員時,可以指定如下通配符

  •   <init> 匹配任意的構造器
  •   <fileds> 匹配任意的成員變量
  •   <methods> 匹配任意的方法

 匹配任意的成員變量或方法

  •  上述通配符不含返回類型,只有<init>有參數列表
  •   除了使用上述全能通配符以外,同樣可以使用常用表達式,此時可以使用 ? 和 * 通配符
  • 指定修飾符的類型時,可以使用如下通配符
  •   % 匹配基本類型
  •  ? 匹配任一字符
  •   匹配任意多個字符,不含包分隔符
  •  ** 匹配任意多個字符,包含包分隔符
  •   *** 匹配任意類型(基本或非基本,數組或非數組)
  •   ... 匹配任意數量、任意類型的參數
  •   ? * 和 ** 不會匹配基本類型
  •   可以使用權限控制符幫助匹配(例如 public static)

參考來源:

https://www.guardsquare.com/en/products/proguard/manual/usage#filename

使用 ProGuard  GUI

輸入輸出部分

 需要確保目錄結構為jar目錄結構:

錯誤的目錄結構:

 

如果目錄結構是下面這種類web目錄結構,混淆器無法正確混淆,process會提示大量警告 … unexpectedly contains class …

或者根據官方文檔上的解決方法,將打包的jar包放入lib目錄,執行混淆(這個沒有試驗)

 

為了得到這種目錄結構,可將項目由eclipse打開,僅對src/main/java項目下的源代碼文件導出為jar文件

將該jar包作為輸入,add Input

 

依賴庫需要添加jre目錄下的所有jar和 項目所有的依賴項 lib目錄下的jar包

輸出名字自定義

 

依賴庫除了jre下的jar包,其他依賴根據項目使用情況加入,圈起來的兩個是關鍵jar包

 

點擊Next

----------------------------------------------------------------------------------------------------------------

壓縮部分

 

 

不勾選,表示不壓縮

Keep 輸入框

保留某些類,成員不被混淆,(不明白它這個為什么放在壓縮部分)

 

在配置文件中的形式:

-keep public class cn.xxx.xxx.controller.* {

    <fields>;

    <methods>;

}

 

#我的model目錄結構為 model/po , model/vo ,所以為 model.*.*

-keep public class cn.xxx.xxx.model.*.* {

    <fields>;

    <methods>;

}

主啟動類:

-keep class cn.xxx.xxx.XXXApplication {

    *** main(...);

}

該部分功能: 刪除沒有使用的的類或成員

注意:保留啟動類

點擊next

------------------------------------------------------------------------------------------------------------------

混淆部分

 

該部分功能: 對代碼進行模糊處理,混淆類名、方法名和變量名(使用單字母a,b,c,d,e,f,g…)

介紹一下勾選所代表的意思:

Obfuscate :啟用混淆功能

Use unique class member name: 使用統一的類名稱

Keep package names:保留包名

Keep attarbute:保留的屬性、異常、注解等

Keep paremeter name:保留方法參數名

Keep native: 保留本地方法

-----------------------------------------------------------------------------------------------------------------------------

優化部分

 

不勾選,表示不優化

Allow access modification: 允許修改

該部分功能:它內聯並合並類和類成員,並在字節碼級別優化所有方法。

---------------------------------------------------------------------------

信息部分

 

Prevify:驗證

Target: 更據JDK版本選擇

Note: 提示

Warn: 警告

 

Skip non-public library classes: 指定在讀取庫jar時跳過非公共類,以加快處理速度並減少ProGuard的內存使用量

Skip non-public library class members: 指定跳過包可見的庫類成員(字段和方法)

如果實在有警告,解決不了,可以勾選忽略警告

配置文件全部內容

-injars target.jar
-outjars result.jar

-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\charsets.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\deploy.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\javaws.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\jce.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\jfr.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\jfxswt.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\jsse.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\management-agent.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\plugin.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\resources.jar'
-libraryjars 'D:\Program Files\Java\jdk1.8.0_241\jre\lib\rt.jar'
-libraryjars lib\HikariCP-3.4.1.jar
-libraryjars lib\byte-buddy-1.10.2.jar
-libraryjars lib\classmate-1.5.1.jar
-libraryjars lib\commons-codec-1.13.jar
-libraryjars lib\commons-lang3-3.4.jar
-libraryjars lib\druid-1.1.9.jar
-libraryjars lib\druid-spring-boot-starter-1.1.9.jar
-libraryjars lib\guava-20.0.jar
-libraryjars lib\hibernate-validator-6.0.18.Final.jar
-libraryjars lib\jackson-annotations-2.10.0.jar
-libraryjars lib\jackson-core-2.10.0.jar
-libraryjars lib\jackson-databind-2.10.0.jar
-libraryjars lib\jackson-datatype-jdk8-2.10.0.jar
-libraryjars lib\jackson-datatype-joda-2.10.0.jar
-libraryjars lib\jackson-datatype-jsr310-2.10.0.jar
-libraryjars lib\jackson-module-parameter-names-2.10.0.jar
-libraryjars lib\jakarta.annotation-api-1.3.5.jar
-libraryjars lib\jakarta.validation-api-2.0.1.jar
-libraryjars lib\java-jwt-3.4.0.jar
-libraryjars lib\jboss-logging-3.4.1.Final.jar
-libraryjars lib\joda-time-2.10.5.jar
-libraryjars lib\jsqlparser-1.0.jar
-libraryjars lib\jul-to-slf4j-1.7.29.jar
-libraryjars lib\log4j-api-2.12.1.jar
-libraryjars lib\log4j-to-slf4j-2.12.1.jar
-libraryjars lib\logback-classic-1.2.3.jar
-libraryjars lib\logback-core-1.2.3.jar
-libraryjars lib\lombok-1.18.10.jar
-libraryjars lib\mapstruct-1.2.0.Final.jar
-libraryjars lib\mybatis-3.4.6.jar
-libraryjars lib\mybatis-spring-1.3.2.jar
-libraryjars lib\mybatis-spring-boot-autoconfigure-1.3.2.jar
-libraryjars lib\mybatis-spring-boot-starter-1.3.2.jar
-libraryjars lib\ojdbc8-19.3.0.0.jar
-libraryjars lib\ons-19.3.0.0.jar
-libraryjars lib\oraclepki-19.3.0.0.jar
-libraryjars lib\orai18n-12.1.0.2.0.jar
-libraryjars lib\osdt_cert-19.3.0.0.jar
-libraryjars lib\osdt_core-19.3.0.0.jar
-libraryjars lib\pagehelper-5.1.4.jar
-libraryjars lib\pagehelper-spring-boot-autoconfigure-1.2.5.jar
-libraryjars lib\pagehelper-spring-boot-starter-1.2.5.jar
-libraryjars lib\simplefan-19.3.0.0.jar
-libraryjars lib\slf4j-api-1.7.29.jar
-libraryjars lib\snakeyaml-1.25.jar
-libraryjars lib\spring-aop-5.2.1.RELEASE.jar
-libraryjars lib\spring-beans-5.2.1.RELEASE.jar
-libraryjars lib\spring-boot-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-autoconfigure-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-starter-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-starter-jdbc-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-starter-json-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-starter-logging-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-starter-tomcat-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-starter-validation-2.2.1.RELEASE.jar
-libraryjars lib\spring-boot-starter-web-2.2.1.RELEASE.jar
-libraryjars lib\spring-context-5.2.1.RELEASE.jar
-libraryjars lib\spring-core-5.2.1.RELEASE.jar
-libraryjars lib\spring-expression-5.2.1.RELEASE.jar
-libraryjars lib\spring-jcl-5.2.1.RELEASE.jar
-libraryjars lib\spring-jdbc-5.2.1.RELEASE.jar
-libraryjars lib\spring-plugin-core-1.2.0.RELEASE.jar
-libraryjars lib\spring-plugin-metadata-1.2.0.RELEASE.jar
-libraryjars lib\spring-tx-5.2.1.RELEASE.jar
-libraryjars lib\spring-web-5.2.1.RELEASE.jar
-libraryjars lib\spring-webmvc-5.2.1.RELEASE.jar
-libraryjars lib\springfox-core-2.9.2.jar
-libraryjars lib\springfox-schema-2.9.2.jar
-libraryjars lib\springfox-spi-2.9.2.jar
-libraryjars lib\springfox-spring-web-2.9.2.jar
-libraryjars lib\springfox-swagger-common-2.9.2.jar
-libraryjars lib\springfox-swagger-ui-2.9.2.jar
-libraryjars lib\springfox-swagger2-2.9.2.jar
-libraryjars lib\swagger-annotations-1.5.20.jar
-libraryjars lib\swagger-models-1.5.20.jar
-libraryjars lib\tomcat-embed-core-9.0.27.jar
-libraryjars lib\tomcat-embed-el-9.0.27.jar
-libraryjars lib\tomcat-embed-websocket-9.0.27.jar
-libraryjars lib\ucp-19.3.0.0.jar

-skipnonpubliclibraryclasses
-target 1.8
-dontshrink
-dontoptimize
-allowaccessmodification
-printmapping map.txt
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod

 

-keep public class cn.xxx.xxx.controller.* {
}

-keep public class cn.xxx.xxx.model.*.* {
<fields>;
<methods>;
}

-keep class cn.xxx.xxx.XXXApplication {
*** main(...);
}

-keep class cn.xxx.xxx.mapper.* {
<methods>;
}

# Keep - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
native <methods>;
}

 

混淆效果:

類名被混淆:

未保留類名稱被混淆

方法名被更改:

變量名被混淆:

 

 

 

 

 

混淆驗證

將混淆后的jar包解壓后的class文件替換原來項目編譯后的可執行文件,idea中一般是 target/classes 目錄下。

替換完成,運行項目,項目正常啟動運行,接口正常訪問,則說明混淆沒有問題。

 

混淆成功后但運行失敗常見的問題:

 

Bean名沖突:

l  啟動報錯BeanDefinitionStoreException,

如果使用@MapperScan()、@Configuration,@Component、@Service等注解沒有為bean命名時,bean會以類名作為bean名稱注入spring容器,由於混淆器的命名規則是對包下的類按原名進行排序,然后分配a,b,c,d…等名稱,會導致不同包下有類獲得相同的名稱注入到bean容器,造成bean沖突

解決:

 如果使用默認的命名規則,在勾選了use mix-case class names (使用混合大寫命名規則),包中超過26個類時情況下,默認命名為A.class,B.class,C.class…在某些操作系統(windows)下,會因為不區分class文件名稱的大小寫,會導致錯誤.

解決:取消勾選use mix-case class names

 

接口訪問失敗:

l如果是mybatis映射架構,訪問接口失敗,可查看編譯后的接口文件類名,接口名稱已經被更改,而對應得xml文件,xml中得sql語句無法與相應得接口名進行綁定,報綁定異常BindingException

解決:所以mapper層類名、方法名都不可更改

所以mapper層需要保留類名和方法名不被混淆

-keep class cn.hulingfeng.ylzdemo.mapper.* {

    <methods>;

}

額外內容

打印混淆的映射關系,會清楚的告訴你混淆的映射關系

apply mapping:

則是根據自己自定義的規則去做混淆映射,比如將上一次的混淆映射應用在這一次,增量混淆可以用到

混淆字典

 

上面三個分別是:

Obfuscation dictory:根據自定義的混淆字典對方法和字段名稱進行命名

Class Obfuscation dictory: 根據自定義的混淆字典對類名稱進行命名

Package obfuscation dictory: 根據自定義的混淆字典對包名稱進行命名

字典示例:

 

混淆結果:

 

 

 

總結

Proguard作為一款混淆器,混淆能力比較有限,且配置比較繁瑣,需要注意的問題比較多,盡量降低混淆對象在主程序中的耦合度,才能進一步提升混淆覆蓋率


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM