1. 程式人生 > >proguard-rules 常用第三方庫的混淆配置

proguard-rules 常用第三方庫的混淆配置

轉載來源http://blog.csdn.net/yuhanghate/article/details/51656804

Android 工程中有時候需要混淆,減少包大小及增加反編譯難度。

AS中建立工程時預設建立了proguard-android.txt檔案,自己如果需要增加一些第三方庫需要自己在proguard-rules.txt檔案中配置混淆檔案。

ProGuard簡介
      JAVA中預設使用ProGuard進行混淆。 ProGuard能夠對Java類中的程式碼進行壓縮(Shrink),優化(Optimize),混淆(Obfuscate),預檢(Preveirfy)。 
  1. 壓縮(Shrink):在壓縮處理這一步中,用於檢測和刪除沒有使用的類,欄位,方法和屬性。 
  2. 優化(Optimize):在優化處理這一步中,對位元組碼進行優化,並且移除無用指令。 
  3. 混淆(Obfuscate):在混淆處理這一步中,使用a,b,c等無意義的名稱,對類,欄位和方法進行重新命名。 
  4. 預檢(Preveirfy):在預檢這一步中,主要是在Java平臺上對處理後的程式碼進行預檢。 
Proguard-android使用
在Gradle.builde檔案中指定混淆檔案
  1. buildTypes {  
  2.     release {  
  3.         minifyEnabled true
  4.         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  5.     }  
  6. }  

如果需gradle.builde檔案的基本配置,請點選這裡

第三方庫及基本混淆配置

Glide配置:google官方出的圖片載入庫,流暢度目前最高
  1. -keep public
    class * implements com.bumptech.glide.module.GlideModule  
  2. -keep publicenum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {  
  3.   **[] $VALUES;  
  4.   public *;  
  5. }  
  1. </pre><h5><span style="font-family:microsoft yahei; color:#362e2b">Retrofit 2.0配置:基於Resetful api的網路庫,基於支援NIO的Okhttp。效能很高並支援Rxjava</span></h5></div><div><span style=
    "font-family:microsoft yahei; color:#362e2b"></span><pre code_snippet_id="1715182" snippet_file_name="blog_20160613_4_6756916" name="code"class="java">-dontwarn retrofit2.**  
  2. -keep class retrofit2.** { *; }  
  3. -keepattributes Signature  
  4. -keepattributes Exceptions  
stetho配置:Facebook出的黑科技。使用Okhttp框架支援Chrome顯示app日誌及資料庫等資料
  1. -keep class com.facebook.stetho.** { *; }  
  2. -dontwarn org.mozilla.javascript.**  
  3. -dontwarn org.mozilla.classfile.**  
  4. -keep class org.mozilla.javascript.** { *; }  
Gson配置:Json轉POJO。官方出品的Json經典庫
  1. -keep publicclass com.google.gson.**  
  2. -keep publicclass com.google.gson.** {publicprivateprotected *;}  
  3. -keep class sun.misc.Unsafe { *; }  
  4. -keepattributes Signature  
  5. -keepattributes *Annotation*  
butterknife配置:大神JakeWharton出的View註解庫。簡單好用效能極高,因為沒有使用反射
  1. -keepclasseswithmembernames class * {  
  2.     @butterknife.* <fields>;  
  3. }  
  4. -keepclasseswithmembernames class * {  
  5.     @butterknife.* <methods>;  
  6. }  

View配置:系統自帶和google支援庫
  1. -dontwarn android.support.**  
  2. -dontwarn com.google.android.maps.**  
  3. -dontwarn com.slidingmenu.lib.app.SlidingMapActivity  
  4. -keep class android.support.** { *; }  
  5. -keep class com.actionbarsherlock.** { *; }  
  6. -keep interface com.actionbarsherlock.** { *; }  
  7. -keep class com.slidingmenu.** { *; }  
  8. -keep interface com.slidingmenu.** { *; }  

