Android 资源混淆 AndResGuard

资源混淆工具库简介

https://github.com/shwenzhang/AndResGuard

AndResGuard 是一个帮助你缩小 APK 大小的工具,他的原理类似 Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将 res/drawable/activity_advanced_setting_for_test 变为 r/d/a。

AndResGuard不涉及编译过程,只需输入一个 apk(无论签名与否,debug版,release版均可,在处理过程中会直接将原签名删除),可得到一个实现资源混淆后的 apk(若在配置文件中输入签名信息,可自动重签名并对齐,得到可直接发布的 apk)以及对应资源 ID 的 mapping 文件。

底层原理详见WeMobileDev公众号文章

点击查看更多细节和命令行使用方法

已知问题:当时在使用7zip压缩的APK时,调用AssetManager#list(String path)返回结果的首个元素为空字符串. #162

最佳实践

  • 如果不是对 APK size 有极致的需求,请不要把 resource.asrc 添加进 compressFilePattern. (#84  #233)
  • 对于发布于 Google Play 的 APP,建议不要使用 7Zip 压缩,因为这个会导致 Google Play 的优化 Patch 算法失效. (#233)

因为 andresGuard 只混淆资源,所以可以和阿里百川的 Hotfix 完美集成(2.0以前的hotfix只能热修复代码)。

使用

配置 build.gradlle

在 module(app) 中的 build.gradlle 中添加以下代码:

apply plugin: ‘com.android.application‘
apply plugin: ‘AndResGuard‘ //应用AndResGuard插件

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath ‘com.tencent.mm:AndResGuard-gradle-plugin:1.2.13‘ //添加AndResGuard依赖
    }
}

android {
    signingConfigs { //配置签名信息,注意,要放在buildTypes之前
        release {
            storeFile file("../keystore/bea.keystore") //签名文件位置,【.】代表当前目录,【..】代表父目录
            storePassword "beachinambk"
            keyAlias "bea.keystore"
            keyPassword "beachinambk"
            v2SigningEnabled true
        }

        debug {
            storeFile file("../keystore/debug.keystore")
        }
    }

    buildTypes {
        release { //配置构建选项
            minifyEnabled true
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
            shrinkResources true
            zipAlignEnabled true
            pseudoLocalesEnabled true
            signingConfig signingConfigs.release //签名文件
        }
    }
}

