Android混淆的配置

打開混淆:

        release {
            //打開混淆
            minifyEnabled true
            //打開資源壓縮
            shrinkResources true
            //不顯示log
            buildConfigField "boolean", "LOG_DEBUG", "true"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

在app下的build.gradle 文件中 設(shè)置minifyEnabled true 即可打開混淆骑脱。
混淆文件配置:
混淆關(guān)鍵字:

關(guān)鍵字 描述
keep 保留類和類成員
keepnames 保留類和類成員但沒有被引用的類成員會被移除
keepclassmembers 只保留類成員
keepclassmembernames 只保留類成員但沒有被引用的成員會被移除
keepclasseswithmember 保留類和類成員,保留指明的成員
keepclasseswithmembernames 保留類和類成員,保留指明成員,成員沒有引用則移除

總結(jié):name:無引用成員刪除摸吠,members:只保留成員,with:保留指明成員嚎花。
dontwarn: 一般在引入library時配合keep使用寸痢,引入的library可能存在一些無法找到的引用和其他問題,在Build時可能會發(fā)出警告贩幻,不處理的話會導(dǎo)致編譯中止轿腺,為了保證編譯繼續(xù)使用dontwarn處理两嘴。
混淆通配符:

通配符 描述
<field> 匹配類中所有字段
<method> 匹配類中所有方法
<init> 匹配類中所有構(gòu)造函數(shù)
* 匹配任意長度字符丛楚,但不包括分隔符. 只保留當(dāng)前包,子包還是會被混淆 eg:com.android.view =>com.android.* com.*則不可匹配
** 匹配任意長度字符憔辫,包含分隔符 . 保留當(dāng)前包和所有子包
*** 匹配任意參數(shù)類型 eg:getName(***)

一些不應(yīng)混淆的東西:

  • 使用了自定義控件那么要保證它們不參與混淆使用了枚舉要保證枚舉不被混淆
  • 對第三方庫中的類不進(jìn)行混淆
  • 運(yùn)用了反射的類也不進(jìn)行混淆
  • 使用了 Gson 之類的工具要使 JavaBean 類即實體類不被混淆
  • 在引用第三方庫的時候趣些,一般會標(biāo)明庫的混淆規(guī)則的,建議在使用的時候就把混淆規(guī)則添加上去贰您,免得到最后才去找
  • 有用到 WebView 的 JS 調(diào)用也需要保證寫的接口方法不混淆坏平,原因和第一條一樣
  • Parcelable 的子類和 Creator 靜態(tài)成員變量不混淆,否則會產(chǎn)生 Android.os.BadParcelableException 異常
  • 使用的四大組件锦亦,自定義的Application* 實體類
  • JNI中調(diào)用的類
  • Layout布局使用的View構(gòu)造函數(shù)(自定義控件)舶替、android:onClick等。
    混淆模板:
# ------------------------------基本指令區(qū)---------------------------------
-optimizationpasses 5 #指定壓縮級別
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #混淆時采用的算法
-verbose #打印混淆的詳細(xì)信息
-dontoptimize #關(guān)閉優(yōu)化
-dontpreverify #不進(jìn)行預(yù)校驗杠园,可加快混淆速度
-keepattributes *Annotation* #保留注解中的參數(shù)
-keepattributes Signature  # 避免混淆泛型, 這在JSON實體映射時非常重要
-ignorewarnings # 屏蔽警告
-dontskipnonpubliclibraryclasses  # 指定不去忽略非公共的庫類(不跳過library中的非public的類)
-dontskipnonpubliclibraryclassmembers  # 指定不去忽略包可見的庫類的成員
-keepattributes SourceFile,LineNumberTable # 拋出異常時保留代碼行號
-printmapping proguardMapping.txt

# -------------------------------基本指令區(qū)--------------------------------


#---------------------------------默認(rèn)保留區(qū)---------------------------------
#繼承activity,application,service,broadcastReceiver,contentprovider....不進(jìn)行混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.support.multidex.MultiDexApplication
-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 * extends android.view.View
-keep class android.support.** {*;}


-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#表示不混淆上面聲明的類顾瞪,最后這兩個類我們基本也用不上,是接入Google原生的一些服務(wù)時使用的抛蚁。


 #不混淆View中的set***() 和 get***()方法 以保證屬性動畫正常工作  某個類中的某個方法不混淆
 #自定義View的set get方法 和 構(gòu)造方法不混淆
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
#這個主要是在layout 中寫的onclick方法android:onclick="onClick"陈醒,不進(jìn)行混淆
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

#實現(xiàn)Serializable接口的類重寫父類方法保留
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
# 保留R文件中所有靜態(tài)字段,以保證正確找到每個資源的ID
-keepclassmembers class **.R$* {
    public static <fields>;
}


-keepclassmembers class * {
    void *(*Event);
}

#保留枚舉類中的values和valueOf方法
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
#保留Parcelable實現(xiàn)類中的Creator字段瞧甩,以保證Parcelable機(jī)制正常工作 
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
#// natvie 方法不混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#不混淆包含native方法的類的類名以及native方法名
-keepclasseswithmembernames class * {
                native<methods>;
}


#對含有反射類的處理
-dontwarn com.suchengkeji.android.confusiondemo.md.**
-keep class com.suchengkeji.android.confusiondemo.md.** { *; }

#--------------------------------默認(rèn)保留區(qū)--------------------------------------------



#----------------------------- WebView(項目中沒有可以忽略) -----------------------------
#
#webView需要進(jìn)行特殊處理
-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);
}
#在app中與HTML5的JavaScript的交互進(jìn)行特殊處理
#我們需要確保這些js要調(diào)用的原生方法不能夠被混淆钉跷,于是我們需要做如下處理:
-keepclassmembers class com.ljd.example.JSInterface {
    <methods>;
}

