
要啟用代碼混淆,在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)注噢,謝謝~