1. 程式人生 > >AS配置檔案+gradle配置+混淆配置

AS配置檔案+gradle配置+混淆配置

######################################################################
    #
    #   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(...);
                                                            }
#
#
#
######################################################################