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

Flutter应用如何调试–DevTools介绍(上)
Flutter应用如何调试–DevTools介绍(中)
Flutter应用如何调试–DevTools介绍(下)
Dart DevTools主要有7个工具,其中Flutter inspectorDebugger只能在debug模式下查看,Timeline、Memory、Performance更倾向于在Profile模式下使用,Network、Logging则无模式要求,下面将对它们进行详细介绍,如有疏漏或者错误,欢迎与我联系交流。

  • Flutter inspector
  • Timeline
  • Memory
  • Performance
  • Debugger
  • Network
  • Logging

1、Flutter inspector工具

简介:inspector是用于可视化和浏览Flutter小部件树的强大工具,用来可视化和浏览Flutter widget trees,以便:

  • 了解现有布局
  • 诊断布局问题
    Flutter inspector运行在debug模式下。


    inspector.png

除了在网页上查看,Flutter inspector还可以在Android Studio的右侧区域进行插查看


inspector1.png

两者本质上没有太大区别,IDE中多了一个查看Render Tree的入口,网页上则可以对布局进行调试,并且视图窗口更大,除此之外没有太大区别。

Select Widget Mode

我们开发Flutter应用,知道Widget的设计理念是组合大于继承,一层层的Widget嵌套,使得排查Flutter widget trees的时候,也往往受制于嵌套,有了inspector工具可以使得我们一步即可找到widget trees的对应节点。勾选中途中红色的第一个控件Select Widget Mode,我们可以再手机屏幕上选中想要查看的组件,或者选中widget trees中的节点,然后就是令人激动的功能:手机屏幕中、代码中、DevTools中,相应的地方也都会自动同步,方便我们定位问题,在Detail Tree中我们还可以看到选中widget的详细属性。

inspector3.jpeg

inspsctor4.png

另一个令人激动的点是,我们可以不用修改代码就可以对布局进行调整,这就是动态调试Layout Explorer,可以改变主轴方向,flex权重等属性。
inspector2.gif

Slow Animation

当我们调试动画的时候,会希望动画慢点播放,就像iOS模拟器支持的Slow Animation一样,inspector工具的Slow Animation也支持将动画速度放慢5倍,如过希望自定义的话可以通过编码的方式,设置timeDilation属性,最多支持1到50倍慢放。

其它选项
  • Refresh Tree可以刷新当前widget信息
  • Debug Paint在页面上添加一些调试样式,以显示边框,填充,对齐和间隔,如下图
  • Paint Baselines则会使每个RenderBox在其每个文本基线处绘制一条线。
  • Repaint Rainbow重绘时在图层上显示旋转颜色。
  • Debug Banner即使运行调试版本,也可以切换调试标语的显示。
    inspector5.jpeg

2、Timeline工具

Timeline需要在profile模式下运行,否则不能准确地统计APP真是的性能。


timeline.png

首先对上面四个按钮进行介绍:
Refesh,滑动手机APP,然后点击refresh,则会在下方显示刚才一段时间内的帧图(图中柱状部分)和火焰图(图中中间区域)。
Profile granularity也叫分析粒度,默认样本室250微妙采样一次,即medium,采样率低中高分别对应抽样率低、中、高粒度分别顺序对应 1/50μs、1/250μs 和 1/1000μs,正确的设置此粒度对性能分析非常总要,高粒度 的配置会具有更高的采样率,采集信息更多,甚至于VM被中断以收集采集样本,导致性能下降。
Performance Overlay即性能图层,选中之后会在APP上显示两张图标显示性能信息

performance-overlay.jpeg

如图所示,最顶部的图形表示 raster 线程所花费的时间,底部的图表显示了 UI 线程所花费的时间。纵轴表示每一帧花费时间,而横轴则表示帧。只有当你的应用绘制时这个图表才会更新,所以如果它空闲的话,图表就不会动。图中的绿色竖条表示当前帧,为绿色表示性能良好,为红色则表示出现了卡顿,如果是在 UI 图表出现了红色竖条,则表明 Dart 代码消耗了大量资源。而如果红色竖条是在 GPU 图表出现的,意味着场景太复杂导致无法快速渲染。

Flutter线程

