android混淆

目的

Proguard是一個Java類文件壓縮器、優(yōu)化器咙鞍、混淆器房官、預校驗器。壓縮環(huán)節(jié)會檢測以及移除沒有用到的類续滋、字段翰守、方法以及屬性。優(yōu)化環(huán)節(jié)會分析以及優(yōu)化方法的字節(jié)碼疲酌±澹混淆環(huán)節(jié)會用無意義的短變量去重命名類、變量朗恳、方法湿颅。這些步驟讓代碼更精簡,更高效粥诫,也更難被逆向(破解)油航。

開啟

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
            }
        }
}

minifyEnabled為true,打開混淆怀浆;加上shrinkResources true谊囚,打開資源壓縮怕享。
proguard-android.txt代表系統(tǒng)默認的混淆規(guī)則配置文件,該文件在<Android SDK目錄>/tools/proguard下
proguard-rules.pro代碼表當前project的混淆配置文件镰踏,在app module下

追溯Crash堆棧信息

使用<SDK目錄>\tools\proguard\bin下的proguardgui.bat腳本將Crash堆棧信息還原到混淆前的狀態(tài)函筋。步驟如下:
雙擊打開腳本,選擇左邊的ReTrace選項
選擇Mapping file文件奠伪,也就是混淆后打包后在app module/build/outputs/mapping/release下生成的mapping.txt
拷貝混淆后的堆棧信息
點擊右下角的ReTrace!按鈕跌帐,完成Crash堆棧信息的追溯

注意

Proguard混淆規(guī)則一般在以下情況下不混淆,
1.使用了自定義控件芳来,四大組件保證它們不參與混淆
2.使用了枚舉要保證枚舉不被混淆
3.對第三方庫中的類不進行混淆
4.運用了反射的類也不進行混淆
5.使用了 Gson 之類的工具要使 JavaBean 類即實體類不被混淆
6.在引用第三方庫的時候含末,一般會標明庫的混淆規(guī)則的,建議在使用的時候就把混淆規(guī)則添加上去即舌,免得到最后才去找
7.有用到 WebView 的 JS 調(diào)用也需要保證寫的接口方法不混淆佣盒,原因和第一條一樣
8.Parcelable 的子類和 Creator 靜態(tài)成員變量不混淆,否則會產(chǎn)生 Android.os.BadParcelableException 異常顽聂,Serializable序列化也是不混淆

命令及作用

保持相關元素不參與混淆的規(guī)則相關的幾種命令
keep 保留類和類成員肥惭,防止被混淆或移除
keepnames 保留類和類成員,防止被混淆紊搪,但沒有被引用的類成員會被移除
keepclassmembers 只保留類成員蜜葱,防止被混淆或移除
keepclassmembernames 只保留類成員,防止被混淆耀石,但沒有被引用的成員會被移除
keepclasseswithmembers 保留類和類成員牵囤,防止被混淆或移除,如果指定的類成員不存在還是會被混淆
keepclasseswithmembernames 保留類和類成員滞伟,防止被混淆揭鳞,如果指定的類成員不存在還是會被混淆,沒有被引用的類成員會被移除

-Keep

#保持類名不混淆
-keep class pr.tongson.bean.KeyBoardBean
#包內(nèi)的類
-keep class pr.tongson.bean.*
#包內(nèi)及子包的類
-keep class pr.tongson.bean.**
#保持類名和類里面的內(nèi)容不被混淆梆奈,加上{*;}
-keep class pr.tongson.bean.*{*;}
-keep class pr.tongson.algorithm.Calculate{
  #保持該類下所有的共有方法不被混淆
  public <methods>;
  #保持該類下所有的共有內(nèi)容不被混淆
  public *;
  #保持該類下所有的私有方法不被混淆
  private <methods>;
  #保持該類下所有的私有內(nèi)容不被混淆
  private *;
  #保持該類的String類型的構造方法
  public <init>(java.lang.String);
}
#保持Calculate中的內(nèi)部類MyClass不被混淆
-keep class pr.tongson.algorithm.Calculate$MyClass{*;}
#用extends野崇,implement等這些Java規(guī)則
-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.view.View
#不需要保持類名,保持該類下的特定方法亩钟,用keepclassmembers乓梨,而不是keep
-keepclassmembernames class pr.tongson.algorithm.Calculate{
  public void test(java.lang.String);
}
#jni方法不可混淆,因為native方法是要完整的包名類名方法名
#保持native方法不被混淆
-keepclasseswithmembernames class * {    
  native <methods>; 
}
#Parcelable的子類和Creator靜態(tài)成員變量不混淆清酥,否則會產(chǎn)生Android.os.BadParcelableException異常
-keep class * implements Android.os.Parcelable { 
  # 保持Parcelable不被混淆            
  public static final Android.os.Parcelable$Creator *;
}
#enum類的特殊性扶镀,以下兩個方法會被反射調(diào)用
-keepclassmembers enum * {  
  public static **[] values();  
  public static ** valueOf(java.lang.String);  
}

常用

