目的
启用资源文件res混淆及压缩的好处:
- 增加破解难度,用无意义的字母替换掉资源文件目录及名称,如把res/drawable/wechat变为r/d/a。目前主流大厂的apk打开后,资源目录都是r文件夹,看不到真实的资源文件名,就是做了资源文件混淆。
- 减小打包后的apk体积。
原理
通过resource.arsc文件格式,混淆步骤为:
- 解析arsc文件,主要为全局与资源名字符串池
- 修改字符串池中的字符串,以无意义的a/b替换
- 修改apk中的res目录资源文件名
- 打包(7zip)、对齐、签名
可选方案
目前的实施方案有微信资源混淆打包工具AndResGuard和美团方案
美团方案需要自己实现函数,这里我们使用AndResGuard
AndResGuard使用
1.根目录build文件中,添加插件的依赖
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
}
2.在主module(默认为APP)目录下,创建res_guard.gradle配置文件,名称可自定义。这里官方使用文档上是直接写在build.gradle文件中,这样会使build文件内容过多且繁杂,故建议放在单独的gradle中间中。内容如下:
apply plugin: 'AndResGuard'
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
use7zip = true
useSign = true
// 打开这个开关,会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",
//个推
"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"
}
/**
* 可选: 如果不设置则会默认覆盖assemble输出的apk
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* 可选: 指定v1签名时生成jar文件的摘要算法
* 默认值为“SHA-1”
**/
// digestalg = "SHA-256"
}
3.在主module(APP)目录下的build.gradle中,添加使用
apply from: 'res_guard.gradle'
集成完之后,在Gradle中的主module→Tasks中会有andresguard的task,打开会有:
- resguardDebug
- resguardRelease
- resguardUseApk
双击执行resguardRelease,等待一段时间出现BUILD CUSSECCFUL后,在主module目录下的/build/output/apk/release/AndResGuard_{apk_name}/ 中,能得到混淆后的apk。
解压apk后,可以发现原来的资源文件res及里面的所有目录都被单个字母所替换,且apk体积也有所缩减。