Android卡顿优化,如何做到极致?全方位分析“对症下药”

概述

无论是启动,内存,布局等等这些优化,最终的目的就是为了应用不卡顿。应用的体验性好坏,最直观的表现就是应用的流畅程度,用户不知道什么启动优化,内存不足,等等,应用卡顿,那么这个应用就不行,被卸载的概率非常大。所以说为了保证用户留存率,卡顿优化是非常非常的重要。

卡顿原因究极分析

Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。

为什么是16ms?

因为Android设定的刷新率是60FPS(Frame Per Second), 也就是每秒60帧的刷新率, 约合16ms刷新一次 。
Android卡顿优化,如何做到极致?全方位分析“对症下药”_第1张图片

了解到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开发领域里面起到很重要作用。许多大厂的招聘条件里面都是必备技能。

你可能感兴趣的:(Android性能优化,Android开发,Android架构师,android,ui,性能优化,程序员,架构师)