作者 | 皓黯
来源 | 闲鱼技术
背景 使用Flutter技术构建的应用,一直以高性能高流畅度著称。但是随着应用复杂度越来越高,Flutter会出现一些页面流畅度明显低于Native的情况,甚至可能发生一些卡顿。而很多时候卡顿都发生在线上,即使获得了用户的操作路径,也难以重现。如果我们有一套卡顿监控系统,能够帮助我们捕获到卡顿时的堆栈,那么在发生卡顿的时候,我们就可以定位到具体是哪个函数引起的卡顿,从而解决这些问题。 既然想要设计一个卡顿监控系统,那么我们就需要先解决两个问题:-
如何判断当前发生了卡顿。
-
如何在卡顿时获取堆栈。
栈帧采集的方案整体思路如下:
-
获取当前进程中的所有线程,并找到Flutter UI TaskRunner对应的线程
-
暂停该线程,并获取该线程当前的寄存器的值,重点为PC和FP
-
根据栈帧回溯算法,获取堆栈
-
让该线程继续运行
-
在当前进程或者远端做符号化
方案实现
接下来我们来看看如何实现这个方案,我们以iOS端为例子,来说明如何实现这个方案:
在iOS端,我们可以通过APItask_threads 来获取所有的线程,代码如下:
thread_get_state 去获取这个线程此时此刻的寄存器的值了,其中能够帮助我们做栈帧回溯的两个寄存器分别是pc和fp,我们这里的代码是以arm64为例子的,在实际的产品中,还需要考虑到其他的架构:
栈帧回溯原理
上文说到,我们获得了pc和fp寄存器的值,该如何做栈帧回溯呢?
我们来对比一下上面提到的3个方案,它们的区别如下图所示:
- end
-
Flutter
框架底层有哪些关键技术?Flutter
应用开发的最佳实践是怎样的?企业需要什么样的终端技术人才?这些问题,相信你会在陈航的《Flutter
核心技术与实战》专栏中找到答案。
这门课会帮助你快速上手
Flutter,用
Flutter
开发一款企业级
App,相信也能助你将
Flutter
与过往的开发经验串联起来,建立起自己的知识体系;同时,你还可以透过现象明白
Flutter
框架的用法,并看到其背后的原理和设计理念。
点击【
阅读原文
】立即学习吧~
精彩推荐
iOS开发老司机的神兵利器-效率工具
苹果
App
Clip
技术详解
iOS面试题-UI篇
来个三连嘛