概述
无论是启动,内存,布局等等这些优化,最终的目的就是为了应用不卡顿。应用的体验性好坏,最直观的表现就是应用的流畅程度,用户不知道什么启动优化,内存不足,等等,应用卡顿,那么这个应用就不行,被卸载的概率非常大。所以说为了保证用户留存率,卡顿优化是非常非常的重要。
卡顿原因究极分析
Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。
为什么是16ms?
因为Android设定的刷新率是60FPS(Frame Per Second), 也就是每秒60帧的刷新率, 约合16ms刷新一次 。
了解到16ms我们接着分析卡顿的原因所在。
1、过于复杂的布局
界面性能取决于UI渲染性能. 我们可以理解为UI渲染的整个过程是由CPU和GPU两个部分协同完成的。其中, CPU负责UI布局元素的Measure, Layout, Draw等相关运算执行。 GPU负责栅格化(rasterization), 将UI元素绘制到屏幕上。
如果我们的UI布局层次太深, 或是自定义控件的onDraw中有复杂运算, CPU的相关运算就可能大于16ms, 导致卡顿。
2、过度绘制(Overdraw)
如果我们的界面存在Overdraw, 也可能导致卡顿。
Overdraw: 用来描述一个像素在屏幕上多少次被重绘在一帧上。 通俗的说: 理想情况下, 每屏每帧上, 每个像素点应该只被绘制一次, 如果有多次绘制, 就是Overdraw, 过度绘制了。
3、UI线程的复杂运算
UI线程的复杂运算会造成UI无响应, 当然更多的是造成UI响应停滞, 卡顿,产生ANR已经是卡顿的极致了。
4、频繁的GC
CPU, GPU相关的,实际上内存原因也可能会造成应用不流畅, 卡顿的。 简而言之, 就是执行GC操作的时候,任何线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行, 故而如果程序频繁GC, 自然会导致界面卡顿。
导致频繁GC有两个原因:
- 内存抖动(Memory Churn), 即大量的对象被创建又在短时间内马上被释放。
- 瞬间产生大量的对象会严重占用Young Generation的内存区域, 当达到阀值, 剩余空间不够的时候, 也会触发GC. 即使每次分配的对象需要占用很少的内存,但是他们叠加在一起会增加Heap的压力, 从而触发更多的GC。
如何做好优化?
上面我有讲到卡顿的几大原因。对此我总结出一个优化文档笔记,由于文章篇幅有限,展示如下,如需深入学习Android性能优化——卡顿优化可以【私信:“手册”获取 参考深入学习】。如下下面几种优化手段。
1、布局优化
布局优化主要有以下方向:
- 减少布局层级
- 减少inflate布局的时间,原生加载XML的方式需要IO + 反射操作
- 减少过度绘制
2、UI优化
- 第一部分,系统为我们做的优化。
- 第二部分,我们可以具体实施的优化方案。
- 第三部分,工具使用。主要包括: Choreographer、monitor、Systrace
3、GC垃圾回收
垃圾回收器有三大职责:
- 分配内存
- 确保任何被引用的对象保留在内存中
- 回收不能通过引用关系找到的对象的内存。
关于Android卡顿优化,我们怎么做到极致优化。需要好好详细去学习剖解。因此文章几百上千字也无法全面了解卡顿优化;对此我把工作中的以及网上大部分优化素材,整合在《Android高工必备性能优化》这个PDF文档中。
Android性能优化解析
Android性能优化是我们,踏入高级工程师的必备技术。性能优化是我们始终躲不掉的一道门槛,学好性能优化绝对是你在Android开发领域里面起到很重要作用。许多大厂的招聘条件里面都是必备技能。