Java代碼混淆工具ProGuard使用指南(附有1.8以上和以下使用工具)
1.混淆工具版本
ProGuard是一款Java代碼混淆工具。 在開發(fā)組件功能對涉及到公司的核心代碼時,我們需要對項目組件進行Jar包加密。
2、混淆工具使用步驟
2.1 解壓后,執(zhí)行 bin目錄下的proguardgui.bat

2.2、執(zhí)行proguardgui.bat后
如圖:

2.2.1、注意不要關閉DOS窗口
執(zhí)行proguardgui.bat后會出現(xiàn)一個cmd命令框,不要關閉,最小化即可。

2.3、 點擊左側菜單欄中的“Input/Output”按鈕

2.4、點擊右側菜單欄中的“Add input...”按鈕,導入需要被混淆的jar包,選擇文件類型-所有文件

2.5、點擊右側菜單欄中的“Add Output...”按鈕,填寫配置我們需要混淆后輸出的jar包
輸出的jar包需要自己手動填寫,jar包名稱可以自定義 ,所有的jar包類型。
2.6、配置好jar包輸入輸出后
如圖:

2.7、添加支持庫
即eclipse里java project里的libraries所有Library的jar包,或者是idea maven項目中的依賴文件
2.7.1、點擊下方“Library jars,aara,wars,wars,zips,apks,and directories”框右側“Add”按鈕

2.7.2、idea 的lib文件 例如:git 拉取的項目位置 \....\target\.....\WEB-INF\lib (下面有所有依賴的jar包)
當前項目中需要依賴的jar包等

導出maven工程lib依賴
pom.xml
方法一:
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-dependency-plugin -->
<!--將所依賴的jar包插件導到 -Maven將依賴項復制到target/lib中-->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
</dependency>
方法二:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 拷貝項目依賴包到lib/目錄下 -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- 間接依賴也拷貝 -->
<excludeTransitive>false</excludeTransitive>
<!-- 帶上版本號 -->
<stripVersion>false</stripVersion>
</configuration>
</execution>
</executions>
</plugin> 2.8、添加需要的jar包資源


2.9、全不選

2.10、推薦勾選,ukf kk c

2.10.1、混淆規(guī)則

2.11、使用默認規(guī)范

2.12、當前創(chuàng)建jar的環(huán)境

2.13、點擊“process”,再點擊“save configuration”,在彈出的對話框中,輸入要保存的配置文件
首先在指定文件夾下創(chuàng)建一個空test.pro文件,選中test.pro),最后點擊“保存”:

2.14、保存完test.pro文件之后,關閉ProGuard,開始手動修改配置文件test.pro
test.pro文件內(nèi)容在保存時已自動生成內(nèi)容,我們只需添加自定義的修改即可,內(nèi)容如下:
具體內(nèi)容:
proguard.pro 文件的混淆規(guī)則(test.pro)

2.14.1、自定義配置文件說明
1、這里是列表文本解決Proguard的bug:“java.lang.ClassFormatError: LVTT entry for 'clazz' in class file ** does not match any LVT entry”,需要配置以下參數(shù):
#不優(yōu)化 代碼/配置/變量 -optimizations !code/allocation/variable #忽略警告 -ignorewarnings #忽略泛型 -keepattributes Signature #忽略注解 -keepattributes *Annotation*
2、解決找不到引用的類是第三方包里面的情況,因為這種情況會在混淆過程中報錯,導致不能混淆代碼,需要配置以下參數(shù):
#不要警告找不到com.alibaba.fastjson.**這個包里面的類的相關引用
-dontwarn com.alibaba.fastjson.**
#保持com.alibaba.fastjson.**這個包里面的所有類和所有方法而不混淆
-keep class com.alibaba.fastjson.**{*;}3、混淆代碼:
#不優(yōu)化 代碼/配置/變量
-optimizations !code/allocation/variable
#忽略警告
-ignorewarnings
#忽略泛型
-keepattributes Signature
#忽略注解
-keepattributes *Annotation*
#不要警告找不到com.alibaba.fastjson.**這個包里面的類的相關引用
-dontwarn com.alibaba.fastjson.**
#保持com.alibaba.fastjson.**這個包里面的所有類和所有方法而不混淆
-keep class com.alibaba.fastjson.**{*;}
#保持這個類及其內(nèi)容不被混淆
-keep class com.LicenseAuthorization.ClientServices.common.config.InterceptorConfig{*;}
#保持只保留類名
-keep class com.LicenseAuthorization.ClientServices.common.config.LicenseCheckedFilter
#保持只保留類名
-keep class com.LicenseAuthorization.ClientServices.common.config.LicenseCheckListener
#保持該類下所有的共有方法不被混淆
-keep class com.LicenseAuthorization.ClientServices.licenseMatch.LicenseVerify{public <methods>;}
#保持這個包里面的所有類和所有方法而不混淆
-keep class com.LicenseAuthorization.ClientServices.common.utils.**{*;}
#保持這個包里面的所有類和所有方法而不混淆
-keep class com.LicenseAuthorization.license.entity.**{*;}4、重新啟動ProGuard,加載配置文件test.pro,點擊左菜單“ProGuard”,然后點擊“Load configuration”,選擇之前配置好的pro文件,打開即可,如圖:

