在 Android 中掌握 ProGuard

前言

在構(gòu)建 Android 應(yīng)用程序時,我們可能在項目中使用了 ProGuard称勋。在這篇文章中筷狼,我們將了解所有功能以及如何在 Android 中有效地使用 ProGuard。

因此,讓我們將其分解為以下幾點:

  • 什么是 ProGuard村刨?
  • 它對我們的應(yīng)用有什么幫助?
  • 如何在我們的項目中使用它撰茎?
  • 需要注意的重要事項嵌牺。

什么是 ProGuard?

ProGuard 是 Android 中的免費 java 工具乾吻,它可以幫助我們執(zhí)行以下操作髓梅,

  • 縮小(縮幸锴)代碼:刪除項目中未使用的代碼枯饿。
  • 混淆代碼:重命名類、字段等的名稱诡必。
  • 優(yōu)化代碼:做內(nèi)聯(lián)函數(shù)之類的事情奢方。

簡而言之,ProGuard 對我們的項目產(chǎn)生了以下影響爸舒,

  • 它減小了應(yīng)用程序的大小蟋字。
  • 它刪除了導(dǎo)致 Android 應(yīng)用程序的 64K 方法計數(shù)限制的未使用類和方法。
  • 它通過混淆代碼使應(yīng)用程序難以進(jìn)行逆向工程扭勉。

它對我們的應(yīng)用程序有什么用處鹊奖?

在 Android 中,proguard 對于制作可用于生產(chǎn)的應(yīng)用程序非常有用涂炎。它可以幫助我們減少代碼并使應(yīng)用程序更快忠聚。默認(rèn)情況下,Proguard 在 Android Studio 中是開箱即用的唱捣,它在很多方面都有幫助两蟀,下面提到的很少,

  • 它混淆了代碼震缭,這意味著它將名稱更改為一些較小的名稱赂毯,例如MainViewModel它可能會將名稱更改為A。在混淆應(yīng)用程序之后拣宰,您的應(yīng)用程序的逆向工程現(xiàn)在成為一項艱巨的任務(wù)党涕。
  • 它縮小了資源,即忽略了我們的類文件沒有調(diào)用的資源巡社,沒有在我們的android應(yīng)用程序中使用膛堤,比如drawables中的圖像等。這將大大減少應(yīng)用程序的大小重贺。您應(yīng)該始終縮小您的應(yīng)用程序以使其重量輕且速度快骑祟。

如何在我們的項目中使用它回懦?

要在您的項目中啟用 Proguard,請在應(yīng)用程序的 build.gradle 添加次企,

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }
}

在這里怯晕,我們minfyEnabled確實如此,它激活了從文件中獲取的proguard缸棵,

proguard-android.txt

它在發(fā)布塊下舟茶,這意味著它只會應(yīng)用于我們生成的構(gòu)建的發(fā)布。

但有時當(dāng) proguard 刪除太多代碼時它可能太多了堵第,它可能會破壞你的代碼流吧凉。

因此,配置代碼我們必須添加一些自定義規(guī)則踏志,以確保我們從混淆中刪除代碼集阀捅。我們可以通過在我們的 proguard 中編寫自定義規(guī)則來解決這個問題,它會在生成構(gòu)建時遵守针余。

現(xiàn)在饲鄙,讓我們看看如何在 proguard 中編寫自定義規(guī)則。

1. 保存類文件
假設(shè)我們有一個數(shù)據(jù)類圆雁,某些 API 需要它來執(zhí)行它忍级,但它會生成我們對類進(jìn)行混淆的構(gòu)建。例如伪朽,我們有一個用戶數(shù)據(jù)類轴咱,

data class User(val id: String = "")

我們不想混淆生成構(gòu)建的類,然后忽略它的混淆烈涮,我們使用@Keep注釋并更新代碼朴肺,例如,

@Keep
data class User(val id: String = "")

此注釋有助于在縮小時使用 proguard 來忽略該類跃脊。這將保留類及其成員函數(shù)宇挫,即使它們不被使用苛吱。

我們還可以使用酪术,

-keep

在生成構(gòu)建時保留類的選項。使用-keep而不是@Keep翠储,我們可以更好地控制要保留的內(nèi)容和不保留的內(nèi)容绘雁。

但是,我們也可以通過使用@SerializedName(當(dāng)使用 Gson 庫時)來保留數(shù)據(jù)模型類中id字段的鍵援所,例如庐舟,

data class User(@SerializedName("id")
                 val id: String = "")

如果你注意到這里,我們沒有使用@Keep住拭。

2. 為班級保留成員
假設(shè)我們想在收縮時只保留類成員而不是類挪略,然后我們使用历帚,

-keepclassmembers

在 proguard 規(guī)則文件中。這將幫助我們忽略特定類的成員杠娱。

考慮上面的 User 類挽牢,我們希望保留其中的所有公共方法。我們這樣寫規(guī)則摊求,

-keepclassmembers class com.mindorks.sample.User{
    public *;
}

在這里禽拔,類 User 保留所有具有公共修飾符的成員。

3. 保留班級和成員的名字
假設(shè)我們希望在代碼中使用類和類成員的所有相同名稱室叉,即如果未使用該類睹栖,它將被 proguard 縮小但不會混淆,因為它已經(jīng)被縮小了茧痕,所以沒有需要混淆野来。

要完成我們使用的上述任務(wù),

-keepnames

它的實際使用看起來像踪旷,

-keepnames class com.mindorks.sample.GlideModule

在這里梁只,如果 GlideModule 將保留其所有的類名稱和成員函數(shù)。

4.在Android中使用任何庫
在使用任何庫時埃脏,我們可能希望為 proguard 編寫一些自定義規(guī)則搪锣。庫可能會在 logcat 中引發(fā)警告,或者他們甚至可能沒有自己的 proguard 規(guī)則彩掐!

為了解決這個問題构舟,我們需要在應(yīng)用程序端添加自定義規(guī)則。例如堵幽,如果我們開始從任何庫中收到警告狗超,那么我們添加,

-dontwarn com.somelibrary.annotations.*

在我們的 proguard 規(guī)則中朴下,然后我們不會在日志中看到任何警告努咐。

要為庫編寫自定義規(guī)則,您可以像為自己的類編寫任何其他規(guī)則一樣編寫它殴胧。

5. 只混淆你的代碼
考慮一個非常罕見的用例渗稍,您只想混淆代碼而不壓縮任何資源。這是一個非常罕見的用例团滥,但可能對一些小型庫有用竿屹,然后我們編寫如下標(biāo)志,

-dontshrink
-dontoptimize

這將幫助我們不縮小和優(yōu)化代碼而只是混淆灸姊。

6. 維護(hù)注解
在構(gòu)建應(yīng)用程序時拱燃,ProGuard 會刪除所有注釋,它可能仍然適用于您項目中的某些代碼集力惯。但是假設(shè)我們需要不刪除注釋碗誉,那么我們可以選擇召嘶,

-keepattributes *Annotation*

在這里,它將所有注釋的屬性保留在您的應(yīng)用程序中哮缺。它默認(rèn)出現(xiàn)在我們的規(guī)則中苍蔬。

7.優(yōu)化
在 ProGuard 中編寫了這么多規(guī)則之后,我們可能需要為我們的應(yīng)用程序提供額外的優(yōu)化層蝴蜓。首先碟绑,我們更新build.gradle文件,例如茎匠,

android {
  buildTypes {
    release {
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
    }
  }
}

現(xiàn)在格仲,一般來說,我們不使用此選項诵冒,但這里的用例是我們必須執(zhí)行額外級別的優(yōu)化凯肋。

為了增加優(yōu)化的周期數(shù),例如我們想檢查優(yōu)化是否正確完成汽馋,如果沒有完成侮东,它將再次優(yōu)化它直到我們使用一定次數(shù),

-optimizationpasses 5

在這里豹芯,它將運行優(yōu)化多達(dá) 5 次以使其更加優(yōu)化悄雅。

現(xiàn)在,考慮一個示例铁蹈,與以前相比宽闲,我們希望更細(xì)粒度地優(yōu)化最終類,我們使用握牧,

-optimizations class/marking/final

在這里容诬,最終的類將被優(yōu)化最多 5 倍,或者如果優(yōu)化已經(jīng)完成沿腰,它甚至可能提前結(jié)束览徒。

現(xiàn)在,如果我們想優(yōu)化我們現(xiàn)在使用的私有字段颂龙,

-optimizations field/marking/private

大多數(shù)情況下习蓬,優(yōu)化是第一次完成。

如果我們根本不想優(yōu)化我們使用厘托,

-dontoptimize

這就是我們?nèi)绾我圆煌姆绞绞褂?proguard 使我們的應(yīng)用程序更安全和更輕便的工作方式友雳。

需要注意的重要事項:

  • 不要使用MainFragment.class.getSimpleName() 之類的東西作為片段標(biāo)簽稿湿。Proguard 可能會在混淆時為不同包中的兩個不同片段分配相同的名稱(A.class)铅匹。在這種情況下,兩個片段將具有相同的 TAG饺藤。這將導(dǎo)致您的應(yīng)用程序中的錯誤包斑。
  • 保留 Proguard 的映射文件以追溯到原始代碼流礁。您可能必須將其上傳到 PlayStore 控制臺等不同的地方才能查看崩潰的原始堆棧跟蹤。

作者:Himanshu Singh
鏈接:https://blog.mindorks.com/applying-proguard-in-an-android-application

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罗丰,一起剝皮案震驚了整個濱河市神帅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萌抵,老刑警劉巖找御,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绍填,居然都是意外死亡霎桅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門讨永,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滔驶,“玉大人揭糕,你說我怎么就攤上這事著角。” “怎么了雇寇?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長囚痴。 經(jīng)常有香客問我深滚,道長痴荐,這世上最難降的妖魔是什么生兆? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任根吁,我火速辦了婚禮,結(jié)果婚禮上沃斤,老公的妹妹穿的比我還像新娘轰枝。我一直安慰自己鞍陨,他們只是感情好诚撵,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布辛燥。 她就那樣靜靜地躺著挎塌,像睡著了一般待锈。 火紅的嫁衣襯著肌膚如雪竿音。 梳的紋絲不亂的頭發(fā)上春瞬,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音线罕,去河邊找鬼。 笑死袄琳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逗旁。 我是一名探鬼主播片效,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼膨桥,長吁一口氣:“原來是場噩夢啊……” “哼只嚣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起环础,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剩拢,沒想到半個月后线得,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徐伐,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年祸穷,在試婚紗的時候發(fā)現(xiàn)自己被綠了吗坚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡缎除,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霸褒,到底是詐尸還是另有隱情伴找,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布殊轴,位于F島的核電站衰倦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旁理。R本人自食惡果不足惜樊零,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一府怯、第九天 我趴在偏房一處隱蔽的房頂上張望诅炉。 院中可真熱鬧,春花似錦捍岳、人聲如沸芋哭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽减牺。三九已至豌习,卻和暖如春存谎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肥隆。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工既荚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栋艳。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓恰聘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘱巾。 傳聞我的和親對象是個殘疾皇子憨琳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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