AS配置檔案+gradle配置+混淆配置
阿新 • • 發佈:2019-01-23
###################################################################### # # 1.語法規則 # (成員變數不管是否被引用,都不會刪除,若指定就保留,未指定就重新命名) # 加 names 和 不加 names 區別: # 不加 names: 當 類的成員沒有被引用時,這個類不會被刪除 # 加 names: 當 類的成員沒有被引用時,這個類會被刪除 # # 關鍵字 1.壓縮刪除 2.類名是否保留(刪除後) 3.成員是否保留(刪除後) 描述 # # keep 先刪除 未被引用的方法 保留 再保留 指定成員名,最後重新命名 其餘成員名 # # keepclassmembers 先刪除 未被引用的方法 重名 再保留 指定成員名,最後重新命名 其餘成員名 # # keepclasseswithmembers 先刪除 未被引用的方法 指定成員存在就保留,不存在就重名 再保留 指定成員名,最後重新命名 其餘成員名 # # keepnames 先刪除 未被引用的方法 保留 再保留 指定成員名,最後重新命名 其餘成員名 # # keepclassmembernames 先刪除 未被引用的方法 重名 再保留 指定成員名,最後重新命名 其餘成員名 # # keepclasseswithmembernames 先刪除 未被引用的方法 指定成員存在就保留,不存在就重名 再保留 指定成員名,最後重新命名 其餘成員名 # # -keepattributes attribute_name,... 保護給定的可選屬性,例如LocalVariableTable,EnclosingMethod, # Deprecated, Synthetic 等. # -dontwarn [class_filter] 不列印指定類的警告資訊(不是每個第三方SDK都需要-dontwarn,這取決於混淆時第三方SDK是否出現警告,需要的時候再加上) # # # 萬用字元 描述 # 匹配類中的所有欄位 # 匹配類中的所有方法 # 匹配類中的所有建構函式 # ? 匹配單個字元 # % 匹配任何基礎型別的型別名 # * 匹配任意長度字元,但不含包名分隔符(.)。 # 比如說我們的完整類名是com.example.test.MyActivity,使用com.*,或者com.exmaple.*都是無法匹配的,因為*無法匹配包名中的分隔符, # 正確的匹配方式是com.exmaple.*.*,或者com.exmaple.test.*,這些都是可以的。 # 但如果你不寫任何其它內容,只有一個*,那就表示匹配所有的東西。 # *(當用在類裡面時) 匹配任何欄位和方法 # ** 匹配任意長度字元,並且包含包名分隔符(.)。 # 比如 android.support.** 就可以匹配android.support包下的所有內容,包括任意長度的子包。 # *** 匹配任意引數型別。 # 比如void set*(***)就能匹配任意傳入的引數型別,*** get*()就能匹配任意返回值的型別。 # … 匹配任意長度的任意型別引數。 # 比如void test(…)就能匹配任意void test(String a)或者是void test(int a, String b)這些方法。 # $ 指內部類 # # # # 2.不能混淆的程式碼 # 1.需要反射的程式碼 # 2.系統介面(AndroidMainfest 中的類(四大元件,Application 的子類), Framework 層下所有的類,support包, webview,js等) # 3.Jni介面 # 4.需要序列號和反序列化的程式碼 # 5.與服務端進行元資料互動的實體類(JSON、XML中對應的實體類) # 6.GSON、fastjson 等框架時,所寫的 JSON 實體類 # 7.第三方庫一般是不需要混淆的 # ###################################################################### ###################################################################### # # 1.特殊處理 # # 實體類(在開發的時候我們可以將所有的實體類放在一個包內,這樣我們寫一次混淆就行了) -keep public class com.huyu.entity.** { public void set*(***); public *** get*(); public *** is*(); } # 介面(對外介面的public類名和成員名,否則外部無法呼叫) -keep public interface com.huyu.interfaces.**{*;} -keep public enum com.test.test.**{*;} # 內部類或內部介面 -keep class com.huyu.utils.MyUtils$* {*;} # 測試 keep -keep class com.huyu.utils.TestKeep{ public void use2(); } -keepclassmembers class com.huyu.utils.TestKeepclassmembers{ public void use2(); } -keepclasseswithmembers class com.huyu.utils.TestKeepclasseswithmembers{ public void use1(); } -keepnames class com.huyu.utils.TestKeepnames{ public void use2(); public void use4(int); public void use5(int); } -keepclassmembernames class com.huyu.utils.TestKeepclassmembernames{ public void use2(); } -keepclasseswithmembernames class com.huyu.utils.TestKeepclasseswithmembernames{ public void use1(); } # 專案中其他Module的警告 #-dontwarn com.test.** # 反射類 # 一般而言,使用反射一般會有以下方式,可以搜尋程式碼,找到相關的類,然後在混淆配置裡面進行保留 # Class.forName(“SomeClass”) # SomeClass.class # SomeClass.class.getField(“someField”) # SomeClass.class.getDeclaredField(“someField”) # SomeClass.class.getMethod(“someMethod”, new Class[] {}) # SomeClass.class.getMethod(“someMethod”, new Class[] { A.class }) # SomeClass.class.getMethod(“someMethod”, new Class[] { A.class, B.class }) # SomeClass.class.getDeclaredMethod(“someMethod”, new Class[] {}) # SomeClass.class.getDeclaredMethod(“someMethod”, new Class[] { A.class }) # SomeClass.class.getDeclaredMethod(“someMethod”, new Class[] { A.class, B.class }) # AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, “someField”) # AtomicLongFieldUpdater.newUpdater(SomeClass.class, “someField”) # AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, “someField”) # #-keep class com.huyu.reflectClass { *; } # 保留反射的 類名 和 類的所有成員 # js互動 # 在app中與HTML5的JavaScript的互動進行特殊處理,如 # package com.ljd.example; # # public class JSInterface { # @JavascriptInterface # public void callAndroidMethod(){ # // do something # } # } # 我們需要確保這些js要呼叫的原生方法不能夠被混淆,於是我們需要做如下處理 # -keepclassmembers class com.ljd.example.JSInterface { # ; # } # # # ###################################################################### ###################################################################### # # 2.常用第三方jar處理 # (格式) # -dontwarn com.alibaba.** # -keep class com.alibaba.** {*;} # # 機智雲 -dontwarn com.gizwits.** -keep class com.gizwits.**{ *;} # Volley -keep class com.android.volley.** {*;} -keep class com.android.volley.toolbox.** {*;} -keep class com.android.volley.Response$* { *; } -keep class com.android.volley.Request$* { *; } -keep class com.android.volley.RequestQueue$* { *; } -keep class com.android.volley.toolbox.HurlStack$* { *; } -keep class com.android.volley.toolbox.ImageLoader$* { *; } # N62 -keep public class com.p2p.core.MediaPlayer{ public private ; private int mNativeContext; } -keep public class com.p2p.core.VideoView{ public private ; } #pinyin4j -dontwarn net.soureceforge.pinyin4j.** -dontwarn demo.** -keep class net.sourceforge.pinyin4j.** { *;} -keep class demo.** { *;} -keep class com.hp.** { *;} #nineoldandroids -dontwarn com.nineoldandroids.* -keep class com.nineoldandroids.** { *;} # UIL -keep class com.nostra13.universalimageloader.** { *; } -keepclassmembers class com.nostra13.universalimageloader.** {*;} # 阿里產品(fastjson等) -dontwarn com.alibaba.** -keep class com.alibaba.** { *; } # 騰訊產品(QQ授權,微信授權等) -dontwarn com.tencent.** -keep class com.tencent.** {*;} # 百度產品(推送,自升級等) -dontwarn com.baidu.** -keep class com.baidu.**{*; } # 極光推送 -dontwarn cn.jpush.** -dontwarn cn.jiguang.** -keep class cn.jpush.** { *; } -keep class cn.jiguang.** { *; } # 小米推送 #可以防止一個誤報的 warning 導致無法成功編譯,如果編譯使用的 Android 版本是 23。 -dontwarn com.xiaomi.push.** #這裡 com.xiaomi.mipushdemo.DemoMessageRreceiver 改成 app 中定義的完整類名 #-keep class cn.jpush.android.service.PluginXiaomiPlatformsReceiver {*;} # 訊飛語音 -dontwarn com.iflytek.** -keep class com.iflytek.** {*;} # # ############################################################################# ###################################################################### # # 3.基礎不用動的規則 # -dontskipnonpubliclibraryclasses # 不忽略非公共的庫類 -dontskipnonpubliclibraryclassmembers # 指定不去忽略非公共庫的類成員 -optimizationpasses 5 # 指定程式碼的壓縮級別在0~7之間,預設為5,一般不做修改 -dontusemixedcaseclassnames # 不使用大小寫混合,混合後的類名為小寫 -dontpreverify # 混淆時不做預校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度 -verbose # 混淆時記錄日誌 -dontoptimize # 不優化輸入的類檔案,優化選項是預設開啟的(如果需要刪除log,此選項需要去除) -keepattributes Signature # 不混淆泛型,如果混淆報錯建議關掉 -keepattributes EnclosingMethod # 不混淆反射 -keepattributes *Annotation*,InnerClasses # 保持註解,內部類 -keepattributes SourceFile,LineNumberTable # 丟擲異常時保留程式碼行號 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆時所採用的演算法(谷歌推薦) # 保留我們使用的四大元件,自定義的Application等等這些類不被混淆,因為這些子類都有可能被外部呼叫 -keep public class * extends android.app.Application -keep public class * extends android.app.Fragment -keep public class * extends android.app.Activity -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.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keep public class com.google.vending.licensing.ILicensingService -keep public class * extends android.os.IInterface #記錄生成的日誌資料 -dump class_files.txt #列出 apk包內所有class的內部結構 -printseeds seeds.txt #列出 未混淆的類和成員 -printusage unused.txt #列出 未被使用的程式碼 -printmapping mapping.txt #列出 混淆前後的對映 -dontwarn android.support.** # 不提示相容庫的錯誤警告 -keep class android.support.** {*;} # 保留support下的所有類及其內部類 -keep public class * extends android.support.** # 保留support下v4,v7等子類 -keep class **.R$* {*;} # 保留R下面的資源 #保持 含有 native 函式 的 類 和 native 成員函式 不被混淆 -keepclasseswithmembernames class * { native ; } #保持Activity中的方法引數是view的方法,如 xml 佈局使用了 doClick 等事件 -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } #保持 Parcelable 不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } #保持 Serializable 不被混淆 -keepnames class * implements java.io.Serializable #保持 Serializable 不被混淆並且enum 類也不被混淆 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient ; !private ; !private ; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 保留列舉類不被混淆(如果報錯,可以去掉這項) -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保持自定義控制元件類不被混淆 -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } -keep public class * extends android.view.View { *** get*(); void set*(***); public (android.content.Context); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); } # 對於帶有回撥函式的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * { void *(**On*Event); void *(**On*Listener); } #-----------處理webView處理--------------- -keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.webView, jav.lang.String); } # 移除一些log程式碼 -assumenosideeffects class android.util.Log { public static *** v(...); public static *** i(...); public static *** d(...); public static *** w(...); public static *** e(...); } # # # ######################################################################