Flutter Tools的调试

前言

flutter tools中集成了不少强大的命令,好比:java

  • flutter create: 建立app、module、plugin、package
  • flutter build: 构建apk、aar等
  • flutter run: 运行 要想弄清楚各类命令背后的原理,一方面能够看静态代码,另外一方面则是动态调试。

导入flutter tools源码

咱们知道flutter tools是用dart实现的,其源码位于path/to/flutter/packages/flutter_tools。 用Android Studio打开该项目。web

设置断点

不少程序的调试原理都相似,都是经过在启动对应的程序时,传入一些调试相关的参数,让对应的进程启动后进行等待,等到Debugger进程attach到该进程后继续运行。安全

Flutter Tools本质上是一个dart程序,它的调试是Dart虚拟机支持的。bash

具体到Android Studio上,有两种配置方式:app

  1. Dart Command Line App
  2. Dart Remote Debug

Dart Command Line App

这一种比较简单,新建一个Dart Command Line App的Configuration。socket

Edit Configurations -》New -》 Dart Command Line App。若是所示:ui

Dart file指向flutter_tools.dart,这是入口文件。 Programma arguments填上要运行的命令,好比 create flutter_app. 而后在其中的main方法上添加断点,而后点击调试按钮,如图所示url

接下来程序会在断点处停下来,如图所示

能够看到args正是咱们设置的参数。

Dart Remote Debug

新建一个Configuration。 Edit Configurations -》New -》 Dart Remote Debug -》 输入Host为127.0.0.1,端口号为12345,若是所示:spa

IDE中提示咱们使用 --enable-vm-service:12345 --pause_isolates_on_start来启动dart虚拟机。这两个参数是告诉Dart虚拟机开启调试端口12345,并在启动后暂停等待。 咱们能够经过设置 FLUTTER_TOOL_ARGS环境变量来设置参数

export FLUTTER_TOOL_ARGS="--enable-vm-service:12345 --pause_isolates_on_start"
复制代码

而后运行flutter命令.net

flutter create flutter_app
复制代码

此时会输出以下信息:

Observatory listening on http://127.0.0.1:12345/-7kH8m0Z5Ys=/
复制代码

一样设好断点,而后点击调试按钮,结果却发现attach不上,错误信息如图所示

Failed to connect to the VM observatory service: java.io.IOException: Failed to connect: ws://127.0.0.1:12345/ws
Caused by: de.roderick.weberknecht.WebSocketException: error while creating socket to ws://127.0.0.1:12345/ws
Caused by: java.net.ConnectException: Connection refused (Connection refused)
复制代码

发现url对不上,Dart虚拟机等待的url后面多了个-7kH8m0Z5Ys= 通过查资料,发现这是一种认证码,是为了安全缘由,防止应用被远程调试。能够经过参数--disable-service-auth-codes进行关闭。

export FLUTTER_TOOL_ARGS="--enable-vm-service:12345 --pause_isolates_on_start --disable-service-auth-codes"
复制代码

而后从新运行flutter create flutter_app命令,此次成功了,如图所示

除了经过FLUTTER_TOOL_ARGS环境变量,还能够直接运行dart命令。

dart --enable-vm-service:12345 --pause_isolates_on_start --disable-service-auth-codes /Users/szw/dev_tools/flutter/packages/flutter_tools/bin/flutter_tools.dart create flutter_app
复制代码

其实FLUTTER_TOOL_ARGS也是flutter命令传给dart的。 flutter脚本的路径为flutter/bin/flutter,其中的最后一行就是

"$DART" --packages="$FLUTTER_TOOLS_DIR/.packages" $FLUTTER_TOOL_ARGS "$SNAPSHOT_PATH" "$@"
复制代码

总结

本文提到的方法不止适用于flutter tools,也适用于其余的dart应用。另外其余语言的调试基本也都相似,你们能够触类旁通。

相关文章
相关标签/搜索