背景:
最近項(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í)候檢查是否添加了不必要的混淆