AndResGuard 微信资源文件混淆

资源文件的混淆方案目前由美团和微信两种,前者是通过修改AAPT在处理资源文件相关的源码达到资源文件名的替换;后者是通过直接修改resources.arsc文件达到资源文件名的混淆。相比之下,微信的方案更优,而且微信已经将这个方案开源出来 AndResGuard

配置

  • Project build.gradle
buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
    }
}
  • Module build.gradle
apply plugin: 'AndResGuard'

andResGuard {
    // mappingFile = file("./resource_mapping.txt")
    mappingFile = null
    use7zip = true
    useSign = true
    // 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
    keepRoot = false
    // 设置这个值,会把arsc name列混淆成相同的名字,减少string常量池的大小
    fixedResName = "arg"
    // 打开这个开关会合并所有哈希值相同的资源,但请不要过度依赖这个功能去除去冗余资源
    mergeDuplicatedRes = true
    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"
    ]
    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"
}

注意:

  1. 若项目中使用到 Umeng sdk、google-services、getui(个推)、JPush(极光推送)、GrowingIO、Firebase(谷歌统计等)、Huawei push 需要将上述资源加入whiteList白名单,具体配置参考官网 white_list.md

  2. 配置7Zip
    在设置sevenzip时, 只需设置artifact或path. 支持同时设置,总以path的值为优先

  3. 对于发布于Google Play的APP,建议不要使用7Zip压缩,因为这个会导致Google Play的优化Patch算法失效 use7zip=false 设置为false

  4. 如果不是对APK size有极致的需求,不要把resources.arsc添加进compressFilePattern

打包

  • 如果是签名包还需要加上下面配置:
    signingConfig signingConfigs.release (release 引用的是signingConfigs中的)否则在打签名包时报错 can't the get signConfig for release build
android {
    signingConfigs {
        release {
            storeFile file('E:\\workspace\\AndroidStudio\\KEY\\dajiakey.jks')
            storePassword 'password'
            keyAlias = 'key0'
            keyPassword 'password'
        }
    }

    ......

    buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release //增加签名
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
  • SyncNow同步完成后,右侧Gradle会出现三条执行脚本,直接点击需要发布Modle下的resguardRelease(不要点击Project下的命令,因为可能有多个Modle)
    或者在Terminal中执行 gradlew resguardRelease 打包命令
1.png
  • 出现 BUILD SUCCESSFUL in 10s 说明打包成功,并会在 AndResGuard Done!后显示安装包地址,默认在build\outputs\apk\release\AndResGuard_test-release

    release_7zip_aligned_signed.apk :已签名 发布的包
    release_7zip_aligned_unsigned.apk :未签名
    release_7zip_unsigned.apk :未签名
    release_unsigned.apk :未签名

你可能感兴趣的:(AndResGuard 微信资源文件混淆)