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文件內容在保存時已自動生成內容,我們只需添加自定義的修改即可,內容如下:
具體內容:
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.**{*;} #保持這個類及其內容不被混淆 -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”,查看配置文件內容是否正確,最后點擊下方右側“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編譯的時候直接產生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.**{*;} #保持這個類及其內容不被混淆 -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.* # 一顆星只保持本包的類名(不包含內容) -keep class com.xzt.demotwo.** # 二顆星表示保持本包和子包下的類名(不包含內容) #只保持本包的類名和內容 -keep class com.xzt.demotwo.*{*;} #可以保持本包和子包的類名和內容 -keep class com.xzt.demotwo.**{*;} #你還可以在<fields>或<methods>前面加上private 、public、native等來進一步指定不被混淆的內容,如 #包下的所有公共方法 -keep class com.xzt.demotwo{ public <methods>; } #保持某個具體的類名不被混淆 -keep class com.xzt.demotwo.MainActivity #保持某個具體的類及其內容不被混淆 -keep class com.xzt.demotwo.MainActivity{*;} #保持類中特定內容,而不是所有的內容可以使用如下: -keep class com.xzt.demotwo.MainActivity{ 〈init〉;#匹配所有構造器 〈fields〉;#匹配所有域 〈methods〉;#匹配所有方法 } #表示MainActivity下的所有public方法都不會被混淆,當然你還可以加入參數(shù),比如以下表示用JSONObject作為入參的構造函數(shù)不會被混淆 -keep class com.xzt.demotwo { public <init>(org.json.JSONObject); } #保持類中特定內容,還可以進一步縮小范圍 -keep class com.xzt.demotwo.MainActivity{ public ;#保持該類下所有的共有方法不被混淆 public *;#保持該類下所有的共有內容不被混淆 private ;#保持該類下所有的私有方法不被混淆 private *;#保持該類下所有的私有內容不被混淆 public (java.lang.String);#保持該類的String類型的構造方法 } #在方法后加入參數(shù),限制特定的構造方法 -keep class com.xzt.demotwo.MainActivity{ public (String); } #要保留一個類中的內部類及其內容不被混淆需要用 $ 符號 -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以上和以下使用工具)的詳細內容,更多關于Java ProGuard使用的資料請關注腳本之家其它相關文章!
相關文章
mybatis的ParamNameResolver參數(shù)名稱解析
這篇文章主要為大家介紹了mybatis的ParamNameResolver參數(shù)名稱解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Spring的嵌套事務(Propagation.NESTED)到底是個啥案例代碼講解
SavePoint是數(shù)據(jù)庫事務中的一個概念,?可以將整個事務切割為不同的小事務,可以選擇將狀態(tài)回滾到某個小事務發(fā)生時的樣子,本文通過案例代碼講解Spring的嵌套事務(Propagation.NESTED)到底是個啥,感興趣的朋友跟隨小編一起看看吧2023-01-01詳解Springboot Oauth2 Server搭建Oauth2認證服務
這篇文章主要介紹了Springboot Oauth2 Server 搭建Oauth2認證服務,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05Java ConcurrentModificationException異常解決案例詳解
這篇文章主要介紹了Java ConcurrentModificationException異常解決案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-09-09