apk资源混淆及压缩的使用

目的

启用资源文件res混淆及压缩的好处:

  1. 增加破解难度,用无意义的字母替换掉资源文件目录及名称,如把res/drawable/wechat变为r/d/a。目前主流大厂的apk打开后,资源目录都是r文件夹,看不到真实的资源文件名,就是做了资源文件混淆。
  2. 减小打包后的apk体积。

原理

通过resource.arsc文件格式,混淆步骤为:

  1. 解析arsc文件,主要为全局与资源名字符串池
  2. 修改字符串池中的字符串,以无意义的a/b替换
  3. 修改apk中的res目录资源文件名
  4. 打包(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体积也有所缩减。

你可能感兴趣的:(apk资源混淆及压缩的使用)