环境: flutter sdk v1.5.4-hotfix.1@stablejava
对应 flutter engine: 52c7a1e849a170be4b2b2fe34142ca2c0a6fea1fandroid
经过PlatformChannel为平台层做为接收端的例子咱们已经了解到DartMessenger
经过响应接口handleMessageFromDart
来把Dart层的消息/操做发送到平台层,而这个方法是PlatformMessageHandler
这个接口对象的,持有接口实例的对象正是FlutterJNI
。git
做为被动调用的一方,平台层等待消息接收,并不知道消息的来源和用途,因此咱们只须要按图索骥,找出调用方,就可追踪接收过程的完整流程。github
容易看到FlutterJN.handlePlatformMessage
调用了handleMessageFromDart
,此函数被标记成@SuppressWarnings("unused")
,很大可能与C++层有关了,搜索方法名称果真在``中找到"handlePlatformMessage"
, 函数签名是"(Ljava/lang/String;[BI)V"
正是些方法,方法对象被全局变量g_handle_platform_message_method
持有,又被FlutterViewHandlePlatformMessage
引用, 至此又进入到C++层。bash
这里HandlePlatformMessage
这个名称实在太让人产生误解,感受像是C++层在处理平台层发来的消息,然而实际倒是传递Dart层的消息到平台,虽然handlePlatformXXX
这种风格都表示处理Dart层的消息,而且保持的很好,但仍是没有receiveXXX
来的简单直观明了。函数
为便于理解如下是被调用序列post
DartMessenger.handleMessageFromDart => PlatformMessageHandler
FlutterJNI.handlePlatformMessage => g_handle_platform_message_method
FlutterViewHandlePlatformMessage
PlatformViewAndroid::HandlePlatformMessage <= PlatformView::HandlePlatformMessage
...Shell::OnEngineHandlePlatformMessage <= PlatformView::Delegate::OnEngineHandlePlatformMessage
Engine::HandlePlatformMessage <= RuntimeDelegate::HandlePlatformMessage
RuntimeController::HandlePlatformMessage <= WindowClient::HandlePlatformMessage
::SendPlatformMessage
...tonic::DartCallStatic(::_SendPlatformMessage
...Window::RegisterNatives
复制代码
这与发送端的序列层次彻底同样,从上到下分别是Shell -> PlatformView -> Engine -> RuntimeController -> Window。spa
可知FlutterViewHandlePlatformMessage
是C++调用的终点,全局变量g_handle_platform_message_method
实际上是平台java方法,因此须要知道java方法什么时候与C++方法关联起来的, 即g_handle_platform_message_method
什么时候被设置的: 如下是被调用序列code
g_handle_platform_message_method = env->GetMethodID(,"handlePlatformMessage",)
::RegisterApi
PlatformViewAndroid::Register
JNI_OnLoad
System.loadLibrary("flutter") (library_loader.cc:23)
FlutterMain.startInitialization (FlutterMain.java:161)
FlutterApplication.onCreate (FlutterApplication.java:22)
复制代码
JNI_OnLoad
被声明在了连接器脚本(android_exports.lst)中,表示被加载时执行的操做。orm
结合前2篇的调用细节分析(精确到函数),及一些关键类的建立时机作一个简明flutter通道数据通讯类图以下: 左边是java类,右边是C++类