做者 :CoderThcjava
Proguard是一個Java類文件壓縮器、優化器、混淆器、預校驗器。壓縮環節會檢測以及移除沒有用到的類、字段、方法以及屬性。優化環節會分析以及優化方法的字節碼。混淆環節會用無心義的短變量去重命名類、變量、方法。這些步驟讓代碼更精簡,更高效,也更難被逆向(破解)。android
混淆後默認會在工程目錄app/build/outputs/mapping/release(debug)下生成一個mapping.txt文件,這就是混淆規則,咱們能夠根據這個文件把混淆後的代碼反推回源本的代碼,因此這個文件很重要,注意保護好。原則上,代碼混淆後越亂越無規律越好,但有些地方咱們是要避免混淆的,不然程序運行就會出錯。面試
壓縮(Shrinking):默認開啓,用以減少應用體積,移除未被使用的類和成員,而且會在優化動做執行以後再次執行(由於優化後可能會再次暴露一些未被使用的類和成員)sql
-dontshrink #關閉壓縮
-dontoptimize #關閉優化 -optimizationpasses n #表示proguard對代碼進行迭代優化的次 數,Android通常爲5
-dontobfuscate #關閉混淆
-keep class com.thc.test.*
-keep class com.thc.test.**
(上面兩種方式保持類後,會發現類名雖然未混淆,但裏面的具體方法和變量命名仍是變了)json
-keep class com.thc.test.*{*;}
-keep class com.thc.test.**{*;}
-keep class com.xlpay.sqlite.cache.BaseDaoImpl
-keep class com.xlpay.sqlite.cache.BaseDaoImpl{*;}
-keep class com.thc.gradlestudy.MyProguardBean{ <init>; #匹配全部構造器 <fields>;#匹配全部域 <methods>;#匹配全部方法 }
上面就保持住了MyProguardBean這個類中的全部的構造方法、變量、和方法微信
-keep class com.xlpay.sqlite.cache.BaseDaoImpl{ public <methods>;#保持該類下全部的共有方法不被混淆 public *;#保持該類下全部的共有內容不被混淆 private <methods>;#保持該類下全部的私有方法不被混淆 private *;#保持該類下全部的私有內容不被混淆 public <init>(java.lang.String);#保持該類的String類型的構造方法 }
-keep class com.thc.gradlestudy.MyProguardBean{ public <init>(String); }
#保持ProguardTest中的MyClass不被混淆 -keep class com.xlpay.sqlite.cache.ProguardTest$MyClass{*;}
-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
#保持ProguardTest類下test(String)方法不被混淆 -keepclassmembernames class com.xlpay.sqlite.cache.ProguardTest{ public void test(java.lang.String); }
-keepclasseswithmembernames class com.xlpay.sqlite.cache.ProguardTest
#保持native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; }
反射用到的類混淆時須要注意:只要保持反射用到的類名和方法便可,並不須要將整個被反射到的類都進行保持架構
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *; }
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
例子中使用:classA和classB,在加混淆的狀況下多種結果:app
感謝你們能耐着性子看完ide
在這裏小編也分享一份本身收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料幫助你們學習提高進階,也節省你們在網上搜索資料的時間來學習,也能夠分享給身邊好友一塊兒學習
若是你有須要的話,能夠點贊+評論,關注我,而後加我VX:15388039515 我發給你
(或關注微信公衆號「Android開發之家」回覆【資料】免費領取)