Android应用性能优化之Apk瘦身机制
2017-04-07 17:44
267 查看
个人所知道的,当然还有一些我不知道,欢迎大家留言指出,我也学习一下。
![](https://img-blog.csdn.net/20170407164332938?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ1MDEyNzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在Android Studio工具栏里,打开Refactor–>Remove Unused Resources,删除无用的资源
![](https://img-blog.csdn.net/20170407165100240?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ1MDEyNzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
如果能帮我们把所有的无用资源列出来,让我们自己选择那就完美了,当然,可能图片是经过反射或字符拼接等方式获取,所以这个检测列表也不是全对,删除后很大概率编译失败或部分页面挂死、无图等问题,这个上网查了,也没有什么靠谱的结果,工具还没智能到这个地步,所以你只能一遍又一遍“编译—解决部分问题—再编译再解决”
android studio中带有几十种语言信息,如果你的应用不用支持国际化,那再国内只需要中文即可:
开启minifyEnabled混淆代码
在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小:
开启shrinkResources去除无用资源
基本上armable的so也是兼容armable-v7的,armable-v7a的库会对图形渲染方面有很大的改进,如果没有这方面的要求,可以精简。
注意:这里不排除有极少数设备会Crash,可能和不同的so有一定的关系,请大家务必测试周全后再发布。
删除x86包下的so
x86包下的so在x86型号的手机是需要的,如果产品没用这方面的要求也可以精简。
建议实际工作的配置是只保留armable、armable-x86下的so文件,算是一个折中的方案。
![](https://img-blog.csdn.net/20170407171038407?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQ1MDEyNzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
大家可以看一下压缩前后的对比!
1.优势
占用存储空间小
随便拉伸不会出现锯齿,可以照顾不同尺寸的机型
Android Studio自带很多资源,减小UI工作量
2.劣势
只支持5.0及以上系统
与位图相比多了一层计算,需消耗更多性能
不支持.9图
不适合表现真实照片和复杂图形,一般使用在简单的icon和动画上
Android Studio自带工具优化
在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包在Android Studio工具栏里,打开Refactor–>Remove Unused Resources,删除无用的资源
如果能帮我们把所有的无用资源列出来,让我们自己选择那就完美了,当然,可能图片是经过反射或字符拼接等方式获取,所以这个检测列表也不是全对,删除后很大概率编译失败或部分页面挂死、无图等问题,这个上网查了,也没有什么靠谱的结果,工具还没智能到这个地步,所以你只能一遍又一遍“编译—解决部分问题—再编译再解决”
在gradle配置,达到apk瘦身效果
删除无用的语言资源android studio中带有几十种语言信息,如果你的应用不用支持国际化,那再国内只需要中文即可:
``` android { defaultConfig { resConfigs "zh" } } ```
开启minifyEnabled混淆代码
在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小:
android { buildTypes { release { minifyEnabled true } } }
开启shrinkResources去除无用资源
android { buildTypes { release { shrinkResources true } } }
删除没有的so文件
删除armable-v7包下的so基本上armable的so也是兼容armable-v7的,armable-v7a的库会对图形渲染方面有很大的改进,如果没有这方面的要求,可以精简。
注意:这里不排除有极少数设备会Crash,可能和不同的so有一定的关系,请大家务必测试周全后再发布。
删除x86包下的so
x86包下的so在x86型号的手机是需要的,如果产品没用这方面的要求也可以精简。
建议实际工作的配置是只保留armable、armable-x86下的so文件,算是一个折中的方案。
使用tinypng有损压缩
tinypng官方地址:http://tinypng.com/ TinyPNG工具只支持上传PNG图片到官网上压缩,然后下载保存,在保持alpha通道的情况下对PNG的压缩可以达到1/3之内,而且用肉眼基本上分辨不出压缩的损失.
大家可以看一下压缩前后的对比!
使用一套资源
对于多数app,其实只需要一套图就可以了。鉴于现在分辨率的趋势,建议取720p的资源,放到xhdpi目录。相对于多套资源,只使用720P的一套资源,在视觉上差别不大,很多大公司的产品也是如此,但却能显著的减少资源占用大小,顺便也能减轻设计师的出图工作量了。 注意,这里不是说把不是xhdpi的目录都删除,而是强调保留一套设计资源就够了
使用微信资源压缩打包工具
微信资源压缩打包工具通过短资源名称,采用7zip对APP进行极致压缩实现减小APP的目标,效果非常的好,强烈推荐。 建议开启7zip,注意白名单的配置,否则会导致有些资源找不到,官方已经发布AndResGuard到gradle中了,非常方便:
apply plugin: 'AndResGuard' buildscript { dependencies { classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.7' } } andResGuard { mappingFile = null use7zip = true useSign = true keepRoot = false // add <your_application_id>.R.drawable.icon into whitelist. // because the launcher will get thgge icon with his name def packageName = <your_application_id> whiteList = [ //for your icon packageName + ".R.drawable.icon", //for fabric packageName + ".R.string.com.crashlytics.*", //for umeng update packageName + ".R.string.umeng*", packageName + ".R.string.UM*", packageName + ".R.string.tb_*", packageName + ".R.layout.umeng*", packageName + ".R.layout.tb_*", packageName + ".R.drawable.umeng*", packageName + ".R.drawable.tb_*", packageName + ".R.anim.umeng*", packageName + ".R.color.umeng*", packageName + ".R.color.tb_*", packageName + ".R.style.*UM*", packageName + ".R.style.umeng*", packageName + ".R.id.umeng*" ] compressFilePattern = [ "*.png", "*.jpg", "*.jpeg", "*.gif", "resources.arsc" ] sevenzip { artifact = 'com.tencent.mm:SevenZip:1.1.7' //path = "/usr/local/bin/7za" } }
会生成一个andresguard/resguard的Task,自动读取release签名进行重新混淆打包。
Facebook的redex优化字节码
redex是facebook发布的一款android字节码的优化工具,需要按照说明文档自行配置一下。
redex input.apk -o output.apk --sign -s <KEYSTORE> -a <KEYALIAS> -p <KEYPASS>
这一种效果是非常好的。 优化的时候:要注意先后顺序,最好先用redex优化,再用微信资源压缩打包工具在使用。 注意:据反应red 4000 ex后会有崩溃的现象,反正我是没碰到。 ReDex详情参考:https://github.com/facebook/redex
使用jpg格式
对于非透明的大图,jpg将会比png的大小有显著的优势,虽然不是绝对的,但是通常会减小到一半都不止,例如在app的启动页,活动页等之类的大图展示区采用jpg是不错的选择。
缩小大图
你的工程里面有一些大图,考虑是否有必要维持这样的大尺寸,是否能适当的缩小。因为设计师的出图,我们拿到的很多图片完全可以适当的缩小而对视觉影响是极小的。
覆盖第三库里的大图
有些第三库里引用了一些大图但是实际上并不会被我们用到,就可以考虑用1x1的透明图片覆盖
矢量图
矢量图是由点与线组成,和位图不一样,它再放大也能保持清晰度,而且使用矢量图比位图设计方案能节约30~40%的空间,现在谷歌一直在强调扁平化方式,矢量图可很好的契合该设计理念。
1.优势
占用存储空间小
随便拉伸不会出现锯齿,可以照顾不同尺寸的机型
Android Studio自带很多资源,减小UI工作量
2.劣势
只支持5.0及以上系统
与位图相比多了一层计算,需消耗更多性能
不支持.9图
不适合表现真实照片和复杂图形,一般使用在简单的icon和动画上
使用shape背景
很多纯色的渐变的圆角的图片都可以用shape实现,代码灵活可控,可以减少大量的背景图片。
相关文章推荐
- 老司机谈APK瘦身套路-项目优化篇
- Android优化之APK瘦身
- 安卓优化之apk瘦身(27.7M-->17.5M)
- Android性能优化系列之apk瘦身
- 安卓Apk优化之瘦身
- Android应用性能优化之内存机制和不良代码
- Android性能优化系列之apk瘦身
- Android性能优化系列之apk瘦身
- Android性能优化系列之apk瘦身
- Android 性能优化 (一)APK高效瘦身
- 老司机谈APK瘦身套路-项目优化篇
- Android app性能优化和apk瘦身实践(更新:增加apk瘦身,2018-3-31)
- [置顶] Android中性能优化(apk瘦身)
- Android性能优化系列之apk瘦身
- APK瘦身优化,减小apk的大小
- Android性能优化—— Apk瘦身的实现
- Android性能优化系列之apk瘦身
- Android优化系列之apk瘦身
- Android性能优化系列之apk瘦身
- Apk瘦身优化