目录

一、去除无用的资源

二、忽略占比极少的分辨率

三、优化图片

四、使用更先进的图片格式

(1)使用矢量图

(2)使用webp图片格式

五、总结


当一款App经历了大量的迭代后,apk包会越来越臃肿,这里面会存在大量的情况。比如冗余的代码、无用的资源、未合理化处理的图片等等。

在经历了疯狂的迭代后,我和我的团队发现再也不能忽视apk大小的问题了,apk的大小已经逼近70M,然而承载的业务量却似乎没有这么多,于是我开始集中精力进行apk瘦身的工作。在一系列调查和研究后,成功让我们两款app瘦身回20M。

在给App瘦身过程中的有一些总结和体会,我会整理成几个章节分别给大家介绍一下。文章主要是介绍问题的探索方向和解决思路,会介绍一些工具,但是工具的详细使用需要大家自己去搜索(部分会给出链接),基本上很容易找到大量的博客。

本篇博客重点讲解图片资源相关问题

首先介绍一个Android studio自带的工具Analyze Apk,选择build -> analyze apk就可以很方便的看到apk各个部分的大小,同时还提供了比较的功能,可以比较两个apk各个部分大小的不同。

大多数情况下,这部分是在一款app中占用空间最多的地方。如果一直没有关注这部分,资源非常混乱的话资源文件甚至会占去app一半以上的空间。主要从以下几个方面着手:

一、去除无用的资源

在经历了大量的迭代后,尤其页面经过了大规模的修改,或者依赖了一些的开源项目,会导致apk中存在很多过时的、已经不再被使用的资源。

处理这些资源有很多方法, 比如使用lint,还可以在gradle中启用shrinkResources来自动去除无用的资源,如下

android {...buildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}

关于shrinkResources还有很多高级用法,有兴趣的同学可以自行搜索相关文档学习。

但是在使用shrinkResources时一定要注意,如果我们在代码中以路径、文件名或者url的形式来使用资源,可能会导致有用的资源也被清除掉。这时我们可以用shrinkResources的keeping功能来手动保留这部分资源,防止被自动清除,但是前提是我们要非常熟悉项目的所有代码。

二、忽略占比极少的分辨率

由于Android设备过于碎片话,所以google规范了一套规则,将不同分辨率的图片放在对于文件夹下,如drawable-xhdpi、drawable-hdpizhe等。

但是实际上我们不需要每种分辨率类型都放一套资源,而且资源在不同分辨率下可以自适应。比如只在xhdpi下有一张图片,如果是480x860的分辨率,会按比例自动压缩这张图片并使用。所以大部分图片使用一到两套就可以了。

目前主流的设备的分辨率是1k-2k的分辨率,我们只需要xhdpi或xxhdpi版本的图片即可。有特殊要求的图片再添加不同的分辨率版本

尤其注意xxxhdpi,这个分辨率是4k级别的,所以这个分辨率的图片都很大。目前很少有手机达到这样的分辨率,而且由于像素密度的问题,2K级别的图片在4K屏幕上显示也不会有特别明显的差别。所以不建议使用这一分辨率的图片。

关于这部分也有一些工具可以使用,比如resConfigs,使用如下:

android {defaultConfig {...resConfigs "en", "fr"}
}

可以只打包某些分辨率版本或某些语言版本的资源,前提是保证这些版本的资源包含了app所用到的所有资源,详细使用可查阅相关文档。

三、优化图片

有两个原则:需要透明度的图片使用PNG格式,不需要的一律使用JPG格式;使用JPG格式的图片在保证质量的前提下进行压缩。

这是因为JPG格式会损失透明度,如果是icon这种需要透明度的图片转成JPG格式背景色就会变成白色或者黑色。所以需要透明度的图片我们需要使用PNG格式。

不需要透明度要使用JPG格式的原因是压缩率会更大。

网上有很多工具可以压缩图片,比如tinypng,利用这些工具可以很轻松的压缩图片。

这里还有另外两个原则:尽量不要使用原图;在保证质量的前提下压缩。

现在有很多优秀的压缩算法可以极大的压缩图片大小,但是显示的时候肉眼几乎看不到差别,对于app来说绝大多数场景都没有必要使用原图。

不论什么算法,都会对图片质量有一定的损失,一定要在保证图片质量没有太多损失的情况下进行压缩。

四、使用更先进的图片格式

对于图片的压缩和优化,工程师们一直再追求极致,各种更先进有效的算法不停的出现。

(1)使用矢量图

在Android 5.0版本google加入来矢量图的支持Vector Asset。矢量图适用于简单的图标,不适用于复杂的图片。

矢量图主要解决不同分辨率下缩放导致图标不清晰,使用矢量图就只需要一个文件,不再需要不同分辨率版本的图片,而且矢量图文件一般会比较小。

使用矢量图主要注意两点:一是由于矢量图适用于简单的图标,二这些图标本身也不会太大,所以使用矢量图对应用整体大小的减少比较有限;二是如果要兼容低于5.0版本,需要引入support包。

(2)使用webp图片格式

