Flutter应用如何调试--DevTools介绍(下)

Flutter应用如何调试–DevTools介绍(上)
Flutter应用如何调试–DevTools介绍(中)
Flutter应用如何调试–DevTools介绍(下)

接着上篇,本篇进行一下的介绍

  • Performance
  • Debugger
  • Network
  • Logging

Performance

性能视图可以记录并分析 Flutter 和 Dart 应用的性能,以帮助我们找到应用程序的性能瓶颈。初始进来页面是空的,单击 Record 开始进行记录 CPU 信息,完成后点击 Stop 停止记录,CPU分析器会把收集的信息推送到VM并分别在不同的信息窗口进行展示调用树 (Call Tree, Bottom Up, and Flame Chart),这里的采集也分低、中、高三个类型的粒度,在DevTools介绍(二中)已经有介绍。

Flame Chart 火焰图表
火焰图选项卡主要用于显示一段持续时间内 CPU 的样本信息。图表展示的是自上而下的调用堆栈信息,即上面的堆栈帧调用下面的堆栈帧。每一个堆栈帧的宽度代表 CPU 执行的时长。栈帧消耗 CPU 的时间越长,就越洽有可能是我们进行性能改进的好地方。
Call Tree 调用树(也叫跟踪树)
调用树视图是一种自上而下展示 CPU 中的调用堆栈信息方法。在下图中的表格中可以看出,展开其中的一个方法可以查看它所有的调用者。
Bottom Up
ottom Up视图也是用于显示方法调用堆栈,但顾名思义,它是一个自下而上的表示方式。这意味着表格中的每个最上方的方法实际上是给定 CPU 样本的调用堆栈中的最后一个方法 (换句话说,这是样本的叶节点)。

DevTools中的Performance中我并没有看出可以指导代码进行优化的地方,并且devTools的Performance工具运行在Profilr模式下,但是在dubug模式下的Android Stdio右侧的Flutter Performance中,找到了一些可以帮助调试信息,即Track widget rebuilds,这在Profilr模式下反而不能用,因为DevTools还是beta版本本,可能一些功能还不完善。

Widget rebuild.png

在这里我们可以看到哪些widget进行了多少次构建,右边第二列显示了所在框架的重载次数。如果重载次数过多,会显示一个黄色旋转圆圈。最右一列显示了进入当前页面后 widget 的重载次数。对于未重载的小部件,将显示一个灰色圆圈,否则将显示一个灰色旋转圆圈。
该工具可以帮助你调试至少四个常见的性能问题:

整个屏幕(或大部分屏幕)由一个 StatefulWidget 构成,导致不必要的 UI 构建。可将 UI 拆分成多个具有较轻量 build() 方法的 widget。
未在屏幕上显示的 widget 发生了重载。例如,一个延伸到屏幕外的 ListView,或者未给延伸到屏幕外的列表设置 RepaintBoundary,会导致重绘整个列表。
AnimatedBuilder 的 build() 方法绘制了一个不需要动画的子树,导致不必要的静态对象重载。
一个 Opacity widget 在 widget tree 中使用了一个不必要的高度,或者通过直接操作 Opacity widget 的透明属性创建 Opacity 动画,导致 widget 和它的子树重载。

关于性能优化部分,之后会再写一篇文章专门谈Flutter的性能优化。
这里简单介绍一下,如何找出影响Flutter性能的最大问题,即saveLayer()的过多调用。调用 saveLayer() 会开辟一片离屏缓冲区。将内容绘制到离屏缓冲区可能会触发渲染目标切换,这些切换在较早期的 GPU 中特别慢。
我们可以在MaterialApp中属性设置

showPerformanceOverlay: true, 
// 检查场景是否使用了 saveLayer,使用了saveLayer的图像轮廓会随着页面刷新而闪烁
checkerboardOffscreenLayers: true,  
// 做了缓存的静态图像图片在刷新页面使不会改变棋盘格的颜色;如果棋盘格颜色变了,说明被重新缓存,这是我们要避免的
checkerboardRasterCacheImages: true,    

Debugger

debug看见名字就能知道是运行在debug模式下,这里可以进行断点调试,对于命令行开发来说是一个便捷的调试工具


debug.png

除了使用命令行工具开发以外,还是建议使用IDE进行调试,功能更强大一些,这里就不做过多介绍。
值得补充一点的是,在Android studio中,运行和debug调试是两种构建方式,如果当前是在Run运行状态,不想切换到debug模式,这时候又想进行调试的话,可以添加如下代码进行断点,在Devtools中查看。

import 'dart:developer' as developer;

developer.debugger(when: index == 5);

Network

网络视图使您可以从Dart或Flutter应用程序检查HTTP网络流量。
可以检查有关请求的常规信息,以及响应和请求标头,其余作用有限。


network.png

Logging

日志视图展示 Dart 运行时和应用框架(比如 Flutter)的事件,以及应用级日志。

  • 默认情况下,日志视图会展示:
  • Dart 运行时的垃圾回收事件
  • Flutter 框架事件,比如创建帧的事件
  • Flutter framework events, like frame creation events
  • 应用的 stdout 和 stderr 输出
  • 应用的自定义日志事件

logging信息经过调研,我个人还没太明白其作用,因为自动输出的log信息太多,里面又全是看不太明白的信息

{
  "type": "Event",
  "kind": "Extension",
  "extensionKind": "Flutter.RebuiltWidgets",
  "isolate": {
    "type": "@Isolate",
    "id": "isolates/3650949643688903",
    "name": "main",
    "number": "3650949643688903"
  },
  "timestamp": 1596348786926,
  "extensionData": {
    "startTime": 1248147575,
    "events": []
  }
}

当然我们可以自定义log,进行输出,帮助我们排查信息,在官方文档中以编程的方式调试应用部分有一点介绍,内容有限。
我们可以直接使用stdout 和 stderr输出信息

 stdout.writeln('test1111');

也可以通过developer方式输出

import 'dart:convert';
import 'dart:developer' as developer;

void main() {
  var myCustomObject = ...;

  developer.log(
    'log me',
    name: 'my.app.category',
    error: jsonEncode(myCustomObject),
  );
}

对应的logging里面则会记录


logging.png

其他

介绍到这里DevTools的使用基本结束,本文主要基于Android Studio工具进行讲解,当然也可以通过编程的方式进行,添加输出代码的方式调试 Flutter 应用

此外这里有一篇文章介绍devtools是如何工作的,以及Google Flutter团队的视频Flutter Inspector (DartConf 2018
来自谷歌开发者的介绍我们用 Flutter 写了一套全新的 Flutter 开发者工具

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容