#----------------------------- WebView(項目中沒有可以忽略) -----------------------------


#----------------------------- 實體類不可混淆 ------------------------------------------

#----------------------------- 添加實體類混淆規(guī)則 ---------------------------------------

#----------------------------- 實體類不可混淆 ------------------------------------------


#----------------------------- 第三方類庫 ------------------------------------------

#----------------------------- 添加第三方類庫的混淆規(guī)則 ---------------------------------------

#----------------------------- 第三方類庫 ------------------------------------------

本文摘錄自:http://www.reibang.com/p/b5b2a5dfaaf4
如有需要請移步原文。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肚逸,一起剝皮案震驚了整個濱河市爷辙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朦促,老刑警劉巖膝晾,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異思灰,居然都是意外死亡玷犹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歹颓,“玉大人坯屿,你說我怎么就攤上這事∥】福” “怎么了领跛?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撤奸。 經(jīng)常有香客問我吠昭,道長,這世上最難降的妖魔是什么胧瓜? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任矢棚,我火速辦了婚禮,結(jié)果婚禮上府喳,老公的妹妹穿的比我還像新娘蒲肋。我一直安慰自己,他們只是感情好钝满,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布兜粘。 她就那樣靜靜地躺著,像睡著了一般弯蚜。 火紅的嫁衣襯著肌膚如雪孔轴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天碎捺,我揣著相機(jī)與錄音路鹰,去河邊找鬼。 笑死牵寺,一個胖子當(dāng)著我的面吹牛悍引,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帽氓,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趣斤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了黎休?” 一聲冷哼從身側(cè)響起浓领,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎势腮,沒想到半個月后联贩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捎拯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年泪幌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祸泪,死狀恐怖吗浩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情没隘,我是刑警寧澤懂扼,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站右蒲,受9級特大地震影響阀湿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瑰妄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一陷嘴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翰撑,春花似錦罩旋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓜饥。三九已至逝撬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乓土,已是汗流浹背宪潮。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趣苏,地道東北人狡相。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像食磕,于是被迫代替她去往敵國和親尽棕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容