我的Android混淆(Proguard文件)是怎么寫(xiě)的

當(dāng)前環(huán)境

Android Studio: 3.2.1
Gradle 插件: 'com.android.tools.build:gradle:3.2.1'
Gradle : gradle-4.6

具體配置

因?yàn)閜roguard文件要靠手寫(xiě)岁钓,所以有時(shí)候感覺(jué)很難屡限,但是找到規(guī)律之后也挺簡(jiǎn)單的钧大,感覺(jué)難是因?yàn)榘⊙耄皇煜に囊恍╆P(guān)鍵字瘸恼,這里列出了常用的關(guān)鍵字,以及人能看懂的含義压固,其實(shí)要想看明白,自己寫(xiě)的Demo測(cè)試一下就好了靠闭,借助于反編譯工具看下到底什么被混淆了帐我,工具看這。我下面寫(xiě)了詳細(xì)的注釋github愧膀,常用的也就這么多了拦键,其余的可以根據(jù)命令行進(jìn)行調(diào)試,然后逐個(gè)添加檩淋。

#-ignorewarnings                     # 忽略警告芬为,避免打包時(shí)某些警告出現(xiàn)
-optimizationpasses 5               # 指定代碼的壓縮級(jí)別
-dontusemixedcaseclassnames         # 是否使用大小寫(xiě)混合 混淆時(shí)不會(huì)產(chǎn)生形形色色的類(lèi)名
-dontskipnonpubliclibraryclasses    # 是否混淆第三方j(luò)ar
-dontpreverify                      # 混淆時(shí)是否做預(yù)校驗(yàn)
-verbose                            # 混淆時(shí)是否記錄日志
-dontoptimize                       # 不優(yōu)化輸入的類(lèi)文件

## 這個(gè) SourceFile 可以字 Smali 文件里面 .source "xxxx" 保證原始類(lèi)名不被抹掉
-keepattributes *Annotation*, SourceFile, InnerClasses, LineNumberTable, Signature, EnclosingMethod
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*    #優(yōu)化 混淆時(shí)采用的算法

-keep public class * extends android.app.Activity    # 未指定成員萄金,僅僅保持類(lèi)名不被混淆
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.app.View
-keep public class * extends android.app.IntentService
-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.hardware.display.DisplayManager
-keep public class * extends android.os.UserManager
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.app.Fragment

-keep public class * extends android.support.v4.widget
#  *匹配任意字符不包括 “ . ” ,**匹配任意字符
#  下面這行的意思是媚朦,保留v4下面的類(lèi)名及其v4下面子包的類(lèi)名不被混淆
-keep public class * extends android.support.v4.**  
# 下面 這行表示一個(gè)接口中的所有的東西都不被混淆  
-keep interface android.support.v4.app.** { *; }    
# 下面這行表示保持這個(gè)包及其子包下面的所有類(lèi)的類(lèi)名及其類(lèi)里面的所有內(nèi)容都不混淆
-keep class android.support.v4.** { *; }        
-keep class android.os.**{*;}
-keep class android.support.v8.renderscript.** { *; }

-keep class **.R$* { *; }
-keep class **.R{ *; }

#實(shí)現(xiàn)了android.os.Parcelable接口類(lèi)的任何類(lèi)氧敢,以及其內(nèi)部定義的Creator內(nèi)部類(lèi)類(lèi)型的public final靜態(tài)成員變量份氧,都不能被混淆和刪除
-keep class * implements android.os.Parcelable {    # 保持Parcelable不被混淆
  public static final android.os.Parcelable$Creator *;
}

#keepclasseswithmembernames  保留類(lèi)和類(lèi)中的成員恋拷,防止被混淆,保留指明的成員,成員沒(méi)有引用會(huì)被移除
# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {     
    native <methods>;
}

#keepclasseswithmembers 保留類(lèi)和類(lèi)中的成員,防止被混淆或移除逞带,保留指明的成員(和上面的區(qū)別是空入,這里會(huì)防止被移除)
#  保持自定義控件類(lèi)名和構(gòu)造方法不被混淆或移除
-keepclasseswithmembers class * {        
    public <init>(android.content.Context, android.util.AttributeSet);
}

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

-keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet, int, int);
}

-keepclassmembers class * extends android.app.Activity { #保持類(lèi)成員
   public void *(android.view.View);
}

-keepclassmembers class * extends android.content.Context {
  public void *(android.view.View);
  public void *(android.view.MenuItem);
}

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

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepnames class * implements java.io.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();
}

#####################上面這些是系統(tǒng)默認(rèn)配置的#####################3
## 一般來(lái)說(shuō)上面的這些即使我們不寫(xiě),開(kāi)了混淆也會(huì)自動(dòng)啟用
## 現(xiàn)在我用的 Android Studio Gradle的插件是 3.2.1 這個(gè)插件自帶默認(rèn)混淆文件
## 在啟用混淆的時(shí)候解壓出來(lái)盟步,詳情參考 /項(xiàng)目名/build/intermediates/proguard-files/proguard-android.txt-3.2.1 里面的注釋
## 注釋上說(shuō)gradle 的 Android 插件媳拴,從2.2 版本開(kāi)始,不再使用sdk本地的Proguard,而以后gradle插件自帶默認(rèn)Proguard配置文件


