0
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 Android アプリに hot reload 命令を送るメモ(2020 年 1 月 14 日時点)

Last updated at Posted at 2020-01-14

背景

Termux + Flutter + dart ffi で .so リロード対応し Android C/C++ + GUI アプリ開発を効率化するメモ
https://qiita.com/syoyo/items/21ba3174fe5a668f2960

などで, 特定のファイルで変更があったときに Flutter に hot reload 命令を送りたい.
(VSCode では, .dart ファイルが変更されたときだけ reload)

方法

flutter run --machine

で Flutter アプリを起動します.
これにより, stdin/stdout で JSON-RPC で通信できます.

appId は event message(stdout への出力)で取得できます.

[{"method":"app.restart", "id": 0, "params" : { "appId" : "e0c12cae-e4f3-47a9-8447-2b250bcc4af9", "fullRestart": true}}]

というメッセージを stdin(or /proc/<pid>/fd/0)に書き込むと hot reload できるはずです.

id は JSON-RPC の id なので, 任意の番号を指定します.

赤い画面になったら再度 flutter run が必要

赤い画面の致命的なエラーがでたら, app.restart 命令は fullRestart を true にしてもアプリは再起動しません. 再度 flutter run --machine する必要があります.

flutter attach は使えない

たとえば VSCode で実行しておいて, 外部プログラムでリロードの命令を送りたいですよね.

しかし, flutter attach では, app.restart 命令が使えません. JSON-RPC で命令を送ると NoSuchMethodError が帰ってきます.

したがって, flutter run する以外に方法がありません.

VSCode と連携したいが...

VSCode の dart extension では, pid や appId を出してくれません.
pid と appId がわかれば, 外部から /proc/<pid>/fd/0 で命令を送れるはずですが... なんらかのオプションで情報だしてくれるかもですが, ソースコードの改変が必要になるかもです.

現状使いにくい...

flutter run では, stdin/stdout で入力と出力を受け付けます. http などはないっぽそうです.
(--overvatory-port は, デバッグやプロファイリング用で, app.restart メソッドは使えない)

python などスクリプトを使って, popen などと組み合わせないとめんどいです.
(Linux/macOS だったら socat でソケットと stdin/stdout を繋ぐというてもあるかも?)

いずれにせよ処理を自動化するには stdout をパースしたりとめんどいで, 使いにくいです.

なんとか VSCode と連携したい...

ファイル変更があったときに vscode のコマンドを実行できる

あたりと連携するか, VSCode Dart extension を拡張することになるでしょうか...

dart.previewHotReloadOnSaveWatcher

何かしらダミーの .dart ファイルを作っておき, Dart flutter extension v3.7.0 以降で dart.previewHotReloadOnSaveWatcher を true にする方法が考えられます.

このフラッグが true ですと, (VSCode の?)file watcher で変更を検知しますので, VSCode の外で .dart ファイルを編集した場合でも hot reload が実行されます! :tada: :tada:
(2019 年 11 月 15 日とフラッグ追加は最近ですね)

最近の VSCode ですと File -> Preferences -> Setting -> Extensions で Dart: Preview Hot Reload On Save Watcher に GUI でチェックをいれるだけなので楽ですね.

参考

VSCode dart extension(Flutter の機能は dart plugin に入っていて, Flutter repo は実質空です).

TODO

  • VSCode dart extension を改造して, pid, appId を抜き出したり, 特定のフォルダ or file の watch ができるようにする.
    • .so など, 非 .dart ファイルが変更されたときは, カスタムの shell コマンドを実行できるようにする
0
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
0
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?