AndResGuard是微信提供的Android资源混淆打包工具。它通过修改resources.arsc文件,从而可以混淆Apk包的资源文件路径(比如将res/drawable/welcome.png混淆为r/s/a.png),达到减少Apk包体积的目的,而且还提升了反编译的难度。其源项目地址:https://github.com/shwenzhang/AndResGuard/,其原理介绍可见:WeMobileDev公众号文章。另外,AndResGuard已发布到jcenter,所以通过Gradle集成变得非常简单。
对Root Project的build.gradle(工程的根目录下的build.gradle)添加AndResGuard的依赖,代码如下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.15'
}
}
……
在Child Project下添加一个应用脚本插件and_res_guard.gradle,插件内的字段解释请见注释,白名单这里列得比较多,大家可以根据自己项目中需要添加,代码如下:
apply plugin: 'AndResGuard'
andResGuard {
// keep住不混淆的资源原有的物理路径 mappingFile = file("./resource_mapping.txt")
mappingFile = null
// 使用7zip压缩
use7zip = true
// 支持签名
useSign = true
// 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
keepRoot = false
// keep住不混淆的白名单,只作用于文件名,不会对路径有影响,支持通配符:? * +
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",
// for 友盟
"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",
// for 个推
"R.drawable.push",
"R.drawable.push_small",
"R.layout.getui_notification",
// for 极光推送
"R.drawable.jpush_notification_icon",
// for GrowingIO
"R.string.growingio_project_id",
"R.string.growingio_url_scheme",
"R.string.growingio_channel",
// for Firebase
"R.string.project_id",
// for Huawei push
"R.string.hms_update_title"
]
// 打包时是否压缩这类文件,支持通配符:? * +
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resource.asrc"
]
// 压缩来源,artifact 和 path支持同时设置,以path的值为优先.
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.15'
//path = "/usr/local/bin/7za"
}
// 可选: 如果不设置则会默认覆盖assemble输出的apk
// finalApkBackupPath = "${project.rootDir}/final.apk"
// 可选: 指定v1签名时生成jar文件的摘要算法 默认值为“SHA-1”
// digestalg = "SHA-256"
}
在Child Project中的build.gradle中加载上述脚本插件,代码如下:
apply plugin: 'com.android.application'
apply from: 'and_res_guard.gradle'
android {
……
}
……
通过上述三步就完成了Gradld的配置,非常简单。如果你使用Android Studio的话,在同步后,gradle的task任务列表里就会出现andresguard任务,如:
双击执行resguardDebug或resguardRelease指令,执行完毕后就会生成混淆过资源路径的Apk包。如执行resguardDebug后我们可以在Project目录下的/build/output/apk/debug/AndResGuard_XXX / 文件夹中找到混淆后的Apk包文件:
选择其中一个Apk包文件通过解压查看便能看出其资源路径已经被混淆成功了,如下图: