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

相關文章
相關標籤/搜索