序列化配置:Serializable和Parcelable
  1. -keepclassmembers class * implements java.io.Serializable {  
  2.     staticfinallong serialVersionUID;  
  3.     privatestaticfinal java.io.ObjectStreamField[] serialPersistentFields;  
  4.     privatevoid writeObject(java.io.ObjectOutputStream);  
  5.     privatevoid readObject(java.io.ObjectInputStream);  
  6.     java.lang.Object writeReplace();  
  7.     java.lang.Object readResolve();  
  8. }  
  9. -keep publicclass * implements java.io.Serializable {*;}  
  10. -keepclassmembers class * implements android.os.Parcelable {  
  11.  public <fields>;  
  12.  private <fields>;  
  13. }  
  14. -keep class * implements android.os.Parcelable {  
  15.   publicstaticfinal android.os.Parcelable$Creator *;  
  16. }  

java8 retrolambda 配置:支援Java8的部分新特性。當然如果使用google自帶的java8也可以,但不支援apt。詳細說明請點選這裡
  1. -dontwarn java.lang.invoke.*  
新浪微博:很草蛋,沒有官方給的混淆。自己上
  1.  -keep class com.sina.weibo.sdk.* { *; }  
  2. -keep class android.support.v4.* { *; }  
  3. -keep class com.tencent.* { *; }  
  4. -keep class com.baidu.* { *; }  
  5. -keep class lombok.ast.ecj.* { *; }  
  6. -dontwarn android.support.v4.**  
  7. -dontwarn com.tencent.**s  
  8. -dontwarn com.baidu.**  
Okio:基於NIO的流。大公司出品,不解釋
  1. -dontwarn com.squareup.**  
  2. -dontwarn okio.**  
  3. -keep publicclass org.codehaus.* { *; }  
  4. -keep publicclass java.nio.* { *; }  

Ormlite配置:資料庫。其實不想用這個,接手的時候用這個。有空換高效能的GreenDao2庫,畢竟google在接手了穩定性及支援力度第靠譜
  1. -keepattributes *DatabaseField*  
  2. -keepattributes *DatabaseTable*  
  3. -keepattributes *SerializedName*  
  4. -keep class com.j256.**  
  5. -keepclassmembers class com.j256.** { *; }  
  6. -keep enum com.j256.**  
  7. -keepclassmembers enum com.j256.** { *; }  
  8. -keep interface com.j256.**  
  9. -keepclassmembers interface com.j256.** { *; }  

Rxjava:很好用的庫。目前國內很多專案都開始用這個了。個人推薦,贊
  1. -dontwarn sun.misc.**  
  2. -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {  
  3.  long producerIndex;  
  4.  long consumerIndex;  
  5. }  
  6. -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {  
  7.  rx.internal.util.atomic.LinkedQueueNode producerNode;  
  8. }  
  9. -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {  
  10.  rx.internal.util.atomic.LinkedQueueNode consumerNode;  
  11. }  
WebView配置
  1. -keepclassmembers class fqcn.of.javascript.interface.for.webview {  
  2.    public *;  
  3. }  
  4. -keepclassmembers class * extends android.webkit.webViewClient {  
  5.     publicvoid *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);  
  6.     publicboolean *(android.webkit.WebView, java.lang.String);  
  7. }  
  8. -keepclassmembers class * extends android.webkit.webViewClient {  
  9.     publicvoid *(android.webkit.webView, jav.lang.String);  
  10. }  
自己專案配置:使用Gson時需要配置Gson的解析物件及變數都不混淆。不然Gson會找不到變數。
注意:替換成自己工程下指定目錄即可。我使用的是自己工程下
  1. 包名:net.shopnc.shop  
指定目錄下的所有檔案:net.shopnc.shop.http.params.**

  1. -keep publicclass net.shopnc.shop.http.params.** {publicprivateprotected *;}  
  2. -keep publicclass net.shopnc.shop.http.result.** {publicprivateprotected *;}  

如果對ProGuard不太瞭解,可以檢視這篇文章。http://blog.csdn.net/ljd2038/article/details/51308768#reply