5、選擇做菜單“Process”,點擊下方“View configuration”,查看配置文件內(nèi)容是否正確,最后點擊下方右側“Porcess!”,程序開始進行混淆,如圖:

6、出現(xiàn)“Processing completed successfully”,代表混淆成功!如圖:

3、可能遇到的問題
1.提示:Warning: can’t find referenced class xxx
解決:-dontwarn javax.crypto.** -keep class javax.crypto.** 其他類似警告也如此處理
2.提示 there were 4 unresolved references to classes or interfaces. You may need to add missing …
解決:如果jar包沒有問題,則 在proe文件中,加一行 -ignorewarnings
3.問題:

解決:當前的ProGuard 版本過低,需要換更高的ProGuard版本,或者是將依賴的jar包降低到可以讓ProGuard解析


4.問題
構建該jar包需要的依賴結構不夠完整,就是創(chuàng)建這個jar包的代碼實現(xiàn)所需要引用的import的依賴不完整 (具體可以將所有的jar包都導出來,具體看maven工程導出所有的lib 依賴)

您似乎缺少一些類,導致類層次結構不完整,請參閱手冊中的疑難解答頁面:
ProGuard Manual: Home | Guardsquare
5.問題:在編寫pro文件做jar包數(shù)據(jù)混淆的時候沒有寫對代碼,或者是代碼規(guī)范出錯

原因:

