要点:
1. はじめに1.1 ホットリロードとは何ですか?ホット リロードは N 年前に使用されていたため、JS に精通している学生はそれを嘲笑するかもしれませんが、クライアント開発者にとっては、これは単純に朗報です。 まず、Flutter の公式定義を見てみましょう。
簡単に言えば、変更されたソース コード ファイルを実行中の Dart 仮想マシンに挿入することで実現されます。注入後、Flutter はウィジェット ツリーを自動的に再構築します。 1.2 ホットリロードが必要なのはなぜですか?焼畑農業の時代には、プログラマーは次のように開発とデバッグを行っていました。 プロジェクトが小さく、人数も少ない場合、図は非常に調和がとれており、効率は間違いなく高くなります。しかし現実には、大企業ではプロジェクトが大規模であることが多く、コンパイルが非常に遅く、開発者の数が多く、プロセスシステムが非常に厳格であるため、問題がないように見える開発およびデバッグプロセスが非常に苦痛になり、個人の効率が低下します。ここで強調したいのは、それが個人の効率性を指しているということです。個人的には、プロセスシステムが完璧になればなるほど、個人に対する制約が強くなると考えています。しかし、チームの観点から効率性を見ると、1+1 は 2 より大きくなければなりません。 現時点での雰囲気はこんな感じです。
ホット リロードを使用すると、開発とデバッグは次のようになります。 雰囲気は次のようになります。
1.3 疑問を投げかけるホット リロードの定義については、多くの人が私と同じ疑問を抱いています。
同時に、ホット リロードを日常的に使用すると、多くの疑問に遭遇するでしょう。
インターネットでホットリロードに関する記事をたくさん読んだ後、次のような追加の疑問が生じます。
心配しないでください。この記事では上記の質問に一つずつ答えていきます。 2. ダーツのホットリロードFlutter は開発言語として Dart を使用しているため、まずは Dart の観点からホット リロードを検証します。 2.1 検証デモを書くdart は実行後に現在のプロセスを閉じることを考慮して、プロセスの存続を保証し、ホット リロードの効果を確認するためのタイマーを作成しました。 2.2 VMServiceを有効にするターミナルで dart --enable-vm-service main.dart を実行します。ここで、main.dart は 2.1 のコード ファイルです。 ターミナルに「Hello JDFlutter」という文字が連続して出力されることがわかります。 2.3 ホットリロードの実行main.dart ファイルの印刷ログを「Hello JD」に変更し、次のようにターミナルで Observatory リンク アドレス出力を開きます。 main.dart の Isolate (読者はこれを単に dart のスレッドとして理解できますが、Isolate には共有メモリがありません)、図の赤い円を見つけて、Reload Source と入力して見つけます。 「ソースの再読み込み」をクリックすると、ターミナルは「Hello JD」という文字の出力を開始し、以下に示すようにホット リロード プロセスが完了します。 2.4 自動ホットリロード上記の例をベースにして、ファイル監視を追加し、vm_service にメッセージを送信してホット リロードを実装します。コードは次のとおりです。 dart --enable-vm-service main.dart を直接実行し、「Hello JDFlutter」を「Hello JD」に変更します。実行結果は次のとおりです。 自動ホットリロードが正常に実装されたことがわかります。上記のコードが Dart 仮想マシンと通信する手順は次のとおりです。
2.5 Dart仮想マシンでできることこの時点で、自分自身を手放すことができます。 Dart サービスは、ブレークポイント、仮想マシンのステータスの取得、パフォーマンス、その他のプロトコルなど、多数の外部プロトコルを提供します。参照できるもの: Dart 仮想マシン サービス インターフェース。 3. FlutterのホットリロードFlutter のホット リロードは、本質的には dart のホット リロードをカプセル化し、さまざまなデバイスでインストールと読み込みのプロセスを開始します。次に、Flutter ソースコードの世界に飛び込む準備をしましょう。以下の分析は、v1.22.5 ブランチのソース コードに基づいています。 諺にあるように、仕事をうまくやり遂げたいなら、まず道具を研がなければなりません。ソースコード内を長時間飛び回っていると、簡単に道に迷ってしまいます。キーメソッドを見ると、それがコードの実際のケースであるかどうかはわかりません。自分のアイデアを検証できる必要があります。最も簡単な方法は、ポイントを分解して、ターゲットを絞ってソースコードを調べることです。 3.1 IDEブレークポイントFlutter ソースコードのダウンロードも非常に簡単です。ここでは詳細には触れません。オンラインで検索できます。 Flutter ツールチェーンのソース コードは、packages/flutter_tools にあります。 この記事では、より使い慣れた Android Studio を使用してソースコードを構成および表示します。構成は次のとおりです。
設定後、ツール チェーンを使用して、指定した Flutter プロジェクトのソース コードを完全にデバッグできます。次の手順では、以下に示すように、デバイスを選択してデバッグ ボタンをクリックします。 3.2 全体的なプロセス以下は、Flutter ホット リロードのフロー チャートです。 要するに:
プロセス全体でアプリを再起動する必要がないため、効率的な開発とデバッグの結果が実現します。 3.3 ソースコード解析3.3.1 実行コマンドフローエントリポイントとして flutter run コマンドから分析します。このクラスは、packages/flutter_tools/lib/executable.dart の main() メソッドにあります。 run コマンドの最終的な実装クラスは、packages/flutter_tools/lib/src/commands/run.dart にあります。 RunCommand コンストラクターでは、ホット フラグがデフォルトでオンになっています。オフにする必要がある場合は、パラメータ --no-hot を追加します。 run コマンドの流れから、主なタスクはデフォルトパラメータ設定、パラメータ検証、フラッターデバイスの初期化、モード判定などであることがわかります。ホットリロードは HotRunner.run から開始されます。 3.3.2 ホットリロードプロセス - 最初の起動HotRunner では、プロセスは複雑ではありません。 ご覧のとおり、HotRunner は次の 3 つのことを行います。
2 番目のステップでは、さまざまなプラットフォームでさまざまなプラクティスを実行します。 iOS と Android の場合、それぞれ xcrun と adb に対応します。それはこの記事の焦点ではありませんし、そのプロセスは比較的長いです。詳しくは後ほどお話しします。私は最初のステップと3番目のステップに焦点を当てます。 コンパイルしてdillファイルを生成する 最後に、_compile メソッドが呼び出されます。コードが複雑すぎます。次のように直接分解してみましょう。 ブレークポイント情報から、dart ファイルがカーネル ファイル app.dill に変換されることがわかります。以下は、app.dill コンテンツの一部抜粋です。 app.dill は main.dart の内容を含む完全なコード ファイルであることがわかります。右側は main.dart ソース ファイル、左側は app.dill ファイルの内容です。 生成された app.dill は完全なコードです。次に、異なるデバイス (Android、iOS) 用のインストール パッケージをコンパイルし、指定されたパッケージを同時に実行します。 このときの app.dill を生成するプロセスを、仮に「コンパイル処理」と呼びます。増分ディルの後続のホット リロードも、このプロセスの生成を促進します。 機器を取り付ける 上記の 2 番目の手順では、デバイスがアプリの実行を開始すると、アプリ内で DartVM Observatory サービスが開きます。これは本質的に、カスタム jsonrpc2.0 プロトコルに従って通信する Websocket サービスです。アタッチすると、次に示すように URI を介してデバイス サービスに接続します。 DartVM サービスに接続すると、reloadSources、reloadMethod、hotRestart などのいくつかのホット リロード イベントが登録されます。これらのイベントはアプリ内の Dart 仮想マシンには登録されませんが、次の図に示すように、Flutter ツールの他のコマンドに提供されます。 同時に、DartVM サービスを使用して、デバイス内の Flutter 製品を初期化します。デバイス内の製品パスが一時的に生成され、XXX に置き換えられます。製品パスは次のとおりです。
具体的なコードは次のとおりです。 3.3.3 ホットリロードのトリガーソースコードの観点から何が行われたかを見てみましょう。 flutter run または flutter attachment を実行した後、開発者はターミナルに r と入力してリロード効果を体験できます。 Android Studio および VSCode の場合は、Ctrl+S または Cmd+S を押すだけです。 ソースコードエントリに対応: HotReload であっても HotRestart であっても、最終的には HotRunner.restart メソッドが呼び出されます。最後まで進むと、最終的に特定のデバイス更新メソッドに到達し、上記の「ホット リロード プロセス - 最初の起動」で _compile メソッドを再度呼び出して、コンパイル プロセスに増分 dill ファイル app.dill.incremental.dill を生成するように通知します。では、この増分ファイルとは一体何なのでしょうか?デモでは、文字列「Flutter Demo Home Page」を「Flutter Demo Home Page2」に変更し、dill ファイルの内容を確認します。 最初の写真は変更前、2 番目は変更後、3 番目は増分ディル コンテンツです。増分 dill ファイルには変更された dart ファイル コードのみが含まれていることがわかります。 増分ディルが生成されると、次に示すように、_DevFSHttpWriter を介してデバイスに書き込まれます。 増分ファイルを同期した後、DartVM に UI インターフェースを更新するように通知する必要があります。この手順は上記のセクション 2.4 と似ています。 vmService.reloadSources は最終的に、次のように dart 公式ライブラリである _call メソッドを呼び出します。 HotRestart と HotReload の違いFlutter は、HotReload と HotRestart という 2 つのクイック デバッグ方法を公式に提供しています。前者は部分的なリフレッシュが感じられず、最高のエクスペリエンスを提供しますが、欠点も明らかであり、適用範囲は比較的限られています。公式ウェブサイト HotReload に記載されている例を参照できます。以下のシナリオには適用されません。
HotRestart プロセスでは、HotReload プロセスと比較して、リソースのクリア操作が追加され、増分 dill ファイルが生成されなくなりました。変更ごとに完全な app.dill ファイルが生成されます。ここでは詳細は説明しません。興味のある読者はソース コードをデバッグして確認できます。 上記から、HotRestart は、非 UI アイソレートの強制終了や UI アイソレートのリセットなど、いくつかの追加処理を処理することがわかります。 デバイスに同期される dill ファイルの場所はデバイスによって異なります。
この時点で、ホット リロード ソース コードは終了です。一つ一つ紹介しきれないほどの技がたくさんあるので、ぜひ一度ご覧になってみてください。 IV.結論上記の調査の後、この記事で提起された最初のいくつかの疑問は解決されたはずです。これは Flutter ソースコードの氷山の一角にすぎません。さらに多くのソースコードを調査する必要があります。ソースコードを読むことで、多くのことが可能になります。
つまり、できることはたくさんあるので、ソースコードを見ることの重要性は非常に明らかです。
V. 参考文献
|
<<: 5G時代が加速しています。エッジ コンピューティングが「コア」コンピューティングに取って代わるのはいつでしょうか?
>>: ResearchAndMarkets: 世界のクラウド コンピューティング サービス業界は 2027 年に 3,131 億ドルに達する
Docker を使用すると、従来のアプリケーション リリース管理で発生する問題が本当に改善されるので...
コンテナ市場が進化するにつれて、考慮すべき 4 つの予測があります。 Docker テクノロジーは ...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています7月28日...
クラスター リソースが不足している場合、Cluster Autoscaler は新しいノードをプロビ...
月給5,000~50,000のこれらのプロジェクトはあなたの将来です10月19日、Tmallは201...
Suning.comは、6,600万ドルを投じて母子向け電子商取引大手のB2C Redbabyを買収...
中国国営ラジオ北京1月11日ニュース(記者張昭夫王希)中国国営ラジオの「ニュースパノラマ」の報道によ...
Racknerd は、新しい「3 日間フラッシュ セール」プロモーションを開始しました。これは、3T...
ウェブマスターの友人は Discuz をよくご存知だと思います。私たちが訪問するフォーラムのほとんど...
基本的なヒント: よく使用される参考資料とツールをリストするか、簡単な説明をいくつか追加します。この...
新しいドイツのクラウド サーバーの立ち上げを記念して、CloudSilk (Baisi Networ...
ウェブマスターは、「比較的」安価で、使いやすく、高速で安定した日本の VPS (日本のクラウド サー...
skystark.net は 2017 年に設立されたロシア企業で、オランダとロシアで独立サーバー ...
12月4日早朝の新浪科技報によると、最高人民法院は12月4日午前9時に第一法院で360とテンセント間...
4月26日、 IPF2018 Inspurクラウドデータセンターパートナーカンファレンスにおいて、I...