目的
啟用資源文件res混淆及壓縮的好處:
- 增加破解難度紫皇,用無意義的字母替換掉資源文件目錄及名稱,如把res/drawable/wechat變?yōu)閞/d/a殉簸。目前主流大廠的apk打開后蝶怔,資源目錄都是r文件夾,看不到真實(shí)的資源文件名私痹,就是做了資源文件混淆。
- 減小打包后的apk體積统刮。
原理
通過resource.arsc文件格式喷市,混淆步驟為:
- 解析arsc文件怖亭,主要為全局與資源名字符串池
- 修改字符串池中的字符串成洗,以無意義的a/b替換
- 修改apk中的res目錄資源文件名
- 打包(7zip)印机、對齊、簽名
可選方案
目前的實(shí)施方案有微信資源混淆打包工具AndResGuard和美團(tuán)方案
美團(tuán)方案需要自己實(shí)現(xiàn)函數(shù)鞭衩,這里我們使用AndResGuard
AndResGuard使用
1.根目錄build文件中学搜,添加插件的依賴
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
}
2.在主module(默認(rèn)為APP)目錄下,創(chuàng)建res_guard.gradle配置文件醋旦,名稱可自定義恒水。這里官方使用文檔上是直接寫在build.gradle文件中,這樣會(huì)使build文件內(nèi)容過多且繁雜饲齐,故建議放在單獨(dú)的gradle中間中。內(nèi)容如下:
apply plugin: 'AndResGuard'
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
use7zip = true
useSign = true
// 打開這個(gè)開關(guān)咧最,會(huì)keep住所有資源的原始路徑捂人,只混淆資源的名字
keepRoot = false
whiteList = [
// for your icon
"R.drawable.icon",
// for fabric
"R.string.com.crashlytics.*",
// for google-services
"R.string.google_app_id",
"R.string.gcm_defaultSenderId",
"R.string.default_web_client_id",
"R.string.ga_trackingId",
"R.string.firebase_database_url",
"R.string.google_api_key",
"R.string.google_crash_reporting_api_key",
//友盟
"R.anim.umeng*",
"R.string.umeng*",
"R.string.UM*",
"R.string.tb_*",
"R.layout.umeng*",
"R.layout.socialize_*",
"R.layout.*messager*",
"R.layout.tb_*",
"R.color.umeng*",
"R.color.tb_*",
"R.style.*UM*",
"R.style.umeng*",
"R.drawable.umeng*",
"R.drawable.tb_*",
"R.drawable.sina*",
"R.drawable.qq_*",
"R.drawable.tb_*",
"R.id.umeng*",
"R.id.*messager*",
"R.id.progress_bar_parent",
"R.id.socialize_*",
"R.id.webView",
//個(gè)推
"R.drawable.push",
"R.drawable.push_small",
"R.layout.getui_notification",
//極光推送
"R.drawable.jpush_notification_icon"
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.17'
//path = "/usr/local/bin/7za"
}
/**
* 可選: 如果不設(shè)置則會(huì)默認(rèn)覆蓋assemble輸出的apk
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* 可選: 指定v1簽名時(shí)生成jar文件的摘要算法
* 默認(rèn)值為“SHA-1”
**/
// digestalg = "SHA-256"
}
3.在主module(APP)目錄下的build.gradle中御雕,添加使用
apply from: 'res_guard.gradle'
集成完之后,在Gradle中的主module→Tasks中會(huì)有andresguard的task滥搭,打開會(huì)有:
- resguardDebug
- resguardRelease
- resguardUseApk
雙擊執(zhí)行resguardRelease酸纲,等待一段時(shí)間出現(xiàn)BUILD CUSSECCFUL后,在主module目錄下的/build/output/apk/release/AndResGuard_{apk_name}/ 中瑟匆,能得到混淆后的apk闽坡。
解壓apk后,可以發(fā)現(xiàn)原來的資源文件res及里面的所有目錄都被單個(gè)字母所替換愁溜,且apk體積也有所縮減疾嗅。