#-libraryjars   libs/jar包名字.jar   #缺省proguard 會(huì)檢查每一個(gè)引用是否正確,但是第三方庫(kù)里面往往有些不會(huì)用到的類(lèi)仪搔,沒(méi)有正確引用。如果不配置的話煮嫌,系統(tǒng)就會(huì)報(bào)錯(cuò)梯码。
-dontwarn android.support.v4.**
-dontwarn android.os.**

#編譯時(shí)關(guān)掉Log的打印,
#-assumenosideeffects class android.util.Log {    #如果是自定義Log類(lèi),修改下面的包名
#        public static *** d(...);
#        public static *** e(...);
#        public static *** i(...);
#        public static *** v(...);
#        public static *** println(...);
#        public static *** w(...);
#        public static *** wtf(...);
#}

# 實(shí)體類(lèi)不混淆(自己項(xiàng)目實(shí)體類(lèi)不被混淆秉版,因?yàn)镚son中用到了反射)
#-keep class me.febsky.entity.** { *; }
### -----這是個(gè)列子---- ###
#這個(gè)類(lèi)里面的所有的成員變量和方法都不混淆
-keep class me.febsky.testprogard.MainActivity { *; }
#這個(gè)類(lèi)里面的內(nèi)部類(lèi)的所有的成員變量和方法都不混淆
-keep class me.febsky.testprogard.MainActivity$* { *; }
#這個(gè)類(lèi)里面的所有public的內(nèi)部類(lèi)的所有的成員變量和方法都不混淆
-keep public class me.febsky.testprogard.MainActivity$* { *; }
#這個(gè)類(lèi)里面的內(nèi)部類(lèi)的類(lèi)名不備混淆秸妥,方法和變量還是混淆的
-keep class me.febsky.testprogard.MainActivity$*
#保持一個(gè)類(lèi)的類(lèi)名不被混淆,里面的方法和成員變量名還是被混淆的
-keep public class me.febsky.testprogard.MyOutClass
### -----這是個(gè)列子---- ###

## for sharedSDK
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侨核,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逼庞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掌逛,警方通過(guò)查閱死者的電腦和手機(jī)豆混,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)拆讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爽室,“玉大人啸箫,你說(shuō)我怎么就攤上這事扎唾『疲” “怎么了庵楷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵差凹,是天一觀的道長(zhǎng)谊娇。 經(jīng)常有香客問(wèn)我顾腊,道長(zhǎng)吗垮,這世上最難降的妖魔是什么锨络? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任虏冻,我火速辦了婚禮领铐,結(jié)果婚禮上幻碱,老公的妹妹穿的比我還像新娘恍风。我一直安慰自己锦募,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布盏缤。 她就那樣靜靜地躺著竞惋,像睡著了一般浑厚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼官硝。 笑死卿操,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吱瘩,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叛薯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轩触,失蹤者是張志新(化名)和其女友劉穎脱柱,沒(méi)想到半個(gè)月后随闺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矩乐,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欧漱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖随珠,靈堂內(nèi)的尸體忽然破棺而出灭袁,到底是詐尸還是另有隱情,我是刑警寧澤窗看,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布茸歧,位于F島的核電站,受9級(jí)特大地震影響显沈,放射性物質(zhì)發(fā)生泄漏举娩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一构罗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧智玻,春花似錦遂唧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纹烹。三九已至,卻和暖如春召边,著一層夾襖步出監(jiān)牢的瞬間铺呵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工隧熙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留片挂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓贞盯,卻偏偏與公主長(zhǎng)得像音念,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躏敢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,848評(píng)論 25 707
  • 混淆(Proguard)用法 最近項(xiàng)目中遇到一些混淆相關(guān)的問(wèn)題闷愤,由于之前對(duì)proguard了解不多,所以每次都是面...
    于曉飛93閱讀 56,716評(píng)論 38 230
  • Android插件化基礎(chǔ)的主要內(nèi)容包括 Android插件化基礎(chǔ)1-----加載SD上APKAndroid插件化基...
    隔壁老李頭閱讀 7,090評(píng)論 13 48
  • 當(dāng)前是有些工具比如apktool件余,dextojar等是可以對(duì)我們android安裝包進(jìn)行反編譯讥脐,獲得源碼的。為了減...
    碼農(nóng)明明桑閱讀 29,589評(píng)論 2 38
  • 轟轟烈烈的保險(xiǎn)培訓(xùn)啼器,參加81人旬渠,退訓(xùn)3人,剩余78人镀首。有60多歲的老人坟漱,有18.19的青年。有自稱(chēng)研究生當(dāng)班長(zhǎng)的人...
    夢(mèng)海蓉閱讀 172評(píng)論 0 0