Android Gradle使用详解(八) 之 使用AndResGuard混淆Apk包资源

1 简介

AndResGuard是微信提供的Android资源混淆打包工具。它通过修改resources.arsc文件,从而可以混淆Apk包的资源文件路径(比如将res/drawable/welcome.png混淆为r/s/a.png),达到减少Apk包体积的目的,而且还提升了反编译的难度。其源项目地址:https://github.com/shwenzhang/AndResGuard/,其原理介绍可见:WeMobileDev公众号文章。另外,AndResGuard已发布到jcenter,所以通过Gradle集成变得非常简单。

2 AndResGuard的配置

对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 {
    ……
}
……

3 执行任务

通过上述三步就完成了Gradld的配置,非常简单。如果你使用Android Studio的话,在同步后,gradle的task任务列表里就会出现andresguard任务,如:

Android Gradle使用详解(八) 之 使用AndResGuard混淆Apk包资源_第1张图片

双击执行resguardDebug或resguardRelease指令,执行完毕后就会生成混淆过资源路径的Apk包。如执行resguardDebug后我们可以在Project目录下的/build/output/apk/debug/AndResGuard_XXX / 文件夹中找到混淆后的Apk包文件:

Android Gradle使用详解(八) 之 使用AndResGuard混淆Apk包资源_第2张图片

选择其中一个Apk包文件通过解压查看便能看出其资源路径已经被混淆成功了,如下图:

Android Gradle使用详解(八) 之 使用AndResGuard混淆Apk包资源_第3张图片

 

 

 

你可能感兴趣的:(Android进阶与总结,Android,Gradle)