AndroidI每日小技巧I如何更好地維護(hù)代碼混淆規(guī)則文件(Proguard)?

封面圖

要啟用代碼混淆,在build.gradle文件中的最簡配置可能是這樣的:

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

其中,「proguardFiles」屬性用于配置「混淆規(guī)則文件」,而作為默認(rèn)文件之一的「proguard-rules.pro」 ,則是在我們創(chuàng)建新模塊時(shí)自動(dòng)添加的,通常不包含任何規(guī)則,需要我們自己添加。

我們?nèi)粘L砑雍途S護(hù)混淆規(guī)則,通常也都是直接在 proguard-rules.pro 文件上進(jìn)行的。

這樣做的弊端就是:

  • 隨著引入模塊的增加,日漸膨脹的 proguard-rules.pro 文件難以維護(hù)
  • 各種規(guī)則胡填海塞,當(dāng)出現(xiàn)因代碼混淆導(dǎo)致的問題時(shí),難以定位到具體的混淆規(guī)則并修復(fù)

解決這個(gè)問題的關(guān)鍵就是 proguardFiles 屬性,該屬性允許我們添加多個(gè)混淆規(guī)則文件,以此添加額外的混淆規(guī)則。

我們可以遵循單一職責(zé)原則,按照混淆規(guī)則大體上的分類,將混淆規(guī)則文件拆分為以下三個(gè):

  • 通用混淆規(guī)則文件(proguard-common.pro)
#-----------通用基本配置的混淆規(guī)則---------------

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

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

# 保留了繼承自Activity、Application、Fragment這些類的子類
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service

以下省略...
  • 項(xiàng)目自身混淆規(guī)則文件(proguard-rules.pro)
#-----------針對(duì)本項(xiàng)目的混淆規(guī)則--------------

# 保留指定包以及所含子包下的類名和類成員(變量和方法)不被混淆
-keep class com.xxx.database.constants.**{*;}
-keep class com.xxx.database.beanextra.**{*;}
-keep class com.arthenica.mobileffmpeg.**{*;}

# 保留指定類名和類成員(變量和方法)不被混淆
-keep class com.xxx.comp.dynamic.manager.AVUManager{*;}
-keep interface com.xxx.remote.util.MessageEntityConverter{*;}

以下省略...
  • 第三方SDK規(guī)則文件(proguard-third.pro)
#-----------第三方類庫的混淆規(guī)則--------------

# OkHttp
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keep class com.bumptech.**{*;}

以下省略...

隨后在 proguardFiles 屬性 中追加配置其余2個(gè)混淆規(guī)則文件即可:

    buildTypes {
        release {
            minifyEnabled tue
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro', 'proguard-common.pro', 'proguard-third.pro'
        }
    }

通用混淆規(guī)則基本不變,第三方SDK混淆規(guī)則只需要在引入新的類庫時(shí)添加,我們平時(shí)主要維護(hù)項(xiàng)目自身混淆規(guī)則文件就可以了。

而當(dāng)出現(xiàn)因代碼混淆導(dǎo)致的問題時(shí),我們就可以直接排查項(xiàng)目項(xiàng)目自身混淆規(guī)則文件,快速定位到具體的混淆規(guī)則并修復(fù)了。


Hi,我是椎鋒陷陳,現(xiàn)已更名為「IM開發(fā)者」,誠如我的簡介所言:

基于移動(dòng)端,匯集「即時(shí)通訊」、「WebRTC」、「移動(dòng)開發(fā)」等內(nèi)容,致力于打造一個(gè)服務(wù)于即時(shí)通訊技術(shù)愛好者的技術(shù)分享平臺(tái)。

以后會(huì)致力于推送這三方面的內(nèi)容,感謝斷更數(shù)月到現(xiàn)在依舊關(guān)注的小伙伴的陪伴。

本次內(nèi)容是我的一個(gè)新的嘗試,由于構(gòu)建一篇系統(tǒng)的干貨文章需要的寫作周期很長,而現(xiàn)在基本每天只有碎片化的業(yè)余時(shí)間,但又想保持每天的一個(gè)寫作輸出,因此采用了類似「每日小技巧」這種形式,希望能幫助你快速實(shí)踐到日常開發(fā)中,提高開發(fā)效率。

當(dāng)然,系統(tǒng)的干貨文章也不會(huì)落下,會(huì)積極根據(jù)日常推送的反饋,收集你們感興趣的內(nèi)容,集合成一片更系統(tǒng)完整的文章后輸出。

如果對(duì)你有幫助,請別忘記點(diǎn)贊和關(guān)注噢,謝謝~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容