關(guān)于AndroidStudio混淆配置

1.首先需要在app下的build.gradle下配置,true表示編譯時(shí)會(huì)混淆代碼\

Paste_Image.png
Paste_Image.png

2.在proguard-rules.pro中配置,android常用的混淆配置

對(duì)于一些基本指令的添加############################################### 代碼混淆壓縮比,在0~7之間,默認(rèn)為5,一般不做修改

-optimizationpasses 5

混合時(shí)不使用大小寫(xiě)混合,混合后的類(lèi)名為小寫(xiě)

-dontusemixedcaseclassnames

指定不去忽略非公共庫(kù)的類(lèi)

-dontskipnonpubliclibraryclasses

這句話能夠使我們的項(xiàng)目混淆后產(chǎn)生映射文件# 包含有類(lèi)名->混淆后類(lèi)名的映射關(guān)系

-verbose

指定不去忽略非公共庫(kù)的類(lèi)成員

-dontskipnonpubliclibraryclassmembers

不做預(yù)校驗(yàn),preverify是proguard的四個(gè)步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度。

-dontpreverify

保留Annotation不混淆

-keepattributes Annotation,InnerClasses

避免混淆泛型

-keepattributes Signature

拋出異常時(shí)保留代碼行號(hào)

-keepattributes SourceFile,LineNumberTable

指定混淆是采用的算法,后面的參數(shù)是一個(gè)過(guò)濾器

這個(gè)過(guò)濾器是谷歌推薦的算法,一般不做更改

-optimizations !code/simplification/cast,!field/,!class/merging/
############################################### Android開(kāi)發(fā)中一些需要保留的公共部分############################################### 保留我們使用的四大組件,自定義的Application等等這些類(lèi)不被混淆# 因?yàn)檫@些子類(lèi)都有可能被外部調(diào)用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-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 public class com.android.vending.licensing.ILicensingService

保留support下的所有類(lèi)及其內(nèi)部類(lèi)

-keep class android.support.** {*;}

保留繼承的

-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**

保留R下面的資源

-keep class .R$ {;}

保留本地native方法不被混淆

-keepclasseswithmembernames class * { native <methods>;}

保留在Activity中的方法參數(shù)是view的方法,

這樣以來(lái)我們?cè)趌ayout中寫(xiě)的onClick就不會(huì)被影響-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);}

保留枚舉類(lèi)不被混淆

-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}

保留我們自定義控件(繼承自View)不被混淆

-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);}

保留Parcelable序列化類(lèi)不被混淆

-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;}

保留Serializable序列化的類(lèi)不被混淆

-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; !private <fields>; !private <methods>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}

對(duì)于帶有回調(diào)函數(shù)的onXXEvent、*OnListener的,不能被混淆

-keepclassmembers class * { void (OnEvent); void (OnListener);}

webView處理,項(xiàng)目中沒(méi)有使用到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類(lèi)打印各個(gè)等級(jí)日志的代碼,打正式包的時(shí)候可以做為禁log使用,這里可以作為禁止log打印的功能使用

記得proguard-android.txt中一定不要加-dontoptimize才起作用

另外的一種實(shí)現(xiàn)方案是通過(guò)BuildConfig.DEBUG的變量來(lái)控制

-assumenosideeffects class android.util.Log {

public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);

某個(gè)包下的類(lèi)不用混淆

-------------處理本應(yīng)用不需要混淆的代碼-------------------

keep class com.android.smarttouch.ctrl.** { *; }

網(wǎng)絡(luò)上有許多混淆規(guī)則的代碼,看官方文檔最好:gradle example,這里面有對(duì)各種sdk和library混淆時(shí)候時(shí)已經(jīng)寫(xiě)好的混淆代碼,直接去抄里面的示例代碼就好。混淆時(shí)最麻煩的幾點(diǎn)就是:
第三方lib包的混淆(不再有警告提醒)比如對(duì)apache的common包,dom4j的混淆,可以不用混淆
##############################################
不警告
-dontwarn org.dom4j.**

