你必需要了解的——Android混淆

做者 :CoderThcjava

混淆介紹

你必需要了解的——Android混淆

Proguard是一個Java類文件壓縮器、優化器、混淆器、預校驗器。壓縮環節會檢測以及移除沒有用到的類、字段、方法以及屬性。優化環節會分析以及優化方法的字節碼。混淆環節會用無心義的短變量去重命名類、變量、方法。這些步驟讓代碼更精簡,更高效,也更難被逆向(破解)。android

混淆後默認會在工程目錄app/build/outputs/mapping/release(debug)下生成一個mapping.txt文件,這就是混淆規則,咱們能夠根據這個文件把混淆後的代碼反推回源本的代碼,因此這個文件很重要,注意保護好。原則上,代碼混淆後越亂越無規律越好,但有些地方咱們是要避免混淆的,不然程序運行就會出錯。面試

混淆介紹Proguard經常使用操做

  • 後面有備註Proguard官方文檔,其餘騷操做自行查看便可
  • 壓縮(Shrinking):默認開啓,用以減少應用體積,移除未被使用的類和成員,而且會在優化動做執行以後再次執行(由於優化後可能會再次暴露一些未被使用的類和成員)sql

    -dontshrink #關閉壓縮
  • 優化(Optimization):默認開啓,在字節碼級別執行優化,讓應用運行的更快
-dontoptimize #關閉優化
 -optimizationpasses n #表示proguard對代碼進行迭代優化的次 
 數,Android通常爲5
  • 混淆(Obfuscation):默認開啓,增大反編譯難度,類和類成員會被隨機命名,除非用keep保護
-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這個類中的全部的構造方法、變量、和方法微信

  • 能夠在<fields>或<methods>前面加上private 、public、native等來進一步指定不被混淆的內容
-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{*;}
  • 使用Java的基本規則來保護特定類不被混淆,好比用extends,implement等這些Java規則,以下:保持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方法會保持類名。
#保持ProguardTest類下test(String)方法不被混淆
 -keepclassmembernames class com.xlpay.sqlite.cache.ProguardTest{
 public void test(java.lang.String);
 }
  • 若是擁有某成員,保留類和類成員
-keepclasseswithmembernames class com.xlpay.sqlite.cache.ProguardTest

注意事項

  • jni方法不可混淆,由於native方法是要完整的包名類名方法名來定義的,不能修改,不然找不到;
#保持native方法不被混淆
 -keepclasseswithmembernames class * { 
 native <methods>; 
 }
  • 反射用到的類混淆時須要注意:只要保持反射用到的類名和方法便可,並不須要將整個被反射到的類都進行保持架構

  • AndroidMainfest中的類不混淆,因此四大組件和Application的子類和Framework層下全部的類默認不要進行混淆。自定義的View默認也不會被混淆
  • 與服務端交互時,使用GSON、fastjson等框架解析服務端數據時,所寫的JSON對象類不混淆,不然沒法將JSON解析成對應的對象;
  • 使用第三方開源庫或者引用其餘第三方的SDK包時,若是有特別要求,也須要在混淆文件中加入對應的混淆規則;
  • 有用到WebView的JS調用也須要保證寫的接口方法不混淆,緣由和第一條同樣;
  • Parcelable的子類和Creator靜態成員變量不混淆,不然會產生Android.os.BadParcelableException異常;
-keep class * implements Android.os.Parcelable { 
 # 保持Parcelable不被混淆 
 public static final Android.os.Parcelable$Creator *;
 }
  • 使用enum類型時須要注意避免如下兩個方法混淆,由於enum類的特殊性,如下兩個方法會被反射調用,見第二條規則。
-keepclassmembers enum * { 
 public static **[] values(); 
 public static ** valueOf(java.lang.String); 
 }
  • 建議:發佈一款應用除了設minifyEnabled爲ture,你也應該設置zipAlignEnabled爲true,像Google Play強制要求開發者上傳的應用必須是通過zipAlign的,zipAlign可讓安裝包中的資源按4字節對齊,這樣能夠減小應用在運行時的內存消耗。

混淆狀況記錄

例子中使用:classA和classB,在加混淆的狀況下多種結果:app

  1. 若是classA沒有被keep,則不會看到classA的class文件
  2. 若是classA沒有被keep,classB被保持,同時classB引用到了classA,這個時候可以看到被混淆的classA的class文件,如顯示爲a
  3. 若是classA中經過反射,獲取到classB,那麼classB的類名及反射用到的方法必須keep住
  4. jar包混淆,暴露出的類、方法、方法的參數須要keep住
  5. 狀況說明:工程Demo依賴了 小米渠道的依賴,小米依賴又依賴了Common,對Common進行混淆可是不對小米渠道混淆,那麼小米的依賴中使用到的Common中的類都須要keep住

Android學習PDF+架構視頻+面試文檔+源碼筆記框架


感謝你們能耐着性子看完ide

在這裏小編也分享一份本身收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料幫助你們學習提高進階,也節省你們在網上搜索資料的時間來學習,也能夠分享給身邊好友一塊兒學習

若是你有須要的話,能夠點贊+評論關注我,而後加我VX:15388039515 我發給你
(或關注微信公衆號「Android開發之家」回覆【資料】免費領取)
你必需要了解的——Android混淆

你必需要了解的——Android混淆

你必需要了解的——Android混淆

你必需要了解的——Android混淆

相關文章
相關標籤/搜索