//-----------------------------配置 AndResGuard-----------------------------
andResGuard {
    mappingFile = null // = file("./resource_mapping.txt") //用于keep住资源的路径的mapping文件所在路径
    use7zip = true    //启用压缩。为true时,useSign必须为true
    useSign = true    // 启用签名。为true时,需要配置signConfig
    keepRoot = false // 为true时,会keep住所有资源的原始路径,只混淆资源的名字
    whiteList = [ //白名单,支持通配符,【+】代表1个或多个,【?】代表0个或1个,【*】代表0个或多个
        "R.mipmap.ic_launcher", "R.drawable.icon",// for your icon
        "R.string.com.crashlytics.*",// for fabric,详见https://docs.fabric.io/android/crashlytics/build-tools.html
        "R.string.google_app_id",// for google-services
        "R.id.*",//任意id
    ]
    compressFilePattern = [ //需要压缩的文件的匹配规则,一般这里不需要动。支持 ? + * 通配符
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
    sevenzip { //配置7Zip,只需设置 artifact 或 path;支持同时设置,但此时以 path 的值为优先
        artifact = ‘com.tencent.mm:SevenZip:1.2.13‘
        //path = "/usr/local/bin/7za"  //path指本地安装的7za(7zip命令行工具)
    }

    // finalApkBackupPath = "${project.rootDir}/final.apk" //可选,指定生成的apk的保存路径
    // digestalg = "SHA-256" //可选: 指定v1签名时生成jar文件的摘要算法,默认值为“SHA-1”
}

66

66

1

apply plugin: ‘com.android.application‘

2

apply plugin: ‘AndResGuard‘ //应用AndResGuard插件

3


4

buildscript {

5

    repositories {

6

        jcenter()

7

    }

8

    dependencies {

9

        classpath ‘com.tencent.mm:AndResGuard-gradle-plugin:1.2.13‘ //添加AndResGuard依赖

10

    }

11

}

12


13

android {

14

    signingConfigs { //配置签名信息,注意,要放在buildTypes之前

15

        release {

16

            storeFile file("../keystore/bea.keystore") //签名文件位置,【.】代表当前目录,【..】代表父目录

17

            storePassword "beachinambk"

18

            keyAlias "bea.keystore"

19

            keyPassword "beachinambk"

20

            v2SigningEnabled true

21

        }

22


23

        debug {

24

            storeFile file("../keystore/debug.keystore")

25

        }

26

    }

27


28

    buildTypes {

29

        release { //配置构建选项

30

            minifyEnabled true

31

            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘

32

            shrinkResources true

33

            zipAlignEnabled true

34

            pseudoLocalesEnabled true

35

            signingConfig signingConfigs.release //签名文件

36

        }

37

    }

38

}

39


40

//-----------------------------配置 AndResGuard-----------------------------

41

andResGuard {

42

    mappingFile = null // = file("./resource_mapping.txt") //用于keep住资源的路径的mapping文件所在路径

43

    use7zip = true    //启用压缩。为true时,useSign必须为true

44

    useSign = true    // 启用签名。为true时,需要配置signConfig

45

    keepRoot = false // 为true时,会keep住所有资源的原始路径,只混淆资源的名字

46

    whiteList = [ //白名单,支持通配符,【+】代表1个或多个,【?】代表0个或1个,【*】代表0个或多个

47

        "R.mipmap.ic_launcher", "R.drawable.icon",// for your icon

48

        "R.string.com.crashlytics.*",// for fabric,详见https://docs.fabric.io/android/crashlytics/build-tools.html

49

        "R.string.google_app_id",// for google-services

50

        "R.id.*",//任意id

51

    ]

52

    compressFilePattern = [ //需要压缩的文件的匹配规则,一般这里不需要动。支持 ? + * 通配符

53

        "*.png",

54

        "*.jpg",

55

        "*.jpeg",

56

        "*.gif",

57

        "resources.arsc"

58

    ]

59

    sevenzip { //配置7Zip,只需设置 artifact 或 path;支持同时设置,但此时以 path 的值为优先

60

        artifact = ‘com.tencent.mm:SevenZip:1.2.13‘ 

61

        //path = "/usr/local/bin/7za"  //path指本地安装的7za(7zip命令行工具)

62

    }

63


64

    // finalApkBackupPath = "${project.rootDir}/final.apk" //可选,指定生成的apk的保存路径

65

    // digestalg = "SHA-256" //可选: 指定v1签名时生成jar文件的摘要算法,默认值为“SHA-1”

66

}

配置 whiteList 与 mappingFile

默认 andResGuard 会混淆所有资源文件,而白名单则允许我们指定不被混淆的资源文件。

例如友盟、融云在 sdk 里面写死了资源名,所以如果被我们混淆之后就找不到指定资源,则运行时就会崩溃。

另外,所有使用 getIdentifier 访问的资源也都需要加入白名单。

getResources().getIdentifier(“com.test.demo:drawable/icon”,null,null);//包名 : 资源文件夹名 / 资源名
getResources().getIdentifier(“icon”, “drawable”, “com.test.demo”);//ID名,资源属性,包名

2

2

1

getResources().getIdentifier(“com.test.demo:drawable/icon”,null,null);//包名 : 资源文件夹名 / 资源名

2

getResources().getIdentifier(“icon”, “drawable”, “com.test.demo”);//ID名,资源属性,包名

可以在 white_list.md 查看更多第三方 sdk 的白名单配置。

白名单机制只作用于资源的 specsName,不会 keep 住资源的路径。如果想 keep 住资源的路径,可以使用 mappingFile。

例如我想 keep 住所有 folder 中的 icon,可以在 mappingFile 指向的文件添加:

res path mapping:
    res/mipmap-hdpi-v4 -> res/mipmap-hdpi-v4
    res/mipmap-mdpi-v4 -> res/mipmap-mdpi-v4
    res/mipmap-xhdpi-v4 -> res/mipmap-xhdpi-v4
    res/mipmap-xxhdpi-v4 -> res/mipmap-xxhdpi-v4
    res/mipmap-xxxhdpi-v4 -> res/mipmap-xxxhdpi-v4

6

6

1

res path mapping:

2

    res/mipmap-hdpi-v4 -> res/mipmap-hdpi-v4

3

    res/mipmap-mdpi-v4 -> res/mipmap-mdpi-v4

4

    res/mipmap-xhdpi-v4 -> res/mipmap-xhdpi-v4

5

    res/mipmap-xxhdpi-v4 -> res/mipmap-xxhdpi-v4

6

    res/mipmap-xxxhdpi-v4 -> res/mipmap-xxxhdpi-v4

启动任务

使用 Android Studio 的同学可以在 andresguard 下找到相关的构建任务,命令行可直接运行./gradlew resguard[BuildType | Flavor],如:

gradlew.bat resguardRelsese    //Windows
./gradlew reguardRelease    //OS X or Linux

2

2

1

gradlew.bat resguardRelsese    //Windows

2

./gradlew reguardRelease    //OS X or Linux

这里的任务命令规则和 build 中的 assemble 一致。

双击或右键 Run... 下图中的选中任务,构建以及混淆就会开始:

完成后会提示你混淆后的 apk 生成目录:

Backup Final APk(V2) to ***\Test\app\build\outputs\apk\release\app-release.apk
<--AndResGuard Done! You can find the output in ***\Test\app\build\outputs\apk\release\AndResGuard_app-release

2

2

1

Backup Final APk(V2) to ***\Test\app\build\outputs\apk\release\app-release.apk

2

<--AndResGuard Done! You can find the output in ***\Test\app\build\outputs\apk\release\AndResGuard_app-release

如果不设置 finalApkBackupPath 则会如上面一样默认覆盖 assemble 输出的apk,如果配置则输出至 finalApkBackupPath 配置的路径。

例如配置为【finalApkBackupPath = "${project.rootDir}/final.apk"】后的输出为:

Backup Final APk(V2) to ***\Test\final.apk
<--AndResGuard Done! You can find the output in ***\Test\app\build\outputs\apk\release\AndResGuard_app-release

2

2

1

Backup Final APk(V2) to ***\Test\final.apk

2

<--AndResGuard Done! You can find the output in ***\Test\app\build\outputs\apk\release\AndResGuard_app-release

生成的文件

默认会生成4种apk,我们选择签名、压缩、对齐后的 apk 即可,后缀名是*_7zip_aligned_signed.apk

混淆前 apk 解压后的资源文件:

混淆后 apk 解压后的资源文件:

2018-7-11

原文地址:https://www.cnblogs.com/baiqiantao/p/9292266.html

时间: 2024-08-02 03:27:28

Android 资源混淆 AndResGuard的相关文章

Android资源混淆工具使用说明

本篇博客内容转自 github:  https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md 本文主要是讲述资源混淆组件的用法以及性能,资源混淆组件不涉及编译过程,只需输入一个apk(无论签名与否,debug版,release版均可,在处理过程中会直接将原签名删除),可得到一个实现资源混淆后的apk(若在配置文件中输入签名信息,可自动重签名并对齐,得到可直接发布的apk)以及对应资源ID的mapping文件.同时可

微信开源工具AndResGuard做Android资源混淆

前言 准备工作 开始混淆 Android studio混淆配置 前言 在Android开发过程中,为了防止自己的劳动成功被窃取或者受到不发分子的篡改,往往在发布的时候会对代码做混淆,但是混淆只混淆了代码,资源文件却还是赤裸在其他人面前,而且查看资源文件还非常简单,将.apk文件更换成.zip文件几个res文件夹下清楚的看到相关的资源文件,如下图: 为了保护项目的资源文件的可读性,同时也为了减小整个apk包的大小,下面一起来通过微信的开源库AndResGuard进行资源文件的混淆. 了解AndRe

美团Android资源混淆保护实践

前言 Android应用中的APK安全性一直遭人诟病,市面上充斥着各种被破解或者汉化的应用,破解者可以非常简单的通过破解工具就能对一个APK进行反编译.破解.汉化等等,这样就可以修改原有代码的逻辑.添加新代码.添加或修改资源.或者更有甚者植入病毒等等,从而破坏原有APK的安全和用户体验,最终伤害到用户和原有的开发者. 而事物都是有两方面的,有矛就有盾,针对Android应用安全的各种方案应运而生,大家比较熟悉一般是各类加壳加固的工具,我们可以使用这些工具来保护我们的APK,加壳加固是另外一个话题

Android studio 混淆打包问题

参考 : Android Studio代码混淆设置以及上传mapping文件 AndroidStudio 混淆打包 在app 目录下  proguard-rules.pro中加入 通用 混淆 #指定代码的压缩级别 -optimizationpasses 5 #包明不混合大小写 -dontusemixedcaseclassnames #不去忽略非公共的库类 -dontskipnonpubliclibraryclasses #优化 不优化输入的类文件 -dontoptimize #预校验 -dont

Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} -dontwarn com.hyphenate.** 即:混淆规则. 自己没写过关于混淆打包的文章,在此补上. 下面了解Android studio环境下 项目混淆打包的操作. ------------------------------------------------------------