4、其他查閱
proguard.pro 文件的混淆規(guī)則
proguard包括四個功能,shrinker(壓縮), optimizer(優(yōu)化),obfuscator(混淆),preverifier(預校驗),他們的作用分別是:
shrink: 檢測并移除沒有用到的類,變量,方法和屬性;
optimize: 優(yōu)化代碼,非入口節(jié)點類會加上private/static/final, 在字節(jié)碼級別執(zhí)行優(yōu)化,讓應用運行的更快。。
obfuscate: 增大反編譯難度,類和類成員會被隨機命名,除非用keep保護。
preverify: 預校驗代碼是否符合Java1.6或者更高的規(guī)范.
除了proguard之外,還有一個DexGuard,是專門用來優(yōu)化混淆Android應用的。它包括資源混淆,字符串加密,類加密和dex文件分割等。它是在android編譯的時候直接產(chǎn)生Dalvik字節(jié)碼.......
混淆后我們會在工程目錄app/build/outputs/mapping/release(debug)下找到一個mapping.txt文件,這就是混淆規(guī)則,我們可以根據(jù)這個文件把混淆后的代碼反推回源本的代碼,所以這個文件比較重要,請妥善保管
5、優(yōu)先查閱
#不優(yōu)化 代碼/配置/變量
-optimizations !code/allocation/variable
#忽略警告
-ignorewarnings
#忽略泛型
-keepattributes Signature
#忽略注解
-keepattributes *Annotation*
#不要警告找不到com.alibaba.fastjson.**這個包里面的類的相關引用
-dontwarn com.alibaba.fastjson.**
#保持com.alibaba.fastjson.**這個包里面的所有類和所有方法而不混淆
-keep class com.alibaba.fastjson.**{*;}
#保持這個類及其內(nèi)容不被混淆
-keep class com.LicenseAuthorization.ClientServices.common.config.InterceptorConfig{*;}
#保持只保留類名
-keep class com.LicenseAuthorization.ClientServices.common.config.LicenseCheckedFilter
#保持只保留類名
-keep class com.LicenseAuthorization.ClientServices.common.config.LicenseCheckListener
#保持該類下所有的共有方法不被混淆
-keep class com.LicenseAuthorization.ClientServices.licenseMatch.LicenseVerify{public <methods>;}
#保持這個包里面的所有類和所有方法而不混淆
-keep class com.LicenseAuthorization.ClientServices.common.utils.**{*;}
#保持這個包里面的所有類和所有方法而不混淆
-keep class com.LicenseAuthorization.license.entity.**{*;}
-keep class com.xzt.demotwo.* # 一顆星只保持本包的類名(不包含內(nèi)容)
-keep class com.xzt.demotwo.** # 二顆星表示保持本包和子包下的類名(不包含內(nèi)容)
#只保持本包的類名和內(nèi)容
-keep class com.xzt.demotwo.*{*;}
#可以保持本包和子包的類名和內(nèi)容
-keep class com.xzt.demotwo.**{*;}
#你還可以在<fields>或<methods>前面加上private 、public、native等來進一步指定不被混淆的內(nèi)容,如
#包下的所有公共方法
-keep class com.xzt.demotwo{
public <methods>;
}
#保持某個具體的類名不被混淆
-keep class com.xzt.demotwo.MainActivity
#保持某個具體的類及其內(nèi)容不被混淆
-keep class com.xzt.demotwo.MainActivity{*;}
#保持類中特定內(nèi)容,而不是所有的內(nèi)容可以使用如下:
-keep class com.xzt.demotwo.MainActivity{
〈init〉;#匹配所有構造器
〈fields〉;#匹配所有域
〈methods〉;#匹配所有方法
}
#表示MainActivity下的所有public方法都不會被混淆,當然你還可以加入?yún)?shù),比如以下表示用JSONObject作為入?yún)⒌臉嬙旌瘮?shù)不會被混淆
-keep class com.xzt.demotwo {
public <init>(org.json.JSONObject);
}
#保持類中特定內(nèi)容,還可以進一步縮小范圍
-keep class com.xzt.demotwo.MainActivity{
public ;#保持該類下所有的共有方法不被混淆
public *;#保持該類下所有的共有內(nèi)容不被混淆
private ;#保持該類下所有的私有方法不被混淆
private *;#保持該類下所有的私有內(nèi)容不被混淆
public (java.lang.String);#保持該類的String類型的構造方法
}
#在方法后加入?yún)?shù),限制特定的構造方法
-keep class com.xzt.demotwo.MainActivity{
public (String);
}
#要保留一個類中的內(nèi)部類及其內(nèi)容不被混淆需要用 $ 符號
-keep class com.xzt.demotwo.MainActivity$MyClass{*;}
#使用Java的基本規(guī)則來保護特定類不被混淆,比如用extends,implement等這些Java規(guī)則,
#如下:保持Android底層組件和類不要混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View
#如果不需要保持類名,只需要保持該類下的特定方法保持不被混淆,
#需要使用keepclassmembers,而不是keep,因為keep方法會保持類名。
#保持MainActivity類下test(String)方法不被混淆
-keepclassmembernames class com.xzt.demotwo.MainActivity{
public void test(java.lang.String);
}# 如果擁有某成員,保留類和類成員 -keepclasseswithmembernames class com.xzt.demotwo.MainActivity

以上就是Java代碼混淆工具ProGuard使用指南(附有1.8以上和以下使用工具)的詳細內(nèi)容,更多關于Java ProGuard使用的資料請關注腳本之家其它相關文章!
相關文章
java之CSV大批量數(shù)據(jù)入庫的實現(xiàn)
本文主要介紹了java之CSV大批量數(shù)據(jù)入庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02
SpringBoot注解@EnableScheduling定時任務詳細解析
這篇文章主要介紹了SpringBoot注解@EnableScheduling定時任務詳細解析,@EnableScheduling 開啟對定時任務的支持,啟動類里面使用@EnableScheduling 注解開啟功能,自動掃描,需要的朋友可以參考下2024-01-01
m1 Mac設置多jdk版本并動態(tài)切換的實現(xiàn)
本文主要介紹 Mac 下如何安裝 JDK 并且多版本如何切換,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
JAVA通過HttpURLConnection 上傳和下載文件的方法
這篇文章主要介紹了JAVA通過HttpURLConnection 上傳和下載文件的方法,非常具有實用價值,需要的朋友可以參考下2017-09-09
Java LongAdder原理解析與實戰(zhàn)應用小結
LongAdder是Java 8中java.util.concurrent.atomic包引入的高性能計數(shù)器類,專為高并發(fā)場景下的數(shù)值累加操作優(yōu)化設計,本文給大家介紹Java LongAdder原理解析與實戰(zhàn)應用小結,感興趣的朋友一起看看吧2025-06-06

