Need help with AndResGuard?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

shwenzhang
7.2K Stars 1.3K Forks Apache License 2.0 417 Commits 97 Opened issues

Description

proguard resource for Android by wechat team

Services available

!
?

Need anything else?

Contributors list

No Data

AndResGuard

Build Status Download Android Arsenal

Read this in other languages: English, 简体中文.

AndResGuard
is a tooling for reducing your apk size, it works like the
ProGuard
for Java source code, but only aim at the resource files. It changes
res/drawable/wechat
to
r/d/a
, and renames the resource file
wechat.png
to
a.png
. Finally, it repackages the apk with 7zip, which can reduce the package size obviously.

AndResGuard
is fast, and it does NOT need the source codes. Input an Android apk, then we can get a 'ResGuard' apk in a few seconds.

Some uses of

AndResGuard
are:
  1. Obfuscate android resources. It contains all the resource type(such as drawable、layout、string...). It can prevent your apk from being reversed by

    Apktool
    .
  2. Shrinking the apk size. It can reduce the

    resources.arsc
    and the package size obviously.
  3. Repackage with

    7zip
    . It supports repackage apk with
    7zip
    , and we can specify the compression method for each file.

AndResGuard
is a command-line tool, it supports Windows, Linux and Mac. We suggest you to use 7zip in Linux or Mac platform for a higher compression ratio.

How to use

With Gradle

This has been released on

Bintray
```gradle apply plugin: 'AndResGuard'

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

andResGuard { // mappingFile = file("./resourcemapping.txt") mappingFile = null use7zip = true useSign = true // It will keep the origin path of your resources when it's true keepRoot = false // If set, name column in arsc those need to proguard will be kept to this value fixedResName = "arg" // It will merge the duplicated resources, but don't rely on this feature too much. // it's always better to remove duplicated resource from repo mergeDuplicatedRes = true whiteList = [ // your icon "R.drawable.icon", // for fabric "R.string.com.crashlytics.*", // for google-services "R.string.googleappid", "R.string.gcmdefaultSenderId", "R.string.defaultwebclientid", "R.string.gatrackingId", "R.string.firebasedatabaseurl", "R.string.googleapikey", "R.string.googlecrashreportingapikey", "R.string.project_id", ] compressFilePattern = [ ".png", ".jpg", ".jpeg", ".gif", ] sevenzip { artifact = 'com.tencent.mm:SevenZip:1.2.20' //path = "/usr/local/bin/7za" }

/**
* Optional: if finalApkBackupPath is null, AndResGuard will overwrite final apk
* to the path which assemble[Task] write to
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"

/**

  • Optional: Specifies the name of the message digest algorithm to user when digesting the entries of JAR file
  • Only works in V1signing, default value is "SHA-1"
  • */ // digestalg = "SHA-256"

} ```

Wildcard

The whiteList and compressFilePattern support wildcard include ? * +.

?   Zero or one character
*   Zero or more of character
+   One or more of character

WhiteList

You need put all resource which access via

getIdentifier
into whiteList. You can find more whitsList configs of third-part SDK in white_list.md. Welcome PR your configs which is not included in white_list.md

The whiteList only works on the specsName of resources, it wouldn't keep the path of resource. If you wanna keeping the path, please use

mappingFile
to implement it.

For example, we wanna keeping the path of icon, we need add below into our

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

How to Launch

If you are using

Android Studio
, you can find the generate task option in
andresguard
group. Or alternatively, you run
./gradlew resguard[BuildType | Flavor]
in your terminal. The format of task name is as same as
assemble
.

Sevenzip

The

sevenzip
in gradle file can be set by
path
or
artifact
. Multiple assignments are allowed, but the winner is always
path
.

Result

If finalApkBackupPath is null, AndResGuard will overwrite final APK to the path which assemble[Task] write. Otherwise, it will store in the path you assigned.

Other

Looking for more detail

Known Issue

  1. The first element of list which returned by
    AssetManager#list(String path)
    is empty string when you're using the APK which is compressed by 7zip. #162

Best Practise

  1. Do NOT add
    resources.arsc
    into
    compressFilePattern
    unless the app size is really matter to you.(#84 #233)
  2. Do NOT enable 7zip compression(
    use7zip
    ) when you distribute your APP on Google Play. It'll prevent the file-by-file patch when updating your APP. (#233)

Thanks

Apktool Connor Tumbleson

v2sig @jonyChina162

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.