Android卡顿优化,如何做到极致?全方位分析对症下药
概述
无论是启动,内存,布局等等这些优化,最终的目的就是为了应用不卡顿。应用的体验性好坏,最直观的表现就是应用的流畅程度,用户不知道什么启动优化,内存不足,等等,应用卡顿,那么这个应用就不行,被卸载的概率非常大。所以说为了保证用户留存率,卡顿优化是非常非常的重要。 卡顿原因究极分析
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开发领域里面起到很重要作用。许多大厂的招聘条件里面都是必备技能。