前言:
本篇文章是一篇摘录,目的是从开头就进行有效的性能优化学习,并遵从正确的方法论。
1. 为什么要性能优化
开始着手进行性能优化,是意识到了这块对于一个应用的重要性,以及长期重要性;不仅仅满足于功能、业务本身,还要着眼于代码的效率、用户的体验。另外,技术是为产品服务的。
2. 什么是性能
对于Android应用程序来讲分为三个方面:
- 一方面是软件整体表现上的性能,也就是能多快给用户想要的结果。
比如新闻阅读类应用,这个性能就是当用户点一条新闻时,多快能把新闻内容展示给用户,这个通常取决于业务逻辑,网络,以及后台服务器的性能。 - 另外一方面就是 UI性能 ,也就是所谓的流畅度。
这个在移动应用上面有着更严重的影响,因为触摸和手势的原因,如果应用程序不流畅,会严重影响体验,相比如PC桌面软件会更严重。这个是我们通常所谓的性能,大多数情况下,以及网络上绝大多数文章都是针对于此。对于安卓应用来说要想达到流畅,或者说做动画时,列表滑动时不卡顿,那么帧率(FPS Frame per Second)要达到60这个也是我们在做性能优化时的一个衡量的标杆。 - 还有一方面就是 更少的资源占用 ,包括内存,CPU,电池,磁盘,网络流量,服务器资源等等。
这个也很重要,特别是内存,CPU和电池,前二个对于所有软件来说都是衡量性能的一个重要指标,电池则是移动应用特有的,特别是智能手机上面。
2. 性能问题分类
- UI卡顿和稳定性:
启动慢、页面显示需要长时间转圈加载、页面切换卡顿、黑白屏(卡慢崩会让人烦躁);
所对应的即UI性能优化。 - 内存问题:
耗内存、OOM、程序切换到后台后占用内存无法释放(OOM会影响产品的稳定性;耗内存、内存泄露会影响整机的性能;占用内存多预示着留给其它应用的剩余内存空间小)
所对应的即内存性能优化。 - 功耗问题:
发烫(耗电),即优化耗电量。但与前两者也密不可分。
所对应的即功耗性能优化。 - 启动速度过慢
即优化启动速度 - 安装包体积大
即优化安装包体积
3. 性能优化指标
性能指标的定义应该具有可衡量、可比较的特点,所以每项性能指标可以是数值,也可以是一份报告。用数据说话最有说服力。
- 启动速度:
时间,越短越好; - UI卡顿:
FPS,即Frams per Second,一秒内的刷新帧数,越接近60帧越好; - 过渡绘制:
打开设置中的GPU过度绘制开关,各界面过度绘制不应超过2.5x;也就是打开此调试开关后,界面整体呈现浅色,特别复杂的界面,红色区域也不应该超过全屏幕的四分之一; - 内存泄露:
AS静态代码检测结果、MAT检测结果,内存泄露很难用数值定义,但可以通过将优化前后工具检测的结果对比得出结论。没有内存泄露最好; - 内存峰值:
峰值,峰值越低越好; - 功耗:
单位时间内的掉电量,掉电量越少越好; - 安装包大小
虽然不是性能方面,但也是一种优化。
4. 解决问题方法论
遵循了解问题→定位问题→分析问题→解决问题→验证问题的思路,基本上都可以解决:
- 了解问题:对于性能问题来讲,这个步骤只适用于某些明显的性能问题,很多无法感知的性能问题需要通过工具定位;
- 定位问题:通过工具检测、分析,定位在什么地方存在性能问题;如果很难定位,可以采用排除法(屏蔽部分代码,看现象是否仍然存在,如果还存在,则说明被屏蔽的代码没有问题,这样逐渐缩小问题的范围);
- 分析问题:找到问题后,分析针对这个问题该如何解决,确定解决方案;
- 解决问题:这个没什么可说的,如果是自己无法解决的问题,借助搜索引擎,你遇到过的问题很多人都遇到过,并且极有可能已经被解决了;
- 验证问题:保证每一次优化都有效,没有产生新问题,保证产品的稳定;
5. 性能优化工具
- 开发者选项:
GPU呈现模式分析、GPU过渡绘制、严格模式、应用无响应ANR等; - IDE中:
Android Studio,比如静态代码检测工具、Memory Monitor、CPU Monitor、NetWork Monitor、GPU Monitor、Layout Inspector、Analyze APK等; - SDK中:
sdk\tools,比如DDMS、HierarchyViewer、TraceView等; - 第三方性能优化工具:
MAT、Leakcanary、BlockCanary、GT等;
结语
本文综合了几篇很好的文章介绍了性能优化的概念。性能优化本身也是非常多层面多方面的,在Android开发上,性能主要指的是UI性能,即流畅度问题;和更少的资源占用,即又分为内存问题和功耗问题。接下来就着一学习。感谢大牛们的分享,少走很多弯路。