使用AndResGuard混淆资源文件

AndResGuard

AndResGuard是一个减少你的apk大小的工具,它的工作方式类似于ProGuardJava源代码,但只针对资源文件。它更改res/drawable/wechat为r/d/a,并将资源文件重命名wechat.png为a.png。最后,它用7zip重新打包apk,这可以明显减少包的大小。

项目配置

1.在app的gradle里面增加
apply plugin: 'AndResGuard'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.13'
    }
}

andResGuard {
    // mappingFile = file("./resource_mapping.txt")
    mappingFile = null
    use7zip = true
    useSign = true
    // it will keep the origin path of your resources when it's true
    keepRoot = false

    whiteList = [
        // 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",
             // umeng share for sina
            "R.drawable.sina*"
            // for umeng update
            "R.string.umeng*",
            "R.string.UM*",
            "R.string.tb_*",
            "R.string.rc_*",
            "R.layout.umeng*",
            "R.layout.tb_*",
            "R.layout.rc_*",
            "R.drawable.umeng*",
            "R.drawable.tb_*",
            "R.drawable.rc_*",
            "R.drawable.u1*",
            "R.drawable.u2*",
            "R.anim.umeng*",
            "R.color.umeng*",
            "R.color.tb_*",
            "R.color.rc_*",
            "R.style.*UM*",
            "R.style.umeng*",
            "R.style.rc_*",
            "R.id.umeng*",
            "R.id.rc_*"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
    ]
    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.2.13'
        //path = "/usr/local/bin/7za"
    }
2.build之后生成APK

使用AndResGuard混淆资源文件_第1张图片

(如果出现以下异常)

What went wrong:
Execution failed for task ':app:resguardRelease'.
> can't the get signConfig for release build

解决方法:

   buildTypes {
        release {
            minifyEnabled false
        //-->
             signingConfig signingConfigs.myConfig//增加签名
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

在根目录放入test.jks签名文件

 signingConfigs {
        myConfig {
            keyAlias 'test'
            keyPassword '123456'
            storeFile file('../test.jks')
            storePassword '123456'
        }
    }
3.查看混淆结果(输出的包在app\build\outputs\apk\AndResGuard_app-release这个路径下)

使用AndResGuard混淆资源文件_第2张图片

4.修改apk为zip文件解压之后就会看到r目录下面全部已经混淆成功

使用AndResGuard混淆资源文件_第3张图片

白名单

默认andResGuard会混淆所有资源文件,而白名单使用正则表达式指定了不被混淆的资源文件。
举例友盟、融云在sdk里面写死了资源名,但是被我们混淆之后找不到指定资源,则会报崩溃

String tickerText = context.getResources().getString(
context.getResources().getIdentifier("rc_notification_ticker_text", 
"string", context.getPackageName()));

解决办法是在gradle的白名单里加入配置,本文开始在项目配置1里面已经给出。

注意:不应该在Play上发布使用7zip重压缩。
参考 https://github.com/shwenzhang/AndResGuard/issues/233

你可能感兴趣的:(OpenSource)