前面講了資源混淆的原理典蝌,現(xiàn)在我們來講講具體如何實(shí)踐曙砂。實(shí)際項(xiàng)目中,我采用了微信的 AndResGuard 方案骏掀,github 地址為:https://github.com/shwenzhang/AndResGuard鸠澈。
簡單說下如何使用,更詳細(xì)可以看官網(wǎng)說明:
在工程根目錄 build.gralde 中增加插件地址:
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.16'
}
}
在 app/build.gradle 中使用插件:
apply plugin: 'AndResGuard'
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
use7zip = false
useSign = true
// It will keep the origin path of your resources when it's true
keepRoot = false
// It will merge the duplicated resources, but don't rely on this feature too much.
// it's always better to remove duplicated resource from repo
mergeDuplicatedRes = false
whiteList = [
"R.anim.umeng*",
"R.string.umeng*",
......
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.16'
//path = "/usr/local/bin/7za"
}
/**
* Optional: if finalApkBackupPath is null, AndResGuard will overwrite final apk
* to the path which assemble[Task] write to
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* Optional: Specifies the name of the message digest algorithm to user when digesting the entries of JAR file
* Only works in V1signing, default value is "SHA-1"
**/
// digestalg = "SHA-256"
}
這里有幾個屬性配置需要注意:
- use7zip:是否使用 7zip 壓縮砖织,為了更好的兼容性款侵,一般我們不開啟末荐。其實(shí)經(jīng)過自己身邊部分手機(jī)測試侧纯,都是沒有問題的,但是我沒有大規(guī)模驗(yàn)證過甲脏,不敢確定其他的手機(jī)是否OK眶熬。在不了解的情況下,還是少使用為妙块请;
- mergeDuplicatedRes:開啟之后娜氏,會自動比對圖片資源的 md5 值,如果多個圖片資源的 md5 相同墩新,會自動去重贸弥;
- whiteList:白名單配置,我們有些代碼會使用 getIdentifier 方法海渊,直接通過資源的名字來獲取資源 id绵疲,通過該配置可以保持該資源不被混淆掉;
- useSign:資源混淆后臣疑,是否輸出簽名后的包盔憨;
一切配置好后,在 gradle 中會出現(xiàn)一個 andresguard 任務(wù)組讯沈,里面有 resguardDebug郁岩、resguardRelease 等打包任務(wù),執(zhí)行任務(wù)后,就可以在 app/build/outputs 目錄下找到資源混淆后的 apk 包了问慎。
經(jīng)過測試驗(yàn)證萍摊,使用 AndResGuard 進(jìn)行資源混淆后的包,比正常模式打出來的包如叼,少了大約 0.5M 的大小记餐。對有大量資源文件的應(yīng)用,使用資源混淆的壓縮效率應(yīng)該還是挺高的薇正。
小結(jié)
AndResGuard 插件的工作原理片酝,就是創(chuàng)建了一個資源混淆打包任務(wù),該任務(wù)會先調(diào)用默認(rèn)的打包任務(wù)挖腰,在默認(rèn)打包工作結(jié)束后雕沿,會解壓打好的 apk 包,識別解析包里的 resources.arsc 資源表猴仑,然后再混淆 res 文件夾下面的所有資源文件审轮,同時相對應(yīng)的修改資源表,最后將修改后的資源重新打包簽名辽俗,生成新的 apk 包疾渣。
資源混淆的核心,就是對 resources.arsc 資源表的解析修改崖飘,了解了 resources.arsc 文件的格式榴捡,我們再來使用微信的 AndResGuard 插件就很容易理解了。
系列文章
Android apk瘦身最佳實(shí)踐(一):去除R.class
Android apk瘦身最佳實(shí)踐(二):代碼混淆和資源壓縮
Android apk瘦身最佳實(shí)踐(三):資源混淆原理
Android apk瘦身最佳實(shí)踐(四):采用AndResGuard進(jìn)行資源混淆
Android apk瘦身最佳實(shí)踐(五):圖片壓縮
Android apk瘦身最佳實(shí)踐(六):采用D8編譯器