環境:フラッターSDK v1.5.4-hotfix.1の @stableは
エンジンフラッター対応:52c7a1e849a170be4b2b2fe34142ca2c0a6fea1f
チャネル視点のプラットフォーム側に放置した後の概念の概要は、通信機構内に深い認知必要通っある詳細な分析を必要とし、before'veが学習FlutterJNI.dispatchPlatformMessage
データ呼を送信するために、プラットフォーム層(Java)の最終層を、呼が継続シーケンス:
FluttereJNI.dispatchPlatformMessage
nativeDispatchPlatformMessage(FlutterJNI.java)
DispatchPlatformMessage(platform_view_android_jni.cc:56)
AndroidShellHolder::GetPlatformView(platform_view_android_jni.cc:421)
PlatformViewAndroid::DispatchPlatformMessage(platform_view_android.cc:92)
TaskRunners::GetPlatformTaskRunner => PlatformView::task_runners_
new PlatformMessageResponseAndroid()
new flutter::PlatformMessage(name, message, response)
PlatformView::DispatchPlatformMessage
PlatformView::Delegate::OnPlatformViewDispatchPlatformMessage() => Shell::On..()
::GetUITaskRunner
TaskRunner::PostTask
...Engine::DispatchPlatformMessage
FINAL CALL C ++層にメッセージを送信するためのPlatformViewAndroid::DispatchPlatformMessage
方法、および呼び出し、PlatformViewAndroid
メンバーdelegate_
のOnPlatformViewDispatchPlatformMessage
方法を、私たちは決定する必要がありPlatformView::Delegate
、抽象カテゴリの実現を、それはメンバーが作成または割り当てられている場所を追跡するために、です。
コンストラクタのメンバーから、PlatformView::delegate_
それが渡された外部を作成することで、PlatformViewAndroid
あなたが知っている必要がありますので、デリゲートのサブクラスとして、それを通過した
PlatformViewAndroid
彼らは、デリゲートを作成する際に、着信オブジェクトを、
android_shell_holder.cc:63
知られているの作成PlatformViewAndroid
、着信時のデリゲートオブジェクトは、実際にあるShell
メンバーのその方法と非同期呼び出しでは、engine_
方法、そのEngine::DispatchPlatformMessage
方法
だから我々は必要
- クリア
PlatformViewAndroid
プロセスが作成されます - 明確な
Engine
割り当てまたは作成するための機会
作成PlatformViewAndroid
プロセス:
AndroidShellHolder::AndroidShellHolder()
ThreadHost::ThreadHost
platform_thread=
fml::MessageLoop::EnsureInitializedForCurrentThread
platform_runner=fml::MessageLoop::GetCurrent().GetTaskRunner()
Shell::Create()
DartVMRef::Create(settings)
Shell::Create()
TaskRunner::RunNowOrPostTask
lamda() => Shell::CreateShellOnPlatformThread()
Shell::CreateCallback<PlatformView>(Shell&) => on_create_platform_view
new PlatformViewAndroid(Shell,...)
最も重要なのは、Shell::Create
この方法は、あなたが呼び出すコールバックを渡し、コールバック呼び出しShell::CreateShellOnPlatformThread()
、コールバックを継続するon_create_platform_view
中でその実装体をAndroidShellHolder
コンストラクタコンテキスト。
シェル:: engine_ [エンジン]プロセスの作成:
第二の問題は、単に各質問の分析に着手する:私たちが作成しているShell
の作成に時間をPlatformViewAndroid
オブジェクト
shell.cc:38
見たことはengine_
、外部の着信であります
Shell::CreateShellOnPlatformThread()
new Shell()
on_create_platform_view => AndroidShellHolder.on_create_platform_view
std::make_unique<PlatformViewAndroid>()
TaskRunner::RunNowOrPostTask
...lamda => engine = std::make_unique<Engine>() (shell.cc:131)
Shell::Setup
engine_ = std::move(engine); (shell.cc:388)
ではShell::CreateShellOnPlatformThread
まず、あなたが作成しShell
、次に作成し、インスタンスをPlatformView
作成し、ラムダの後、別の非同期実行をインスタンスをEngine
インスタンス
これは、最終的には明らかに二つの重要なオブジェクトの前にタイミングの問題を作成します。
私たちは、非同期実行を分析の第一段階を呼び出すために継続しますEngine::DispatchPlatformMessage
Engine::DispatchPlatformMessage
RuntimeController::DispatchPlatformMessage
Window::DispatchPlatformMessage
tonic::DartInvokeField(...,"_dispatchPlatformMessage")
これにより、ダートを呼び出すために、最終的な層
のでAndroidShellHolder
、コンストラクタフラッターが作成しShell
たオブジェクトを、そのまた、我々は明確にする必要があります。
作成AndroidShellHolder
プロセス:
FlutterActivity.onCreate (FlutterActivity.java:89)
FlutterActivityDelegate.onCreate() (FlutterActivityDelegate.java:160)
FlutterView.FlutterView() (FlutterView.java:139)
new FlutterNativeView(Context) (FlutterNativeView.java:47)
FlutterNativeView.attach(this, false) (FlutterNativeView.java:165)
FlutterJNI.attachToNative (FlutterJNI.java:423)
AttachJNI(platform_view_android_jni.cc:149)
java_object(env, flutterJNI)
std::make_unique<AndroidShellHolder>(java_object)
AndroidShellHolder::IsValid
reinterpret_cast<jlong>
ものを作成するための時間を見つけることは比較的容易FlutterJNI
にバインドされているFlutterNativeView
、とFlutterJNI
のメンバーnativePlatformViewId
の代表をC ++でAndroidShellHolder
、この過程で重要などのオブジェクト、オブジェクトShell
とEngine
作成されています。
そのため、毎回、送信データ(ダーツメソッド呼び出しまたはインターネット)であるFlutterJNI
オブジェクトのメンバーはnativePlatformViewId
、C ++層を通過に変換AndroidShellHolder
することによって、オブジェクトEngine
ダーツにコールの最終層