1、什么是ANR
ANR(Application Not Responding):应用程序无响应,即通常我们说的卡顿,卡顿就是在应用使用过程中出现界面不响应或者界面渲染粘滞的情况。而应用界面的渲染以及事件响应是在主线程完成的,出现卡顿的原因可以归结为主线程阻塞。在开发过程中,遇到的造成主线程阻塞的原因可能是:
- 主线程在进行大量I/O操作:为了方便代码编写,直接在主线程去写入大量数据;
- 主线程在进行大量计算:代码编写不合理,主线程进行复杂计算;
- 大量UI绘制:界面过于复杂,UI绘制需要大量时间;
- 主线程在等锁:主线程需要获得锁A,但是当前某个子线程持有这个锁A,导致主线程不得不等待子线程完成任务。
针对这些问题,如果我们能够捕获得到卡顿当时应用的主线程堆栈,那么问题就迎刃而解了。有了堆栈,就可以知道主线程在什么函数哪一行代码卡住了,是在等什么锁,还是在进行I/O操作,或者是进行复杂计算。有了堆栈,就可以对问题进行针对性解决。
2、卡顿监控方案
参考文章 质量监控-卡顿检测,卡顿监控主要有以下解决方案:
- fps
- ping
- runloop
- stack backtrace
- msgSend observe
2.1 fps
通常情况下,屏幕会保持60hz/s的刷新速度,每次刷新时会发出一个屏幕刷新信号,CADisplayLink允许我们注册一个与刷新信号同步的回调处理。可以通过屏幕刷新机制来展示fps值,具体实现可以参考:软件测试之性能测试(ios)——获取fps(流畅度)
指标 | |
---|---|
卡顿反馈 | 卡顿发生时,fps会有明显下滑。但转场动画等特殊场景也存在下滑情况。高 |
采集精度 | 回调总是需要cpu空闲才能处理,无法及时采集调用栈信息。低 |
性能损耗 | 监听屏幕刷新会频繁唤醒runloop,闲置状态下有一定的损耗。中低 |
实现成本 | 单纯的采用CADisplayLink实现。低 |
结论 | 更适用于开发阶段,线上可作为辅助手段 |