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應用。另外其餘語言的調試基本也都相似,你們能夠觸類旁通。