proguard 踩坑之路

背景:

最近項(xiàng)目中引入了一個(gè)三方的庫,然后在打包的時(shí)候發(fā)現(xiàn)一些build的一些task沒有執(zhí)行。原先release版本過濾的d ,v日志也在控制臺(tái)那邊出現(xiàn)了,然后就去尋找是不是某個(gè)配置導(dǎo)致了一些proguard的task沒有執(zhí)行。

介紹:

proguard提供了一種比較先進(jìn)的安全組件來保證android APK和SDK被靜態(tài)代碼分析,所以其最主要的功能就是對(duì)我們的代碼進(jìn)行混淆,不讓一些黑客可以通過一些靜態(tài)代碼的分析來攻擊我們的應(yīng)用。但是其實(shí)proguard還提供了一些其他的功能,那我們先來看下到底做了哪些事情。

功能和流程:

功能:shrinker(壓縮),optimizer(優(yōu)化),obfuscator(混淆),preverifier(預(yù)校驗(yàn))

shrink: 檢測(cè)并移除沒有用到的類,變量,方法和屬性;

optimize: 優(yōu)化代碼,非入口節(jié)點(diǎn)類會(huì)加上private/static/final,沒有用到的參數(shù)會(huì)被刪除,一些方法可能會(huì)變成內(nèi)聯(lián)代碼。

obfuscate: 使用短又沒有語義的名字重命名非入口類的類名,變量名,方法名。入口類的名字保持不變。

preverify: 預(yù)校驗(yàn)代碼是否符合Java1.6或者更高的規(guī)范(唯一一個(gè)與入口類不相關(guān)的步驟)

流程:

shrink-->optimize-->obfuscate-->preverify

項(xiàng)目配置:

android studio會(huì)在build.gradle下配置如下信息:

buildTypes {

release {

minifyEnabled true

proguard FilesgetDefaultProguardFile('proguard-android-optimize.txt') proguard-rules.pro

}

}

其中proguard-android.txt這個(gè)文件是 android sdk提供的一個(gè)默認(rèn)的produard的默認(rèn)配置項(xiàng)存放在{ANDROID_SDK_ROOT}/tools/proguard/ 但是我們對(duì)于發(fā)布的release版本應(yīng)使用proguard-android-optimize.txt,此文件主要配置的是一些默認(rèn)的proguard配置,而和‘proguard-android’的最大區(qū)別在與‘proguard-android-optimize.txt’中開啟了Proguard optimize的選項(xiàng)(optimize是Proguard的一項(xiàng)功能)

問題原因:

由于proguard-android配置如下導(dǎo)致主功能optimize,preverify沒執(zhí)行

-dontoptimize

-dontpreverify

注意點(diǎn):

1.三方庫已經(jīng)混淆的庫,需要在主項(xiàng)目添加keep不再進(jìn)行二次混淆

2.反射獲取對(duì)象和方法要保證不被混淆。

3.反射三方庫的混淆方法和對(duì)象存在風(fēng)險(xiǎn)不建議這么使用

4.aar和添加獨(dú)立module的時(shí)候檢查是否添加了不必要的混淆

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

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

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