不混淆

-keep class org.dom4j.** { ; }
-dontwarn org.apache.
*
-keep class org.apache.** { ; }
-dontwarn org.xmlpull.
*
-keep class org.xmlpull.** { ; }
-dontwarn com.jcraft.
*
-keep class com.jcraft.** { *; }

3.不能混淆的代碼

  顧名思義,不能混淆代碼如果被混淆了,就會(huì)出現(xiàn)錯(cuò)誤。

  1)需要反射的代碼
  2)系統(tǒng)接口
  3)Jni接口
  4)需要序列號(hào)和反序列化的代碼(即實(shí)現(xiàn)Serializable接口的JavaBean)
  5)與服務(wù)端進(jìn)行元數(shù)據(jù)交互的JavaBean(JSON、XML中對(duì)應(yīng)的類(lèi))

4.常見(jiàn)錯(cuò)誤

  1. Proguard returned with error code 1. See console
    更新proguard版本
    Android-support-v4 不進(jìn)行混淆
    添加缺少相應(yīng)的庫(kù)

  2. 使用gson包解析數(shù)據(jù)時(shí),出現(xiàn) missing type parameter 異常

    在 proguard-project.txt 中添加
    -dontobfuscate
    -dontoptimize
    在 proguard-project.txt 中添加

    removes such information by default, so configure it to keep all of it.

    -keepattributes Signature

    Gson specific classes

    -keep class sun.misc.Unsafe { *; }

    -keep class com.google.gson.stream.* { ; }

    Application classes that will be serialized/deserialized over Gson

-keep class com.google.gson.examples.android.model.* { ; }

  1. 類(lèi)型轉(zhuǎn)換錯(cuò)誤
    在 proguard-project.txt 中添加
    -keepattributes Signature

  2. 空指針異常
    混淆過(guò)濾掉相關(guān)類(lèi)與方法

  3. java.lang.reflect.UndeclaredThrowableException
    -keep interface com.dev.impl.**

  4. Error: Unable to access jarfile ..libproguard.jar
    路徑問(wèn)題

  5. java.lang.NoSuchMethodError
    這也是最常見(jiàn)的問(wèn)題,因?yàn)檎也坏较嚓P(guān)方法,方法被混淆了,混淆過(guò)濾掉相關(guān)方法便可。

5.示例:

---------------------------------1.實(shí)體類(lèi)---------------------------------

-keep class com.package.bean.** { *; }

-------------------------------------------------------------------------

---------------------------------2.第三方包-------------------------------

eventBus

-keepattributes Annotation
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}

glide

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
*[] $VALUES;
public ;
}
-keep class com.bumptech.glide.
{ *; }

retrofit2

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

-dontwarn org.robovm.**
-keep class org.robovm.** { *; }

okhttp3

-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { ;}
-keep class okhttp3.
* { ;}
-keep class okio.
* { ;}
-dontwarn sun.security.
*
-keep class sun.security.** { ;}
-dontwarn okio.
*
-dontwarn okhttp3.**

rxjava

-dontwarn rx.**
-keep class rx.** { *; }

-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.ArrayQueueField* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

baidu

-keep class com.baidu.** { ; }
-dontwarn com.baidu.
*

alipay

-keep class com.alipay.android.app.IAlixPay{;}
-keep class com.alipay.android.app.IAlixPay$Stub{
;}
-keep class com.alipay.android.app.IRemoteServiceCallback{;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{
;}
-keep class com.alipay.sdk.app.PayTask{ public ;}
-keep class com.alipay.sdk.app.AuthTask{ public ;}
-keep class com.alipay.mobilesecuritysdk.

-keep class com.ut.

-dontwarn android.net.**
-keep class android.net.** { *; }

gson

-keep class com.google.gson.** {*;}

-keep class com.google.*{;}

-keep class sun.misc.Unsafe { ; }
-keep class com.google.gson.stream.
* { ; }
-keep class com.google.gson.examples.android.model.
* { ; }
-keep class com.google.
* {
<fields>;
<methods>;
}
-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();
}
-dontwarn com.google.gson.**

