Android 混淆

Proguard特性

1部凑、壓縮:Java源代碼通常被編譯為字節(jié)碼分歇,雖然字節(jié)碼比源代碼更簡潔善炫,但它本身仍然會(huì)包含很多無用的代碼例驹。Proguard的壓縮功能通過分析字節(jié)碼捐韩,能夠檢測并移除沒有使用的類,字段鹃锈,方法和屬性荤胁;

2、優(yōu)化:優(yōu)化Java字節(jié)碼屎债,同時(shí)移除沒有使用到的指令仅政;

3垢油、混淆:使用無意義的簡短字母組合對類名、字段名已旧、方法名進(jìn)行重命名;

4召娜、預(yù)檢驗(yàn):對上述處理后的代碼進(jìn)行預(yù)檢驗(yàn)运褪;

混淆配置

buildTypes {
        release {
            minifyEnabled true  //true表示使能Proguard
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

混淆文件的規(guī)則大致分為三類:

  • 公共的混淆規(guī)則:每個(gè)APP都通用的,主要是對Proguard的基本配置玖瘸,以及Android SDK中API設(shè)置的規(guī)則秸讹,例如Activity、Parcelable等雅倒;
  • App特有的混淆規(guī)則:根據(jù)APP自身的特點(diǎn)進(jìn)行設(shè)置璃诀,例如某些類會(huì)被反射調(diào)用,如果被混淆蔑匣,那么反射就找不到類了劣欢;
  • 第三方函數(shù)庫或者SDK的混淆規(guī)則:如果APP引入了第三方開源函數(shù)庫或者SDK,那么需要查看這些函數(shù)庫或者SDK的使用說明裁良,將需要去混淆的地方加上去凿将;

混淆文件編寫

#代碼迭代優(yōu)化的次數(shù),取值范圍0 - 7价脾,默認(rèn)5
-optimizationpasses 5
#混淆時(shí)不使用大小寫混合的方式牧抵,這樣混淆后都是小寫字母的組合
-dontusemixedcaseclassnames
#混淆時(shí)不做欲校驗(yàn),欲校驗(yàn)是Proguard四大功能之一侨把,在Android中一般不需要欲校驗(yàn)犀变,這樣可以加快混淆的速度
-dontpreverify
#混淆時(shí)記錄日志,同時(shí)會(huì)生成映射文件秋柄,Android Studio中获枝,生成的默認(rèn)映射文件是 'build/outputs/mapping/release/mapping.txt'
-verbose
#生成指定的映射文件的路徑和名稱
-printmapping build/outputs/mapping/release/mymapping.txt
#混淆時(shí)所采用的算法,參數(shù)是Google官方推薦的過濾器算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#如果項(xiàng)目中用到了注解骇笔,需要保留注解屬性
-keepattributes *Annotation*
#不混淆泛型
-keepattributes Signature
#保留代碼行號(hào)映琳,這在混淆后代碼運(yùn)行中拋出異常信息時(shí),有利于定位出問題的代碼
-keepattributes SourceFile,LineNumberTable
#保持Android SDK相關(guān)API類不被混淆
-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 com.android.vending.licensing.ILicensingService
#保留R類
-keep class **.R$*{
    *;
}
#保留native方法不被混淆
-keepclasseswithmembernames class * {
    native<methods>;
}
#保持自定義控件類不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context,android.util.AttributeSet);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context,android.util.AttributeSet,int);
}
#保持Activity中參數(shù)是View類型的參數(shù)蜘拉,保證在Layout XML文件配置的 onClick 屬性的值能夠正常調(diào)用到
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
#保持枚舉類不被混淆
-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 *;
}
#保持Serializable序列化類相關(guān)方法和字段不被混淆
-keepclassmembers class * implements java.io.Serializable{
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
#保持自定義控件不被混淆
-keep public class * extends android.view.View{
    public <init>(android.content.Context);
    public <init>(android.content.Context,android.util.AttributeSet);
    public <init>(android.content.COntext,android.util.AttributeSet,int);
    public void set*(...);
    *** get*();
}
#引入各個(gè)開源庫需要增加的混淆
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萨西,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子旭旭,更是在濱河造成了極大的恐慌谎脯,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件持寄,死亡現(xiàn)場離奇詭異源梭,居然都是意外死亡娱俺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門废麻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠卷,“玉大人,你說我怎么就攤上這事烛愧∮鸵耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵怜姿,是天一觀的道長慎冤。 經(jīng)常有香客問我,道長沧卢,這世上最難降的妖魔是什么蚁堤? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮但狭,結(jié)果婚禮上披诗,老公的妹妹穿的比我還像新娘。我一直安慰自己立磁,他們只是感情好藤巢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著息罗,像睡著了一般掂咒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迈喉,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天绍刮,我揣著相機(jī)與錄音,去河邊找鬼挨摸。 笑死孩革,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的得运。 我是一名探鬼主播膝蜈,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼熔掺,長吁一口氣:“原來是場噩夢啊……” “哼饱搏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起置逻,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤推沸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鬓催,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肺素,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宇驾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倍靡。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖课舍,靈堂內(nèi)的尸體忽然破棺而出塌西,到底是詐尸還是另有隱情,我是刑警寧澤布卡,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布雨让,位于F島的核電站雇盖,受9級(jí)特大地震影響忿等,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崔挖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一贸街、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狸相,春花似錦薛匪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘸右,卻和暖如春娇跟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背太颤。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工苞俘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龄章。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓吃谣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親做裙。 傳聞我的和親對象是個(gè)殘疾皇子岗憋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • 混淆是打包過程中最重要的流程之一,在沒有特殊原因的情況下锚贱,所有 app 都應(yīng)該開啟混淆澜驮。 首先,這里說的的混淆其實(shí)...
    瀟瀟code閱讀 1,529評論 0 5
  • 本文為原創(chuàng)惋鸥,轉(zhuǎn)載請注明出處:http://www.reibang.com/p/1b76e4c10495 說在前面的...
    SupLuo閱讀 10,245評論 0 62
  • 簡介 作為Android開發(fā)者杂穷,如果你不想開源你的應(yīng)用悍缠,那么在應(yīng)用發(fā)布前,就需要對代碼進(jìn)行混淆處理耐量,從而讓我們代碼...
    IM_RisingSun閱讀 2,402評論 12 141
  • 【1】全優(yōu)學(xué)生不一定是最聰明的飞蚓,只要有正確的方法、積極的心態(tài)廊蜒、不懈地堅(jiān)持趴拧,我們也可以成為讓人羨慕的好學(xué)生。 【2】...
    劉海燕丫閱讀 268評論 1 1