この記事では、主にDingTalkがFlutterをベースに構築したクロスクアッドターミナルアプリケーションフレームワーク(コード名Dutter)を紹介します。内容は主に、FlutterEngineレベルでのソリューション設計、ベストプラクティス、問題箇所などです。同様の要求を持つチームにとって、この記事が参考になれば幸いです。 プロジェクト概要1.1 ダッターとは何かDutter、または DingTalk Flutter は、DingTalk 内の Flutter 上に構築された、4 端末間の R&D フレームワークです。 Dutter プロジェクトは「Flutter から始まりましたが、Flutter 以上のものです」。このプロジェクトの主な目標は、Flutter のクロスプラットフォーム機能を活用して、ユーザーエクスペリエンスを犠牲にすることなく DingTalk のエンドサイド研究開発の効率を向上させ、それによって DingTalk エンドサイドの研究開発リソース不足や各エンドの人材の不均衡の問題を軽減することです。 1.2 現在の進捗状況現在、Dutter運営フレームワークは、DingTalkの4つの端末の統合を完了し、一連の共創事業のグレースケールおよびパイロットプロジェクトを完了しました。現在、DingTalk の Flutter ベースの研究開発事業には、「スケジュール サインイン」、「+ パネル」、およびいくつかの内部グレースケール事業が含まれます。 プロジェクトの背景私たちが Flutter を選択し、Dutter プロジェクトを開始した主な理由は次の 2 つです。
以下で簡単に説明します。 2.1 エンドサイド研究開発の効率化DingTalk が開発 7 年目を迎える中、クライアント側の「ビジネス ニーズ」、「R&D リソース」、「技術の進化」の間の矛盾はますます激しくなっています。
上記の点は、技術的な研究開発リソースが不足しているという 1 つの問題にまとめることができます。上記の問題を解決するには、2 つの方法があります。1. 技術チームの規模を拡大し続けること。2. チームの研究開発効率を向上させること。 DingTalk 側の現在のチーム規模が 150 人近くであることを考えると、全体の規模は小さくなく、これ以上の拡大は難しいでしょう。チームの規模を無制限に拡大することはできないため、R&D 効率の改善の余地を探る必要があります。
このことから、クロスプラットフォーム技術を活用して技術者同士が「1つのコードですべてをカバー」できるようにし、本来は複数のプラットフォームと複数の技術者を必要としていた作業を1~2人のクラスメートで統合できれば、研究開発の効率を大幅に向上できることがわかります。 2.2 FlutterテクノロジーのフォローアップDingTalk にはすでに「ミニプログラム」や「H5」などのクロスターミナルテクノロジーがあります。効率性を向上させる必要がある場合、既存のテクノロジースタックを直接使用して目標を達成できますか? DingTalk クライアント チームにとって、クロスプラットフォーム用の Web ベースのソリューションを選択することは理論的には可能ですが、実際には期待される結果を達成するのは困難です。主な理由は2つあります。
Flutter は近年開発されたクロスプラットフォーム技術です。Web エコシステムとは異なり、ネイティブのようなアーキテクチャ設計に基づいており、ダイナミクスを選択的に放棄し、クロスプラットフォームに重点を置いています。同様のネイティブ パフォーマンスとエクスペリエンスを確保しながら、開発者は「一度開発すれば、複数の端末でビルドして実行できる」ようになります。したがって、ミニプログラム技術と比較して、Flutter はエンドサイドの技術チームの悩みを解決するのに適しています。 さらに、国内のクロスプラットフォーム技術の予備調査を行った結果、Flutter をベースとしたクロスプラットフォーム プロジェクトには、後発の優位性が明らかで、上限が高く、開発の可能性が大きく、長期的な投資価値も高いことがわかりました。 当社が業界におけるクロスプラットフォーム ソリューションを長期にわたって追跡した結果、現段階では「自己描画エンジン」が話題になっており、「自己描画エンジン」ソリューションのほとんどは、Flutter プロジェクトがオープンソース化されて人気が出た後から開始されたことがわかりました。この時点でのこの一致は偶然ではありません。主流のクロスプラットフォーム ソリューションの技術的実装の違いを説明するために、次の図を使用します。 上の図から、クロスプラットフォーム ソリューション デザイナーにとって、Flutter プロジェクトの最大の価値は、エコシステム向けにオープンソースで、適切に設計され、互換性が高く、高性能で、明確に定義された自己描画エンジンを提供していることであることがわかります。 このオープンソースの自己描画エンジンをベースに、スキルのあるチームは、わずかな変更を加えるだけで独自のクロスプラットフォーム ソリューションに適用し、ネイティブ コンポーネントを置き換え、Flutter のクロスプラットフォーム一貫性機能を再利用して、ソリューションのビジネス価値と技術的価値を高めることができます。 DingTalk に関しては、クロスプラットフォームへの現在の投資と目標を考慮すると、他のソリューションのように独自のクロスプラットフォーム自己描画エンジンをリリースする準備はまだできていません。しかし、技術的な観点から見ると、Flutter ベースのクロスプラットフォーム ソリューションを選択することで、一方では Flutter の技術的メリットをすぐに享受でき、提供される製品のパフォーマンスと品質を他の主流のソリューションと一貫したものにすることができます。他方では、このプロセスで関連する技術チームを育成し、その後のより深いカスタマイズと変革のための技術的準備を整えることもできます。 ソリューション設計このセクションでは、DingTalk の Dutter クロスエンド フレームワークの設計について簡単に紹介し、いくつかの代表的な問題についてさらに説明します。 3.1 全体設計Dutter コア モジュールは、次の 3 つの主要パッケージで構成されています。
全体像は次の図に示されています。
上記の図を展開すると、フレームワークの全体的なモジュール図が得られます。これはおおよそ次のようになります。 下から上へ:
3.2 データ通信データ通信は主に、Flutter とプラットフォーム間の 2 つの主要な通信方法、チャネルと FFI を指します。チャネルは、Flutter アプリケーションでは比較的一般的です。Flutter とプラットフォーム間の通信の設計のほとんどは、このモードに基づいています。その利点は、高い統合性、優れたカプセル化、簡単な使用です。欠点は、主に通信効率の問題です。FFI は、Flutter 2.0 で正式な機能としてリリースされました。その最大の特徴は、同期呼び出し、メモリ共有、高い実行効率ですが、使いやすさとスケーラビリティの点ではまだ改善の余地があります。 1 チャネルチャネルに関しては、DingTalk側での使用方法と公式ドキュメントに本質的な違いはありません。私が共有したい経験は、チャネル数の管理に関するものです。公式のオリジナルデータには、チャネル管理に関する内容はあまり含まれていません。DingTalk の実際の使用経験に基づいて、共有用のチャネルを 1 ~ 2 つに集約して 1 つの業務に組み込み、共有チャネルに基づいて業務用の「応答」および「配信」インターフェースをカプセル化することをお勧めします。 これには主に次の利点があります。
上記の 2 つの点、特に 2 番目の点は、DingTalk のモバイル端末およびデスクトップ端末との互換性にとって非常に重要です。 「DingTalk Flutter デスクトップ アプリケーション ソリューション」で説明したように、現在、モバイル側ではシングル エンジン アーキテクチャを使用していますが、デスクトップ側ではマルチ エンジン アーキテクチャを使用しています。チャネルが適切にカプセル化されておらず、ビジネス関係者が FlutterEngine を直接登録して呼び出すことが許可されている場合、マルチエンジン モードでのコード管理コストが大幅に増加し、モバイル側とデスクトップ側の実装に一貫性がなくなります。 私たちの現在のアプローチは、FlutterEngine と Channel を Dutter フレームワークにカプセル化し、統合されたカプセル化されたインスタンスを上位レベルのインターフェースである DutterMethodChannel に公開することです。ビジネス レイヤー コードでは、基盤となるアーキテクチャがシングル エンジン モードかマルチ エンジン モードかを意識する必要はなく、統一されたルールとモードに従って関連サービスを登録または呼び出すだけで済みます。このモデルは、ビジネスでの使用の複雑さを軽減するだけでなく、基盤となるフレームワーク設計に大きな柔軟性をもたらし、その後のモバイル端末のマルチエンジン ソリューションへの切り替えを強力にサポートします。 2 国際金融公社FFI は Flutter 2.0 で正式にリリースされました。Channel と比較した最大の利点は、実行効率が高く、パフォーマンス要件が高いシナリオに適していることです。この章では、FFI の具体的な使用法については触れませんが、FFI を使用する際にメモリ管理で注意する必要がある点について説明します。 現在のモバイル開発 (Java、OC、Swift) にはすべて自動メモリ管理のメカニズムがあることは周知の事実です。Flutter で使用される dart 言語にも、ガベージ コレクションに基づく自動メモリ管理機能があります。さまざまな言語は、独自のルールに従って独自の範囲内でメモリを合理的に管理し、メモリ空間の合理的かつ安定した適用を保証します。 ただし、FFI は関数間直接呼び出し方式であるため、メモリ共有メカニズムに基づいて呼び出しチェーンを簡素化しますが、メモリ管理に対する要件も高くなります。このモードでは、メモリ空間が適切に管理(割り当てと解放)されていない場合、ワイルドポインタやメモリリークが発生する可能性が高くなります。 公式ドキュメントの Flutter FFI および Dart FFI の章の紹介では、メモリ管理の説明は比較的限られています。関連するインターフェース情報を調べると、dart:ffi がメモリを手動で管理する方法を提供していることがわかります。 これに基づいて、Dutter FFI メモリ管理戦略を定義できます。まず、中核となる原則を定義する必要があります。
1と2に基づいて、FFI操作関連のインターフェースとデータ構造をカプセル化し、「Dutter FFI Bridge」モジュールに統合します。 カバレッジと複雑さを十分に考慮した結果、デフォルトの基本型に加えて、Dutter FFI インターフェースに String 型のサポートのみを追加しました。その他のデータ型については、ビジネス パーティがシリアル化して渡すことができます。送信プロセス中、固定長文字列の場合は、「UTF-8 エンコードされた char * 配列」を介して直接渡すことができます。可変長文字列 (呼び出しの戻り値など) の場合は、カスタム データ構造 DTFUInt8String を使用して渡す必要があります。実装に固有の事項:
3.3 メッセージバス「メッセージバス」は、DingTalk の機能モジュールです。主に、さまざまなテクノロジー スタックに基づいて DingTalk 側で実装されたビジネス コミュニケーションの問題を解決します。たとえば、Flutter ベースのビジネスで、ミニプログラムに基づいて実装されたページ更新 UI に通知したい場合、この機能はメッセージバスを通じて実現できます。 メッセージ バスは、企業が運用環境間でシームレスに通信できるようにすることを目的とした、軽量のエンドツーエンドのスーパー チャネルとして位置付けられています。論理的には、「バス」、「コントローラ」、「登録と送信」の 3 つのモジュールが含まれます。実装の面では、「永続的なメッセージ」、「パイプライン分類」、「権限制御」などの方法を通じて、全体的な操作の信頼性、効率性、安全性を保証します。 3.4 モジュール性DingTalk のエンドサイドビジネスの特性上、モジュール構造に細心の注意を払っています。 Flutter ビジネスで採用されているモジュール ソリューションは、DingTalk Native のモジュール フレームワークから開発されました。当社は、当初から Flutter ビジネス レイヤーの直接結合を排除することにこだわりました。 モジュール化は、研究開発の効率を向上させるだけでなく、ビジネス上および技術上の大きな価値をもたらします。例えば:
3.5 コンテナ化コンテナ化は、DingTalk での Flutter の迅速な実装を強力に保証します。 DingTalk が H5 やミニプログラム プロジェクトで蓄積してきたコンテナ基盤を基に、Flutter シナリオにおけるコンテナ化の概念を継続的に参照し、設計と機能の面で迅速に接続します。一方で、既存のインフラストラクチャを迅速に再利用できるようになります。他方では、ビジネス開発の複雑さが軽減され、元のコンテナの共通機能が Flutter シナリオでも引き続き使用できるようになり、テクノロジー スタックを継続できるようになります。 開発タイムラインから見ると、DingTalk のクライアント側コンテナは次の 3 つのバージョンを経てきました。
現在のコンテナ アーキテクチャに基づいて、将来の新しいテクノロジとの良好な互換性を確保できます。その後の開発で、Flutter に類似した新しいテクノロジー スタックに再度接続する必要が生じた場合、既存の標準に従って迅速に接続でき、コンセプト、機能、インフラストラクチャの面で最大限の再利用を確保できます。 3.6 コンポーネントライブラリDingTalk Flutterは現在、dingui_flutterとdingtalk_uikitの2つのコンポーネントライブラリセットを使用しています。その中で、dingui_flutterは現段階で私たちが注力している部分です。Dingui_flutterは、DingTalkビジュアルチームが提案したDingUIビジュアル仕様に従って実装されたFlutterバージョンコンポーネントのセットです。現在、コアコンポーネントは4エンドの互換性を実現できます。 dingui_flutter はコミュニティへの貢献を目標としていますが、現段階では安定性や完全性などの問題から、まだ DingTalk 内部で使用されています。成熟したらできるだけ早くオープンソース化する予定です。 フラッターデスクトップ現在、DingTalkデスクトップ端末におけるFlutterの使用モードは、基本的にモバイル端末の場合と同じです。FlutterはDingTalkの機能モジュールであり、クライアント本体は依然として主に元のネイティブに基づいて実装されています。 Flutter ベースで実装された一部のサービスでは、起動時の遷移に Dutter フレームワークでカプセル化されたインターフェースが使用され、特定の遷移モードに応じて遷移アクションが実行されます。 上記の効果を実現するために、デスクトップアプリケーションでは主に以下の 3 つの問題を解決しました。
上記の問題については後ほど一つずつ説明させていただきます。 4.1 デスクトップ統合モードの問題Flutterは現在、デスクトップでのFlutterAppモードの使用のみをサポートしており、モバイル端末で広く使用されているFlutterModuleモードはまだサポートされていません。しかし、FlutterApp を通じて既存のクライアントに大規模な変更を加えることを期待するのは合理的でも現実的でもありません。したがって、デスクトップに Flutter を実装する際に最初に遭遇した問題は、Flutter をモジュールとして既存の DingTalk クライアントに統合する方法でした。 Flutter で構築された製品を分析したところ、FlutterApp と FlutterModule のコア製品に大きな違いはないことがわかりました。次の図に示すように、iOS 上の FlutterModule と macOS 上の FlutterApp を例に挙げます。 App.framework、Flutter.framework、Plugins.framework などのコア モジュールについては、FlutterApp と FlutterModule の両方が製品に含まれていることがわかります。主な違いは、補助プラグインの登録用に FlutterModule に FlutterPluginRegistrant.framework が追加されていることです。幸いなことに、実装のこの部分は複雑ではなく、カスタム ツールチェーンを通じて簡単に生成できます。 この考えに従って、Flutter デスクトップ統合ソリューションを整理することができます。 FlutterApp を使用してデスクトップの Flutter 関連モジュールを整理し、公式ツール チェーンに基づいて適切な拡張機能を作成します。元のビルド製品からモジュール化に必要な部分を抽出し、最後にプラグイン登録に必要なテンプレートコードを完成させます。最終製品が既存の DingTalk クライアントに統合された後、その使用方法は他のセカンドパーティ ライブラリと基本的に同じであり、既存の FlutterModule メソッドを参照して使用できます。 最終的なプロセスは次のとおりです。 Mac と Windows の製品統合図: 4.2 Windows 32 ビットの問題Flutter は Windows 32 ビット システムをサポートしていないため、現段階では国内のデスクトップ エコシステムにおける Flutter の拡大を妨げる主な障害の 1 つとなっているはずです。この問題を解決するにあたり、DingTalk は基本的に、初期のデュアルプロセスから、途中での全体的な 64 ビット アップグレード、そして FFW まで、考えられるすべてのソリューションを試しましたが、上記のソリューションはさまざまな問題により最終的に実装できませんでした。 最終的には着陸に失敗しましたが、上記の試みの間に、非常に重要な 2 つの情報が得られました。
上記 2 点のサポートを受けて、DingTalk の Zhou Yong は最終的に Windows 32 ビット FlutterEngine をコンパイルするためのソリューションを模索し、JIT モードで Flutter コンパイル製品をロードして、最終的に Windows 側での使用要件を満たしました。 Windows プラットフォームで Flutter を使用するために、細かい部分を削ぎ落とした上で、次のことを行いました (詳しい内容については、後ほど特別記事で紹介します)。
上記の手順により、Windows 32 ビット DingTalk に Flutter を統合する主な作業が完了しました。JIT と AOT の機能には本質的な違いはありませんが、パフォーマンスには大きな違いがあります。グレースケール処理で見つかった主な問題は次のとおりです。
したがって、現段階で私たちが採用したものは、公開ソリューションとしてしか考えられません。今後もこの分野への投資を増やし、できるだけ早く完全な Flutter を DingTalk Windows エンドに統合するよう努める必要があります。 4.3 エンジンアーキテクチャの互換性の問題これは、デスクトップ実装プロセス中に遭遇した 3 番目の問題です。モバイル側では FlutterBoost に基づくシングルエンジン アーキテクチャを使用しているため、デスクトップ側では特殊な環境のため、マルチエンジン アーキテクチャのみを使用できます。 これにより、ビジネス関係者にいくつかの問題が発生しますが、最も深刻なのは、マルチエンジン環境によって発生する通信の混雑です。 この段階では、主にビジネス レイヤーの互換性を通じてこの問題を回避しています。つまり、マルチエンジン環境での通信の問題をサポートするために、DingTalk の「メッセージ バス」を使用しています。しかし、長期的には、複数のエンジンに対するフレンドリーなサポートが必要です。現在モバイル デバイスで利用可能な LightWeightEngine 機能をデスクトップに拡張し、その基盤を拡張して分離を打破し、ビジネス コードがメモリを完全に共有できるようにする必要があります。現在、このソリューションは AliFlutter プロジェクト チーム内で技術プロジェクトとして推進されており、設定された目標をできるだけ早く達成できることを期待しています。 要約する現在、ダッタープロジェクトは基本的に第一段階の目標を達成しており、今後も以下の5つの分野に投資を続けていきます。
|
<<: 推論速度は22.3倍に向上。北京航空航天大学とバイトダンスはバイナリキーワード認識モデルを提案した。
[[433235]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...
[中国、深セン、2020年8月10日] ファーウェイは本日、深センで開催されたAscend AI ...
現在、特定の NLP タスクのパフォーマンスを最適化するための最善のアプローチは、事前トレーニング済...
[[409522]]動画は徐々にテキストや画像を超え、最も広く利用されているメディア形式になったと...
[[428125]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...
翻訳者 |陳俊レビュー | Chonglou近年、予測 AI は、高度な推奨アルゴリズム、リスク評価...
[51CTO.comからのオリジナル記事] デジタル時代において、人工知能の普及はクラウドコンピュー...
[[286697]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...
スイスアーミーナイフについて聞いたことがあるかもしれません。そうでない場合は、下の図をご覧ください。...
各人の顔、指紋、虹彩の情報はそれぞれ固有であり偽造が困難であるため、生体認証は長年にわたり究極の本人...
クラウドの世界を探ってみましょう。ただし、単なるクラウドではなく、未来のクラウドです。具体的には、2...