这里对Flutter的线程做简单说明,Flutter使用多个线程来完成其工作,尽管覆盖图中仅显示了两个线程。您所有的Dart代码都在UI线程上运行。尽管您没有直接访问任何其他线程的权限,但是您对UI线程的操作会对其他线程产生性能影响。

  • Platform thread 也叫平台线程,plugin的代码将会运行在这里,对应Android和iOS的主线程MainThread
  • UI thread UI 线程在 Dart VM 中执行 Dart 代码。该线程包括开发者写下的代码和 Flutter 框架根据应用行为生成的代码。当应用创建和展示场景的时候,UI 线程首先建立一个 图层树(layer tree) ,一个包含设备无关的渲染命令的轻量对象,并将图层树发送到 GPU 线程来渲染到设备上。 不要阻塞这个线程! 在性能图层的最低栏展示该线程。
  • Raster thread(以前叫 GPU 线程),中文名字叫光栅线程或者栅格线程,raster 线程拿到 layer tree,并将它交给 GPU(图形处理单元)。你无法直接与 GPU 线程或其数据通信,但如果该线程变慢,一定是开发者 Dart 代码中的某处导致的。图形库 Skia 在该线程运行,并在性能图层的最顶栏显示该线程。这个线程之前被叫做 “GPU 线程”,因为它为 GPU 进行栅格化,但我们重新将它命名为 “raster 线程”,这是因为许多开发者错误的(但是能理解)认为该线程运行在 GPU 单元。
  • I/O thread执行昂贵的操作(常见的有 I/O)以避免阻塞 UI 或者 raster 线程。这个线程将不会显示在 performance overlay 上。

除此之外我们分析Flutter APP的时候,应该在真机上,并且最好用性能较差的机型去多次分析。在分析性能的时候,不应只局限于当前设备运行流畅。

  • 将帧渲染时间降低到 16ms 以下可能在视觉上看不出来什么变化,但可以延长电池寿命以及避免发热问题。
  • 可能在你当前测试设备上运行良好,但请考虑在应用所支持的最低端设备上的情况。
  • 当 120fps 的设备普及之后,便需要在 8ms 之内完成每一帧的渲染来保证流畅平滑的体验。

好了基本概念介绍完了,我们继续介绍Timeline的使用
帧图中的每一个竖条都是可以点击的,点击周后,下面的火焰图相应的帧也会随之选中,在火焰图中我们可以分析UI线程和Raster线程,可以对其进行单指上下左右滑动,也可以双指进行放大缩小。
Track Widget BuildsTimeline中的最后一个按钮,这个按钮选中的时候,可以在火焰图中的UI帧中看到具体是用户写的哪一个widget,如果这个widget占用时间过多的话,我们就可以针对行的进行优化,如上面的图中所示KnowlwdgeCellWidget的创建花了4.5ms,点击选中它,在视图的地步还会显示CPU Flame ChartCall TreeBottom Up这里先不做介绍,会在Performance进行讲述。

Memory

内存分析可以帮助我们查看在某一时刻内存使用情况,能够具体到某个类使用了多少内存,主动触发垃圾回收等。

memory.png

默认进来的时候只有图中蓝色的区域,点击Android Menory也会显示,
当鼠标点击图标的时,会显示一个浮动窗口,显示内存使用具体数值。

Snapshot单击Snapshot按钮,会显示当前内存对象表。可以按类名称,大小,分配的实例等对内存对象进行排序。还可以点击右侧进行搜索。
如图中,选中了d_stack进行分析,右侧是d_stack框架中Flutter侧的,DStack类占用的内存,甚至可以看到内存中存储了哪些数据。
我们可以在Search直接搜索想要查看的类,方便快速查找。

除了看数据列表,我们还可以以堆栈视图的方式查看内存分布,当我们选中Heat Map开关的时候,下面会呈现内存视图,下面区域是上面的总和,鼠标放在某一个块中,当前块会展开为更细粒度的使用情况,如下图

堆栈1.png

也可以对堆栈信息进行搜索,方便快速查看
堆栈.png

受限于篇幅,本篇就介绍到这里,剩下的

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

推荐阅读更多精彩内容