Android性能优化

Res资源优化

2017-07-14  本文已影响0人  田间小鹿

对资源中的文件将进行如下方法进行优化:

1.图片压缩

WebP的使用方法
  1. 官方提供了jpg/png/gif到webp的互转的工具,以及使用方法。官方网址

  2. 下载转化工具

  3. 下载自己对于的系统的安装包。我以window为例。需要配置环境变量到path中去。安装完成后测试结果如下

    webp工具

    4.工具主要包含四个。分别用于png等转换为webp;webp转化为png;Git转化为webp;查看webp图片;最后一个是用于创建webp动画文件的。

    工具

5.对于资源文件中的图片,都是支持的。如果在代码中调用图片,如果是android4.0以上可以直接调用和其他图片使用是一样的。对于以下的网上有许多参考。现在手机基本上多少android4.0以上的了。

cwebp -q 50 -lossless picture.png -o picture_lossless.webp
cwebp -q 70 picture_with_alpha.png -o picture_with_alpha.webp

2.资源动态加载

动态的从服务器下载资源图片,把不必要的图片不放在apk资源包中。也可以使用一些插件化进行动态加载

3.Lint工具 设置优化点

  1. 检查没有使用到的布局进行删除
  2. 检查未使用到的资源进行删除
  3. 删除string.xml中没有使用到的字符

4.极限压缩

使用7zip工具压缩。下面会用到。

5.进行混淆

让apk变小。
原理:

  1. 可以删除注释和不用的代码
  2. 将java文件的名字修改短。a.java
  3. 方法名字也修改短。

6.对resources.arsc进行优化

微信开源工具AndResGuard做Android资源混淆
  1. 准备工具。
    到微信github下载工具。在tool_output目录下。

2.包含的文件

文件介绍

3.配置文件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="true"/>
        <!--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="true">
        <!--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_?-->
        <!--<path value="<your_package_name>.R.drawable.icon"/>-->
        <!--<path value="<your_package_name>.R.string.com.crashlytics.*"/>-->
        <!--<path value="<your_package_name>.R.string.umeng*"/>-->
        <!--<path value="<your_package_name>.R.layout.umeng*"/>-->
        <!--<path value="<your_package_name>.R.drawable.umeng*"/>-->
        <!--<path value="<your_package_name>.R.anim.umeng*"/>-->
        <!--<path value="<your_package_name>.R.color.umeng*"/>-->
        <!--<path value="<your_package_name>.R.style.*UM*"/>-->
        <!--<path value="<your_package_name>.R.style.umeng*"/>-->
        <!--<path value="<your_package_name>.R.id.umeng*"/>-->
        <!--<path value="<your_package_name>.R.string.UM*"/>-->
        <!--<path value="<your_package_name>.R.string.tb_*"/>-->
        <!--<path value="<your_package_name>.R.layout.tb_*"/>-->
        <!--<path value="<your_package_name>.R.drawable.tb_*"/>-->
        <!--<path value="<your_package_name>.R.color.tb_*"/>-->
    </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>

    <!--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="release.keystore"/>
        <!--storepass-->
        <storepass value="testres"/>
        <!--keypass-->
        <keypass value="testres"/>
        <!--alias-->
        <alias value="testres"/>
    </issue>

</resproguard>

其中包含 7zip的压缩,设置白名单,即在混淆的时候不混淆。设置mapping路径。签名等。

  1. 下载7zip文件
    下载地址
    7za下载
    配置7zip环境变量

7zip压缩比


7zip压缩

5.开始编译

 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.2.3.jar input.apk -config config.xml -out outapk -signature "%storepath%" "%storepass%" "%keypass%" "%alias%" -zipalign "%zipalign%"
 pause

这是微信build_apk.bat.的配置。其中config.xml默认是打开的。如果按照上面的运行默认是使用7za的,如果在下载7zip没有现在extra就运行错误。不会生成。如果在命令后边 加上 -7zip 然后指定到 7z.exe也是可以运行的。

6.最终压缩结果

压缩后的结果 资源文件被压缩了

这样压缩就结束了。其实可以在android studio中配置。可以参考开源。
也可以参考http://blog.csdn.net/u014300915/article/details/50601940 这上使用了3种方法。

上一篇 下一篇

猜你喜欢

热点阅读