Res资源优化

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

1.图片压缩

  • 1.对apk中的资源图片进行压缩.
    可以使用webp图片。WEBP 是google推出的意图改变web图片JPG、PNG、GIF三分天下局势的一种图片格式。它不仅支持无损或有损压缩、alpha通道,还支持动画演示。在同画质的情况下,webp格式图片占用体积相较于jpg图片大约减少40%,相较于无损png图片大约减少30%。
  • 2.使用svg图片。svg图片是对图片的描述,牺牲了CPU的计算能力,节省了空间。
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进行优化

  • 资源打包过程


    资源打包
  • 资源打包后存放格式


    资源格式
  • resources.arsc包中的文件是对资源文件的2进制的保存。其实我们也可以像优化dex包即混淆的方法把其中的包含 arrt,drawable,string,layout,color,menu,anim,styles等文件的名字和路径修改成a.png等名字。这样resources.arsc的大小就小了。
  • 原理可以参考。http://blog.csdn.net/jiangwei0910410003/article/details/50628894
  • 具体的使用我们可以使用微信开源工具AndResGuard做Android资源混淆。
微信开源工具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种方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容