# 代碼混淆壓縮比,在0~7之間
-optimizationpasses 5
# 混合時不使用大小寫混合总处,混合后的類名為小寫
-dontusemixedcaseclassnames
# 指定不去忽略非公共庫的類
-dontskipnonpubliclibraryclasses
# 不做預校驗狈惫,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度胧谈。
-dontpreverify
# 這句話能夠使我們的項目混淆后產(chǎn)生映射文件
# 包含有類名->混淆后類名的映射關系
-verbose
# 避免混淆泛型
-keepattributes Signature

# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
#google推薦算法
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# 避免混淆Annotation忆肾、內(nèi)部類、泛型菱肖、匿名類
-keepattributes *Annotation*,InnerClasses,Signature,EnclosingMethod
# 重命名拋出異常時的文件名稱
-renamesourcefileattribute SourceFile
# 拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTable
# 處理support包
-dontnote android.support.**
-dontwarn 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$* {*;}
# 保留四大組件客冈,自定義的Application等這些類不被混淆
-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.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

# 保留在Activity中的方法參數(shù)是view的方法,
# 這樣以來我們在layout中寫的onClick就不會被影響
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
# 對于帶有回調(diào)函數(shù)的onXXEvent稳强、**On*Listener的场仲,不能被混淆
-keepclassmembers class * {
    void *(**On*Event);
    void *(**On*Listener);
}
# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

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

# 保留Parcelable序列化類不被混淆
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

-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();
}
#assume no side effects:刪除android.util.Log輸出的日志
-assumenosideeffects class android.util.Log {
    public static *** v(...);
    public static *** d(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
}
#保留Keep注解的類名和方法
-keep,allowobfuscation @interface android.support.annotation.Keep
-keep @android.support.annotation.Keep class *
-keepclassmembers class * {
    @android.support.annotation.Keep *;
}
#3D 地圖 V5.0.0之前:

-dontwarn com.amap.api.**
-dontwarn com.autonavi.**
-keep class com.amap.api.**{*;}
-keep class com.autonavi.**{*;}

-keep   class com.amap.api.maps.**{*;}
-keep   class com.autonavi.amap.mapcore.*{*;}
-keep   class com.amap.api.trace.**{*;}

#3D 地圖 V5.0.0之后:
-keep   class com.amap.api.maps.**{*;}
-keep   class com.autonavi.**{*;}
-keep   class com.amap.api.trace.**{*;}

#定位
-keep class com.amap.api.location.**{*;}
-keep class com.amap.api.fence.**{*;}
-keep class com.autonavi.aps.amapapi.model.**{*;}

#搜索
-keep   class com.amap.api.services.**{*;}

#2D地圖
-keep class com.amap.api.maps2d.**{*;}
-keep class com.amap.api.mapcore2d.**{*;}

#導航
-keep class com.amap.api.navi.**{*;}
-keep class com.autonavi.**{*;}
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature

# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}

# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**

# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**

# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
-dontwarn org.codehaus.mojo.animal_sniffer.*

# OkHttp platform used only on JVM and when Conscrypt dependency is available.
-dontwarn okhttp3.internal.platform.ConscryptPlatform

#fastjson混淆
-keepattributes Signature
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.**{*;}
-keep class com.alibaba.fastjson.**{*; }
-keep public class com.ninstarscf.ld.model.entity.**{*;}

一些第三方

# okhttp
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

# Retrofit
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontnote retrofit2.Platform
-dontwarn retrofit2.Platform$Java8
-keepattributes Signature
-keepattributes Exceptions

# RxJava RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
    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;
}

# Gson
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod
# xxx代表model類的全包名路徑
-keep class xxx.** { *; }

# butterknie
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# eventbus
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市退疫,隨后出現(xiàn)的幾起案子渠缕,更是在濱河造成了極大的恐慌,老刑警劉巖褒繁,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亦鳞,死亡現(xiàn)場離奇詭異,居然都是意外死亡棒坏,警方通過查閱死者的電腦和手機燕差,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝冕,“玉大人徒探,你說我怎么就攤上這事∥箍撸” “怎么了测暗?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長磨澡。 經(jīng)常有香客問我偷溺,道長,這世上最難降的妖魔是什么钱贯? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮侦另,結(jié)果婚禮上秩命,老公的妹妹穿的比我還像新娘。我一直安慰自己褒傅,他們只是感情好弃锐,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殿托,像睡著了一般霹菊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天旋廷,我揣著相機與錄音鸠按,去河邊找鬼。 笑死饶碘,一個胖子當著我的面吹牛目尖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扎运,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瑟曲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了豪治?” 一聲冷哼從身側(cè)響起洞拨,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎负拟,沒想到半個月后嚎莉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玉吁,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驯耻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡思杯,死狀恐怖凑兰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遣蚀,我是刑警寧澤矾麻,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芭梯,受9級特大地震影響险耀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玖喘,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一甩牺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧累奈,春花似錦贬派、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戒努,卻和暖如春请敦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工侍筛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萤皂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓勾笆,卻偏偏與公主長得像敌蚜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窝爪,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355