flutter tools中集成了不少强大的命令,好比:java
咱们知道flutter tools是用dart实现的,其源码位于path/to/flutter/packages/flutter_tools。 用Android Studio打开该项目。web
不少程序的调试原理都相似,都是经过在启动对应的程序时,传入一些调试相关的参数,让对应的进程启动后进行等待,等到Debugger进程attach到该进程后继续运行。安全
Flutter Tools本质上是一个dart程序,它的调试是Dart虚拟机支持的。bash
具体到Android Studio上,有两种配置方式: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
新建一个Configuration。 Edit Configurations -》New -》 Dart Remote Debug -》 输入Host为127.0.0.1,端口号为12345,若是所示:spa
--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应用。另外其余语言的调试基本也都相似,你们能够触类旁通。