用ProGuard進行代碼混淆技術(shù)詳解

目前項目android客戶端需要代碼混淆型诚,抽空了解了下ProGuard的原理及使用威根,記錄下來以備后續(xù)使用徘六。

目錄

ProGuard簡介
ProGuard使用原理
studio下編寫ProGuard文件

ProGuard簡介

ProGuard是一個集壓縮(Shrink)锄贼、混淆(Obfuscate)外遇、優(yōu)化(Optimize)Java字節(jié)碼文件(.class)的免費工具注簿,可以刪除多余的類、方法跳仿、無效的注釋诡渴,最大限度的優(yōu)化字節(jié)碼文件。上線的app反編譯后出現(xiàn)的命名都是通過ProGuard生成的菲语,增加了反編譯的難度妄辩。
官網(wǎng)介紹:The ProGuard tool shrinks, optimizes, and obfuscates your code by removing unused code and renaming classes, fields, and methods with semantically obscure names. The result is a smaller sized .apkfile that is more difficult to reverse engineer。

ProGuard使用原理

通過前面的介紹山上,我們知道了ProGuard技術(shù)是由Shrink眼耀、Optimize、Obfuscate佩憾,還有一個preverify(預(yù)檢)四個功能點組成哮伟,每個功能點都是可以選擇的。那么ProGuard是如何工作的呢妄帘?在這里我們引入一個概念EntryPoint楞黄。EntryPoint可以理解為一種標(biāo)志,它是在ProGuard過程中不會被處理的類或者方法抡驼,在壓縮的過程,ProGuard會從上述的EntryPoint中開始遍搜索出哪些類和類的成員在使用(被標(biāo)記為EntryPoint的類和方法有些是在使用的而且這些是我們在混淆文件中配置不希望被混淆的類和方法鬼廓,有些是沒有使用的)。
對于那些沒有被使用的類和成員致盟,就會在壓縮階段被丟棄碎税。然后在接下來的優(yōu)化步驟中,那些非EntryPoint的類馏锡,方法都會被設(shè)置為private雷蹂,static或者final,而且不使用的參數(shù)都會被移除眷篇。接著在混淆的步驟中萎河,ProGuard會對非EntryPoint的類和方法進行重命名。最后就會對代碼進行預(yù)檢測,以便保證穩(wěn)定性虐杯。

studio下編寫ProGuard文件

studio下可以通過build.gradle進行Proguard的相關(guān)配置:
release {
minifyEnabled true // 是否進行代碼混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// proguard-androi.txt是android默認的混淆聲明玛歌,proguard-rules.pro為自定義的混淆申明
}
如下是在網(wǎng)上找到的一份模板,比較完善:

# 代碼混淆壓縮比擎椰,在0~7之間支子,默認為5,一般不做修改
-optimizationpasses 5

#  混合時不使用大小寫混合达舒,混合后的類名為小寫
-dontusemixedcaseclassnames

#  指定不去忽略非公共庫的類
-dontskipnonpubliclibraryclasses

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

#  指定不去忽略非公共庫的類成員
-dontskipnonpubliclibraryclassmembers

#  不做預(yù)校驗值朋,preverify是proguard的四個步驟之一,Android不需要preverify巩搏,去掉這一步能夠加快混淆速度昨登。
-dontpreverify

#  保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses

#  避免混淆泛型
-keepattributes Signature

#  拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTable

#  指定混淆是采用的算法,后面的參數(shù)是一個過濾器這個過濾器是谷歌推薦的算法贯底,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*


#############################################
#
#  Android開發(fā)中一些需要保留的公共部分
#
#############################################

#  保留我們使用的四大組件丰辣,自定義的Application等等這些類不被混淆
#  因為這些子類都有可能被外部調(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下的所有類及其內(nè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的方法,這樣以來我們在layout中寫的onClick就不會被影響
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}

#  保留枚舉類不被混淆
-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序列化類不被混淆
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

#######  保留Serializable序列化的類不被混淆
-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();
}

#  對于帶有回調(diào)函數(shù)的onXXEvent禽捆、**On*Listener的笙什,不能被混淆
-keepclassmembers class * {
    void *(**On*Event);
    void *(**On*Listener);
}

#  webView處理,項目中沒有使用到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);
}

#############################################
#
#  項目中特殊處理部分
#
#############################################

#-----------處理反射類---------------

# -----------處理js交互---------------

# -----------處理實體類---------------
-keep class x.x.*{*;}


# -----------處理第三方依賴庫---------
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胚想,一起剝皮案震驚了整個濱河市琐凭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浊服,老刑警劉巖统屈,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臼闻,居然都是意外死亡鸿吆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門述呐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕉毯,你說我怎么就攤上這事乓搬。” “怎么了代虾?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵进肯,是天一觀的道長。 經(jīng)常有香客問我棉磨,道長江掩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮环形,結(jié)果婚禮上策泣,老公的妹妹穿的比我還像新娘。我一直安慰自己抬吟,他們只是感情好萨咕,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著火本,像睡著了一般危队。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钙畔,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天茫陆,我揣著相機與錄音,去河邊找鬼擎析。 笑死盅弛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叔锐。 我是一名探鬼主播挪鹏,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼愉烙!你這毒婦竟也來了讨盒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤步责,失蹤者是張志新(化名)和其女友劉穎返顺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔓肯,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡遂鹊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔗包。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉扑。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖调限,靈堂內(nèi)的尸體忽然破棺而出舟陆,到底是詐尸還是另有隱情,我是刑警寧澤耻矮,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布秦躯,位于F島的核電站,受9級特大地震影響裆装,放射性物質(zhì)發(fā)生泄漏踱承。R本人自食惡果不足惜倡缠,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茎活。 院中可真熱鬧昙沦,春花似錦、人聲如沸妙色。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽身辨。三九已至丐谋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煌珊,已是汗流浹背号俐。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留定庵,地道東北人吏饿。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蔬浙,于是被迫代替她去往敵國和親猪落。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評論 25 707
  • Android插件化基礎(chǔ)的主要內(nèi)容包括 Android插件化基礎(chǔ)1-----加載SD上APKAndroid插件化基...
    隔壁老李頭閱讀 7,090評論 13 48
  • 混淆(Proguard)用法 最近項目中遇到一些混淆相關(guān)的問題畴博,由于之前對proguard了解不多笨忌,所以每次都是面...
    于曉飛93閱讀 56,713評論 38 230
  • 聲明 這篇文章更多的是做一個整理,內(nèi)容來自于ProGuard官方文檔以及各種博客等俱病,相關(guān)文章的鏈接在參考目錄里官疲,感...
    夷陵小祖閱讀 3,675評論 0 23
  • 這一年經(jīng)歷了很多事情,雖然有時覺得很痛苦亮隙,回頭細想其實很感謝生活無數(shù)次給予我的點醒途凫,點醒我別再活的那么擰巴...
    雨嫣然閱讀 183評論 0 0