4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Flutter Daemonツールを利用したアプリ操作方法

Last updated at Posted at 2020-02-19

はじめに

Flutter Daemonという機能 (ツール) がありましたので、紹介したいと思います。

Flutter Daemonとは?

Flutter は通常 Flutter SDK で提供されるコマンド群でビルドや各デバイスへのインストールなどが行われます。

一番よく使うのはアプリ実行のために利用する$ flutter runコマンドですね。この flutter コマンドからターゲットデバイスの Android や iOS などに対して、adb や Xcodeのプロトコルで繋がった通信経路の中で Flutter Engine と Host PC の Flutter SDK との間でやり取りを行っています (ここのプロトコルも後々調べたい) 。

Flutter SDK は外部から操作可能なツール (I/F) をFlutter Daemonとしてユーザ (開発者) に提供しています。Flutter Daemonを利用すると、ユーザの操作でホットリロードやアプリの終了、開始、インストール等が行えます。複数デバイスを同時に操作するときには便利そうです。

VSCodeのFlutterプラグインはこの機能を利用している?

ソースコード

ソースコードはpackages/flutter_tools/lib/src/commands/daemon.dartです。

プロトコル

提供される入出力はstdin/stdoutのみで、フォーマットはJSON-RPCです。httpとかは無さそうなので、必要なら自分でブリッジを作る必要がありそうです。

使い方

Flutter Daemonを立ち上げるには以下のコマンドを実行します。

$ flutter daemon
Starting device daemon...
[{"event":"daemon.connected","params":{"version":"0.5.3","pid":4365}}]

操作方法は、JSON-RPCをターミナルに直接入力するか、Linux環境であればstdin ( /proc/${pid}/fd/0 )に入力でも出来ます。

まずはdaemon.versionでFlutter Daemonのバージョン情報を取得してみます。
idはクライアント側が自由に決められる番号です。サーバー側はクラアントへそのidを添えてリプライを返してきます。

$ [{"method":"daemon.version","id":2}]
[{"id":2,"result":"0.5.3"}]

アプリの実行や各種操作するにはappIdが必要なので、認識しているデバイスを取得してみると

$ [{"method":"device.getDevices","id":2}]
[{"id":2,"result":[]}]

????

何も返してくれません。appIdが必要なのですが…。

仕方がないので適当なappIdで試してみます。

$ [{"event":"app.start","params":{"appId":"53ee146d-ca2a-4886-ad3a-1291cb52e25c","deviceId":"macOS","directory":"/Users/kurun/workspace/flutter-app","supportsRestart":true,"launchMode":"run"},"id":2}]
[{"id":2,"error":"unexpected response with id: 2","trace":"#0      Daemon._handleRequest (package:flutter_tools/src/commands/daemon.dart:168:11)\n#1      _rootRunUnary
 〜 略

うまくいきません。

諦めます。

その他の使い方はFlutter Daemonを参照してください。

他の方法

アプリ実行後にそのままデーモンを立ち上げ続ける方法があるので、こちらを利用します。

% flutter run --machine

この状態からソースコードを変更して、ホットリロードするには以下のようにapp.restartを実行します。
appIdは上記コマンド実行時のログに表示されているappIdを指定します。

[{"method":"app.restart", "id":2, "params":{"appId":"189f0050-4f0a-4357-b0d8-72653cdbe698", "fullRestart":true}}]

ホットリロード出来ました!

参考↓

上記コマンド実行後のログ
[{"event":"app.progress","params":{"appId":"189f0050-4f0a-4357-b0d8-72653cdbe698","id":"2","progressId":"hot.restart","message":"Performing hot restart..."}}]
[{"event":"app.progress","params":{"appId":"189f0050-4f0a-4357-b0d8-72653cdbe698","id":"3","progressId":null,"message":"Syncing files to device macOS..."}}]
[{"event":"app.progress","params":{"appId":"189f0050-4f0a-4357-b0d8-72653cdbe698","id":"3","progressId":null,"finished":true}}]
[{"event":"app.progress","params":{"appId":"189f0050-4f0a-4357-b0d8-72653cdbe698","id":"2","progressId":"hot.restart","finished":true}}]
Restarted application in 852ms.
[{"id":2,"result":{"code":0,"message":""}}
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?