1.混淆工具版本html
本文使用的是ProGuard這一款Java代碼混淆工具。 由於在咱們實際的開發工做中,有些程序包含了公司核心產品的代碼,因此爲了保護自身的知識產權,避免程序包不當心外流出去,咱們有必要進行一些保護措施,在程序開發完以後,須要將程序代碼進行混淆。java
本文使用的是ProGuard v5.3.3版本。 下載地址:http://www.jb51.net/softs/242707.htmlapache
2.混淆工具安裝步驟json
2.1下載後的文件是一個壓縮包:eclipse
2.2 解壓壓縮包ide
3.混淆工具使用步驟函數
3.1 解壓後,執行 bin目錄下的proguardgui.bat工具
執行proguardgui.bat後如圖:優化
注意:執行proguardgui.bat後會出現一個cmd命令框,不要關閉,最小化便可。ui
3.2 點擊左側菜單欄中的「Input/Output」按鈕:
3.4 點擊右側菜單欄中的「Add input...」按鈕,導入須要被混淆的jar包:
3.5 點擊右側菜單欄中的「Add Output...」按鈕,填寫配置咱們須要混淆後輸出的jar包,輸出的jar包須要本身手動填寫,jar包名稱能夠自定義:
配置好jar包輸入輸出後,如圖:
3.6 添加支持庫,即eclipse裏java project裏的libraries全部Library的jar包,點擊下方「Library jars,aara,wars,wars,zips,apks,and directories」框右側「Add」按鈕:
添加完畢後,如圖所示:
3.7 設置Shrinking,設置如圖所示:
3.8 設置Obfuscation,設置如圖所示:
3.9 設置Optimization,設置如圖所示:
3.10 設置Information,注意Target的jdk版本,設置如圖所示:
3.11點擊「process」,再點擊「save configuration」,在彈出的對話框中,輸入要保存的配置文件(首先在指定文件夾下建立一個空test.pro文件,選中test.pro),最後點擊「保存」:
3.12 保存完test.pro文件以後,關閉ProGuard,開始手動修改配置文件test.pro,test.pro文件內容在保存時已自動生成內容,咱們只需添加自定義的修改便可,內容以下:
-injars angora_test.jar -outjars angora_test_mix.jar -libraryjars 'C:\Program Files\Java\jre1.8.0_131\lib\rt.jar' -libraryjars 'D:\proguardlib\JavaEWAH-0.3.2.jar' -libraryjars 'D:\proguardlib\RoaringBitmap-0.4.5.jar' #…略 #以上均爲以前載入的支持庫jar包,此處略 -dontshrink -keeppackagenames -flattenpackagehierarchy '' -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod -keepparameternames #不優化 代碼/配置/變量 -optimizations !code/allocation/variable #忽略警告 -ignorewarnings #忽略泛型 -keepattributes Signature #忽略註解 -keepattributes *Annotation* #不要警告找不到com.alibaba.fastjson.**這個包裏面的類的相關引用 -dontwarn com.alibaba.fastjson.** #保持com.alibaba.fastjson.**這個包裏面的全部類和全部方法而不混淆 -keep class com.alibaba.fastjson.**{*;} -dontwarn com.groovy.util.** -keep class com.groovy.util.**{*;} -dontwarn com.apache.common.** -keep class com.apache.common.**{*;} -dontwarn com.codehaus.groovy.** -keep class com.codehaus.groovy.**{*;} -keep class com.bynear.main.**{*;} -keep class com.bynear.main.dispatcher.**{*;} # Keep names - Native method names. Keep all native class/method names. -keepclasseswithmembers,includedescriptorclasses,allowshrinking class * { native <methods>; } # Keep names - _class method names. Keep all .class method names. This may be # useful for libraries that will be obfuscated again with different obfuscators. -keepclassmembers,allowshrinking class * { java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String,boolean); } # Remove - System method calls. Remove all invocations of System # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.System { public static long currentTimeMillis(); static java.lang.Class getCallerClass(); #…略 } # Remove - Math method calls. Remove all invocations of Math # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.Math { public static double sin(double); public static double cos(double); #…略 } # Remove - Number method calls. Remove all invocations of Number # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.* extends java.lang.Number { public static java.lang.String toString(byte); public static java.lang.Byte valueOf(byte); #…略 } # Remove - String method calls. Remove all invocations of String # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.String { public static java.lang.String copyValueOf(char[]); public static java.lang.String copyValueOf(char[],int,int); #…略 } # Remove - StringBuffer method calls. Remove all invocations of StringBuffer # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.StringBuffer { public java.lang.String toString(); public char charAt(int); #…略 } # Remove - StringBuilder method calls. Remove all invocations of StringBuilder # methods without side effects whose return values are not used. -assumenosideeffects public class java.lang.StringBuilder { public java.lang.String toString(); public char charAt(int); #…略 }
3.13 自定義配置文件說明:
3.13.1 這裏是列表文本解決Proguard的bug:「java.lang.ClassFormatError: LVTT entry for 'clazz' in class file ** does not match any LVT entry」,須要配置如下參數:
#不優化 代碼/配置/變量 -optimizations !code/allocation/variable #忽略警告 -ignorewarnings #忽略泛型 -keepattributes Signature #忽略註解 -keepattributes *Annotation*
3.13.2 解決找不到引用的類是第三方包裏面的狀況,由於這種狀況會在混淆過程當中報錯,致使不能混淆代碼,須要配置如下參數:
#不要警告找不到com.alibaba.fastjson.**這個包裏面的類的相關引用 -dontwarn com.alibaba.fastjson.** #保持com.alibaba.fastjson.**這個包裏面的全部類和全部方法而不混淆 -keep class com.alibaba.fastjson.**{*;}
3.13.3 爲了保證jar包的正常運行,咱們不混淆main函數所在的類,須要配置如下參數:
#保持com.bynear.main.**這個包裏面的全部類和全部方法而不混淆 -keep class com.bynear.main.**{*;} #保持com.bynear.main.dispatcher.**這個包裏面的全部類和全部方法而不混淆 -keep class com.bynear.main.dispatcher.**{*;}
3.14 從新啓動ProGuard,加載配置文件test.pro,點擊左菜單「ProGuard」,而後點擊「Load configuration」,選擇以前配置好的pro文件,打開便可,如圖:
3.15 選擇作菜單「Process」,點擊下方「View configuration」,查看配置文件內容是否正確,最後點擊下方右側「Porcess!」,程序開始進行混淆,如圖:
3.16 出現「Processing completed successfully」,表明混淆成功!如圖:
本文只是一個簡單的ProGuard入手操做的示例,方便你們快速上手使用,其實ProGuard還有許多自定義的內容,你們能夠在網上搜索更多關於ProGuard的內容進行了解。