google推出的新的图片格式——  WebP,可以获得更大的压缩率,使我们的图片资源更小。在前端尤其是web上得到了很好的应用,在Android中使用主要注意低版本兼容问题。

对于Android来说,4.2.1以上版本完全支持WebP,4.0到4.2.1版本只支持不透明的WebP,而更低版本则不支持WebP。 参考:https://developer.android.com/guide/appendix/media-formats.html

可以引入官方的兼容库来兼容低版本,具体解决方案有兴趣的可以自行搜索。

五、总结

资源问题是应用迭代过程中一定会产生的问题,但是不能任由其随意扩张。

在开发小组内部甚至与设计人员一起制定一套规则来避免超大图片的存在。同时在迭代过程中定期审查过期资源,就会形成一个良性循环。

实际上只要制定一套切实可行且具有有效监督的规则,在养成良好的习惯后,可以有效的避免上述问题的出现。即使业务迭代频繁无法顾及,这部分也不会迅速增长。

Android App 瘦身总结 第一章 图片资源的优化处理相关推荐

  1. Android App 瘦身总结 第二章 jni动态库及cpu兼容

    目录 一.利弊分析,按需引用 二.平台兼容 三.动态加载 四.总结 在前一章主要分析了图片资源部分的优化(Android App 瘦身总结 第一章 图片资源的优化处理_There is a Bug!! ...

  2. Android App 瘦身总结 第三章 代码混淆及优化

    目录 一.代码混淆proguard 二.调整第三方库 三.环境差异依赖 四.代码习惯 五.插件化 六.总结 在前两章我们分别从图片资源和jni动态库这两个方面来分析apk瘦身的优化点 Android ...

  3. Android App 瘦身总结

    随着移动端产品功能的逐渐增加,APP 的体积也不可避免地呈现上升趋势,如果不加以重视,几个版本迭代下来,可能你的 APP 体积会达到用户不能忍受的程度. 如果你是 SDK 开发者,你的 SDK 包大小 ...

  4. Android - App瘦身

    为什么要瘦身 安装包变大,导致很多用户不愿意安装更新 安装包变大,导致很多用户不愿意下载 安装包变大,流量使用增多,增加其他边际成本 优化方式 图片资源的优化 图片选择顺序 首先选选择SVG 否则选择 ...

  5. Android app瘦身计划

    上次在面试中被问到这个问题,只答了个使用webp格式图片,感觉有点尴尬,特地总结下有哪些减小app大小的办法 使用一套资源 这是最基本的一条规则,但非常重要. 对于绝大对数APP来说,只需要取一套设计 ...

  6. Android中app瘦身方式

    App瘦身的概念 App瘦身是指在不减少App功能的前提下,通过一些技巧将打包出来的apk体的体积尽可能减少.  这样做的好处有几个:加快用户下载速度,节省用户下载流量,提升用户下载体验.  如果不进 ...

  7. App瘦身最佳实践(分析了微信、淘宝、微博图片文件的放法)

    本文会不定期更新,推荐watch下项目.如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request. 本文的示例代码主要是基于作者的经验来编写的,若你有其他 ...

  8. App 瘦身最佳实践

    原文链接:www.jianshu.com Android本文会不定期更新,推荐watch下项目.如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request. ...

  9. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

最新文章

  1. 邮件服务器postfix+cyrus
  2. 最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)
  3. 简述python的特性_Python的特性概要
  4. CS-- WebService、 windowsService
  5. create显示中文乱码 qt_Ubuntu下Qt串口助手接收中文乱码问题
  6. 单片机c语言二进制转10进制,51单片机用C语言怎么样把八位二进制转换成十进制...
  7. Mac实时远程抓Ubuntu的网络包
  8. 搜索很久_装了SSD你还需要这个软件才更快,搜索查找文件数据从此不再等待
  9. android单例模式代码,在Android studio 中使用单例模式(示例代码)
  10. python的localtime函数_python的内置函数time
  11. 洛谷 P1878 舞蹈课(优先队列 + 双链表)
  12. Innoreader + Rsshub
  13. 开单大师目录结构学习
  14. 心灵鸡汤1------让人奋进的五句话
  15. 公众号题库系统接口-网课答案解析接口
  16. 服务器网站出现403 forbidden,谷歌浏览器出现403 forbidden怎么回事_谷歌浏览器出现403 forbidden如何解决...
  17. 一阶电路实验报告心得_电路实验心得体会范文3篇
  18. python输出换行
  19. C语言sopc蜂鸣器按键弹奏中音,SOPC乐曲演奏大作业.doc
  20. 时间上第一台计算机有多大,世界上第一台计算机有多大?

热门文章

  1. wcf中的使用全双工通信(转)
  2. 分离数据库(Detach database).
  3. 【转】主要空间数据挖掘方法
  4. t-sql导出EXCEL语句
  5. ROS学习之日志消息
  6. 【Python】学习笔记7-异常处理try。。except .. as e ....else
  7. 用黄金圈思维来思考测试
  8. 消息推送与同步协议的思考
  9. 在centOS上搭建wordpress博客系统
  10. 使用CSS3线性渐变实现图片闪光划过效果