Android Studio混淆模板及常用第三方混淆(看了都说好)

首先要在build.gradle中开启混淆,也就是minifyEnabled true,我用的build.gradle具体如下所示: def releaseTime() { return new Date().format("yyyy.MM.dd", TimeZone.getTimeZone("UTC")) } android { .... buildTypes { release { // 混淆 minifyEnabled true // Zipalign优化 z

Android代码混淆防反编译解决方案研究

做Android开发的都知道要做混淆去防apk被反编译.破解,通过proguard进行Java代码混淆.但是,Android代码混淆真的能起到实质性的作用吗?看下面分析 1.Android代码混淆 如上图,对Android 代码进行混淆后混淆器将代码中的所有变量.函数.类的名称加密为简短的英文字母代号,在APP被破解后增加破解者对代码的阅读难度. 但是混淆的功效只能运作在APP已经被破解后,而且只是增加破解者的难度时间,对其防止破解的作用意义不是很大. 那么,Android代码混淆不能从根本上防

Android开发混淆使用手册

一.Android混淆最佳实践 混淆配置. 自定义混淆规则. 检查混淆结果. 解出混淆栈. 二.混淆简介 代码压缩. 资源压缩. 三.自定义混淆规则 常见混淆命令. 保持元素不参与混淆的规则. 常用的自定义混淆规则. 四.自定义资源保持规则 keep.xml. 移除替代资源. 综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆. 首先,这里说的的混淆其实是包括了代码压缩.代码混淆以及资源压缩等的优化过程.依靠 ProGuard,混淆流程将主项目

Android 代码混淆规则

1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器.它可以检测并删除未使用的类,字段,方法和属性.它可以优化字节码,并删除未使用的指令.它可以将类.字段和方法使用短无意义的名称进行重命名.最后,预校验的Java6或针对Java MicroEdition的所述处理后的码.如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,