umeng

-dontwarn com.umeng.**
-keep class com.umeng.{;}
-keep class u.aly.
{;}
-keep class com.google.*{;}

butterknife

-keep class butterknife.** { ; }
-dontwarn butterknife.internal.
*
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}

pinyin4j

-dontwarn net.soureceforge.pinyin4j.**
-dontwarn demo.**
-libraryjars src/libs/pinyin4j-2.5.0.jar
-keep class net.sourceforge.pinyin4j.** { ;}
-keep class demo.
* { ;}
-keep class com.hp.
* { *;}

httpclient (org.apache.http.legacy.jar)

-dontwarn android.net.compatibility.**
-dontwarn android.net.http.**
-dontwarn com.android.internal.http.multipart.**
-dontwarn org.apache.commons.**
-dontwarn org.apache.http.**
-dontwarn org.apache.http.protocol.**
-keep class android.net.compatibility.*{;}

-keep class android.net.http.*{;}

-keep class com.android.internal.http.multipart.{;}
-keep class org.apache.commons.
{;}
-keep class org.apache.org.{;}
-keep class org.apache.harmony.
{;}

lib-wheel

-dontwarn kankan.wheel.**
-keep class kankan.wheel.*{;}

PhotoPicker

-dontwarn me.iwf.photopicker.**
-keep class me.iwf.photopicker.*{;}

nineoldandroids

-dontwarn com.nineoldandroids.*
-keep class com.nineoldandroids.** { *;}

weixin

-dontwarn com.tencent.mm.**
-keep class com.tencent.mm.*{;}

topsnackbar

-dontwarn com.androidadvance.topsnackbar.**
-keep class com.androidadvance.topsnackbar.*{;}

pull_recyclerview_library

-dontwarn com.cundong.recyclerview.**
-keep class com.cundong.recyclerview.*{;}

-------------------------------------------------------------------------

---------------------------------3.與js互相調(diào)用的類(lèi)------------------------

-------------------------------------------------------------------------

---------------------------------4.反射相關(guān)的類(lèi)和方法-----------------------

----------------------------------------------------------------------------

-------------------------------------------基本不用動(dòng)區(qū)域--------------------------------------------

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

-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/,!class/merging/
-keepattributes Annotation,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable

-ignorewarnings

----------------------------------------------------------------------------

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

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-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 public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
-keep public class * extends android.os.IInterface

-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);
}
-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();
}
-keep class .R$ {
;
}
-keepclassmembers class * {
void (
On
Event);
}

-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native <methods>;
}

-keepclasseswithmembers class * { # 保持自定義控件類(lèi)不被混淆
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {# 保持自定義控件類(lèi)不被混淆
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity { # 保持自定義控件類(lèi)不被混淆
public void *(android.view.View);
}

-keepclassmembers enum * { # 保持枚舉 enum 類(lèi)不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}

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

----------------------------------------------------------------------------

---------------------------------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);
}

----------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,409評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,569評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,360評(píng)論 6 404
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,895評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,123評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,559評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,742評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評(píng)論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,981評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,363評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,622評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,354評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,707評(píng)論 2 370

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

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書(shū)架上的書(shū)閱讀 3,903評(píng)論 2 8
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,776評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,593評(píng)論 25 707
  • 5分鐘搞定android混淆 前言 混淆是上線前挺重要的一個(gè)環(huán)節(jié)。android使用的ProGuard,可以起到壓...
    garyhu1閱讀 757評(píng)論 0 1
  • expansion of enrollment realistic intensive industry pay ...
    楷歌Kale閱讀 149評(píng)論 0 0