快来使用DevTools优化你的Flutter app吧

9,953 阅读5分钟

开头

在日常的flutter开发中,你是否遇到过卡顿、掉帧的情况?虽然Flutter目前在构建精美UI的表现上十分出色,但也架不住糟糕的使用方式呀

001

不过,当你明显感受到了卡顿的情况,要如何去追本溯源,查明卡顿的真相呢?这时候,DevTools就会成为你排忧解难的最佳助手。

介绍

DevTools是Dart和Flutter的一套性能测试与bug调试的工具。它目前还处于预览版,但是正在积极的开发中。

使用DevTools你可以做到以下事情:

  • 检查Flutter app的UI布局与状态
  • 在Flutter app中诊断UI卡顿的性能问题
  • 对Flutter或dart的命令行应用进行源码级的调试
  • 在Flutter或Dart的命令行应用中调试内存问题
  • 查看运行中的Flutter或Dart命令行应用的常规日志和诊断信息。

下面,我将会结合我的Flutter项目,来对DevTools进行一个简洁并且带有用例的使用说明

载入DevTools

根据你所使用的编译器的不痛,Devtools的打开方式也略有差别

在AndroidStudio中打开

在AndroidStudio中,打开DevTools的地方在这里

002

在VSCode中打开

在VSCode中,打开DevTools的步骤如下:

首先,运行 Debug > Start Debugging

image

之后搜索devtools

image

然后打开

在命令行中打开

首先需要保证你的flutter的环境变量都配置妥善

在项目目录下,命令行输入:

flutter pub global run devtools

之后你会看到如下输出:

Serving DevTools at http://127.0.0.1.9100

然后在另外一个命令行中运行

flutter run

你会看到如下内容

005

将图中圈中部分填入以下输入框

006

然后点击“Connect”即可。

使用DevTools

DevTools在网页中打开后,整体如下

image

接下来,就开始依次介绍DevTools的各个功能了

Flutter Inspector

Flutter检查工具中包含以下内容

image

Select Widget Mode 005

开启这个模式,你可以精确的定位到所选控件在 WidgetTree 中的位置

009

Refresh Tree 005

可以用来刷新Widget树的信息

010

Performance Overlay 005

用于切换GPU和CPU线程的性能图表展示(建议在真机的release模式下测试)

011

Slow Animations 005

将所有的动画效果放慢

012

Debug Paint 005

向rendering对象添加可视调试提示,去展示它的padding、alignment、spacers以及borders

013

Paint Baselines 005

为每个RenderBox的文本绘制一条可显示的基准线

014

Repaint Rainbow 005

当Widget被重绘时,包裹它的颜色会变化

Debug Mode Banner 005

用于去除debug模式下,右上角的“debug”横幅

016

Platorm:Android/iOS

用于切换app在两个平台上的不同表现,比如

017

关于Flutter Inspector的内容大致就是如此,下面是TimeLine的介绍

TimeLine

TimeLine用来展示Flutter的帧信息,主要由三个部分组成

  • 帧渲染图表
  • 帧事件图表
  • CPU分析

因为Flutter的debug模式并不能准确的展示出flutter的实际渲染效果,所以这里建议使用真机+profile模式来进行测试

代码:

flutter run --profile

不过如果是想知道造成flutter掉帧、卡顿的原因,使用模拟器+debug也可以,因为渲染的过程都是一样的 005

018

图中,柱状图表示当前渲染帧所消耗的时间,正常的渲染应该小于16ms每帧,图中大部分柱状图都是红色,表示渲染耗时偏高。只有一个点是蓝色的,表示符合渲染要求。

因为是debug模式,所以以上帧率的数据不能作为实际结果,但是如果想检测某些实际的卡顿情况,进入帧详情图表查看也是没问题的,在最后的优化部分会详细进行介绍。

Memory

用于观察和分析app的内存使用情况,也建议在真机+profile模式下进行测试

019

在官方文档中,对上图中的各个部分有着详细的说明

image

通过Memory工具,可以直观的帮你分析内存使用情况,这样,诸如内存泄露的问题都能够很明显的观察到。

Performance

用于记录并且分析一段app操作的CPU信息等

020

Debugger

用于调试app,因为是非常基础的功能,关于调试这一块就不多赘述了

image

Logging

用于展示Dart运行时来自框架级(比如Flutter)和应用级的事件日志

021

上面的这些工具不一定要在网页中打开,比如通过android studio的运行按钮去编译项目的话,也可以很方便的使用这些工具

image

那么,接下来就是有关优化的部分了

优化

上面关于DevTools的使用有了一个简要的介绍,那么实际应用中应该如何去优化你的app呢?

下面展示一个简单的例子

我们可以通过google提供的skia的debugger工具来测试你的app渲染情况。

首先在命令行运行:

flutter run --profile --trace-skia

如果没有真机,就去掉"--profile"

image

记录下地址

然后,新开一个命令行窗口,运行:

flutter screenshot --type=skia --observatory-uri=http://127.0.0.1:59403/1OQax7zfd7A=/

image

接下来,项目根目录就生成了 skp 文件

image

接下来,我们就可以使用google提供的skia debugger 工具来进行检测了

打开 debugger.skia.org/ 地址

导入skp文件

image

然后你就可以看到每一帧的绘制情况

026

根据这些情况,可以明显的看到布局中是否有渲染顺序不合理的地方,如果有的话就可以针对这些布局进行调整(ps:上面的例子中没有举出反面例子,同时在部分真机,如魅族16x上无法正常运行生成skp文件的命令)

关于优化的方面,从WidgetTree的绘制过程去入手。可以通过减少频繁的全局刷新,降低build次数;以及合理的使用 RepaintBoundary 去分隔布局,从而降低Paint的范围以达到优化目的。

详情可以去观看附录中的视频地址,相信会对你有很大帮助;

附录

参考:

深入了解 Flutter 的高性能图形渲染

Flutter 的性能测试和理论

不能科学上网的小伙伴可以去B站观看:

(B站)Flutter 的性能测试和理论

(B站)深入了解 Flutter 的高性能图形渲染

项目地址

文章中所使用的的Flutter项目地址如下:

flutter-todos