打開混淆:
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
如有需要請移步原文。