Android Apk资源文件压缩学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28656671/article/details/52014660

最近学习了一个apk的资源id进行压缩的工具。

原文地址:https://github.com/shwenzhang/AndResGuard

资源压缩的原理:安装包立减1M--微信Android资源混淆打包工具

这两篇文章对资源压缩的用法和原理讲解的比较详细。这里就只记录了我自己用的时候的一些心得。
有两种方式可以使用。

1,直接在Android Studio中配置gradle。
在项目的build.gradle中加入:

classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.9'
我的配置结果:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.9'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
在app中的build.gradle加入:

apply plugin: 'AndResGuard'
andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    whiteList = [
        //for your icon
        "R.drawable.icon",
        //for fabric
        "R.string.com.crashlytics.*",
        //for umeng update
        "R.string.umeng*",
        "R.string.UM*",
        "R.string.tb_*",
        "R.layout.umeng*",
        "R.layout.tb_*",
        "R.drawable.umeng*",
        "R.drawable.tb_*",
        "R.anim.umeng*",
        "R.color.umeng*",
        "R.color.tb_*",
        "R.style.*UM*",
        "R.style.umeng*",
        "R.id.umeng*"
        //umeng share for sina
        "R.drawable.sina*"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
     sevenzip {
         artifact = 'com.tencent.mm:SevenZip:1.1.9'
         //path = "/usr/local/bin/7za"
    }
}
配置完成后:

apply plugin: 'com.android.application'
apply plugin: 'AndResGuard'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    signingConfigs {
        release {
            try {
                storeFile file("../keystore/butterknifedemo.jks")
                storePassword "123456"
                keyAlias "asdfg"
                keyPassword "123456"
            } catch (ex) {
                throw new InvalidUserDataException(ex.toString())
            }
        }
    }
    defaultConfig {
        applicationId "com.tongyan.butterknifedemo"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
}
andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    whiteList = [//因为我的项目只是一个简单的demo就没有添加白名单

    ]
    compressFilePattern = [
            "*.png",
            "*.jpg",
            "*.jpeg",
            "*.gif",
            "resources.arsc"
    ]
    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.1.9'
        //path = "/usr/local/bin/7za"
    }
}
dependencies {

    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
}
然后在Android Studio自带的命令行中输入gradlew resguard,然后就可以得到相应的安装包
注意:没有签名的安装包会出现‘安装包解析错误’的提示。原因未知
2,直接下载压缩工具: 点击下载 tool_output文件夹下就是压缩工具

然后用记事本打开buildApk.bat文件,

set jdkpath=D:\Program Files\Java\jdk1.7.0_79\bin\java.exe
set storepath=release.keystore
set storepass=testres
set keypass=testres
set alias=testres
set zipalign=D:\soft\dev\android\sdk\build-tools\23.0.2\zipalign.exe
"%jdkpath%" -jar AndResGuard-cli-1.1.9.jar input.apk -config config.xml -out outapk -signature "%storepath%" "%storepass%" "%keypass%" "%alias%" -zipalign "%zipalign%"
pause
把几个set参数都修改成我们自己的参数,把input.apk修改成直接的apk文件名
修改config.xml文件替换里面的包名为应用的包名。

<?xml version="1.0" encoding="UTF-8"?>  
<resproguard>  
    <!--defaut property to set  -->  
    <issue id="property">  
        <!--whether use 7zip to repackage the signed apk, you must install the 7z command line version in window -->  
        <!--sudo apt-get install p7zip-full in linux -->  
        <!--and you must write the sign data fist, and i found that if we use linux, we can get a better result -->  
        <seventzip value="false"/>   
        <!--the sign data file name in your apk, default must be META-INF-->  
        <!--generally, you do not need to change it if you dont change the meta file name in your apk-->  
        <metaname value="META-INF"/>  
        <!--if keep root, res/drawable will be kept, it won't be changed to such as r/s-->  
        <keeproot value="false"/>  
    </issue>  
  
      
      
      
    <!--whitelist, some resource id you can not proguard, such as getIdentifier-->  
    <!--isactive, whether to use whitelist, you can set false to close it simply-->  
    <issue id="whitelist" isactive="false">  
        <!--you must write the full package name, such as com.tencent.mm.R -->  
        <!--for some reason, we should keep our icon better-->  
        <!--and it support *, ?, such as com.tencent.mm.R.drawable.emoji_*, com.tencent.mm.R.drawable.emoji_?-->  
       
    </issue>  
      
      
      
  
    <!--keepmapping, sometimes if we need to support incremental upgrade, we should keep the old mapping-->  
    <!--isactive, whether to use keepmapping, you can set false to close it simply-->  
    <!--if you use -mapping to set keepmapping property in cammand line, these setting will be overlayed-->  
    <!-- <issue id="keepmapping" isactive="false"> -->  
        <!--the old mapping path, in window use \, in linux use /, and the default path is the running location-->  
        <!--<path value="{your_mapping_path}"/> -->  
    <!--</issue> -->  
  
      
      
      
    <!--compress, if you want to compress the file, the name is relative path, such as resources.arsc, res/drawable-hdpi/welcome.png-->  
    <!--what can you compress? generally, if your resources.arsc less than 1m, you can compress it. and i think compress .png, .jpg is ok-->  
    <!--isactive, whether to use compress, you can set false to close it simply-->  
    <issue id="compress" isactive="false">  
        <!--you must use / separation, and it support *, ?, such as *.png, *.jpg, res/drawable-hdpi/welcome_?.png-->  
        <path value="*.png"/>  
        <path value="*.jpg"/>  
        <path value="*.jpeg"/>  
        <path value="*.gif"/>  
        <path value="resources.arsc"/>  
    </issue>  
  
      <!--keepmapping, sometimes if we need to support incremental upgrade, we should keep the old mapping-->
    <!--isactive, whether to use keepmapping, you can set false to close it simply-->
    <!--if you use -mapping to set keepmapping property in cammand line, these setting will be overlayed-->
    <issue id="keepmapping" isactive="false">
        <!--the old mapping path, in window use \, in linux use /, and the default path is the running location-->
        <path value="{your_mapping_path}"/>
    </issue>
      
      
    <!--sign, if you want to sign the apk, and if you want to use 7zip, you must fill in the following data-->  
    <!--isactive, whether to use sign, you can set false to close it simply-->  
    <!--if you use -signature to set sign property in cammand line, these setting will be overlayed-->  
    <issue id="sign" isactive="true">  
        <!--the signature file path, in window use \, in linux use /, and the default path is the running location-->  
        <path value="D:/android_studio_work/ButterKnifeDemo/keystore/butterknifedemo.jks"/>  
        <!--storepass-->  
        <storepass value="123456"/>  
        <!--keypass-->  
        <keypass value="123456"/>  
        <!--alias-->  
        <alias value="tongyan"/>  
    </issue>  
  
</resproguard>  

最后运行buildApk.bat文件,就可以生成压缩后的安装包
注意 :没有签名的安装包会出现‘安装包解析错误’的提示。原因未知



猜你喜欢

转载自blog.csdn.net/qq_28656671/article/details/52014660