Res资源优化
2017-07-14 本文已影响0人
田间小鹿
对资源中的文件将进行如下方法进行优化:
1.图片压缩
- 1.对apk中的资源图片进行压缩.
可以使用webp图片。WEBP 是google推出的意图改变web图片JPG、PNG、GIF三分天下局势的一种图片格式。它不仅支持无损或有损压缩、alpha通道,还支持动画演示。在同画质的情况下,webp格式图片占用体积相较于jpg图片大约减少40%,相较于无损png图片大约减少30%。 - 2.使用svg图片。svg图片是对图片的描述,牺牲了CPU的计算能力,节省了空间。
WebP的使用方法
-
官方提供了jpg/png/gif到webp的互转的工具,以及使用方法。官方网址
-
下载自己对于的系统的安装包。我以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工具 设置优化点
- 检查没有使用到的布局进行删除
- 检查未使用到的资源进行删除
- 删除string.xml中没有使用到的字符
4.极限压缩
使用7zip工具压缩。下面会用到。
5.进行混淆
让apk变小。
原理:
- 可以删除注释和不用的代码
- 将java文件的名字修改短。a.java
- 方法名字也修改短。
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资源混淆
- 准备工具。
到微信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路径。签名等。
- 下载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种方法。