@https://blog.csdn.net/weixin_38912070/article/details/93857112

    image.png
    回首看这个架构图,我们再重新看看flutter的运行过程。

    启动:android - FlutterApplication-FlutterActivty-registerPlugin-createFlutterNativeView- flutter runapp();

    Widgets层是Flutter提供的的一套基础组件库,在基础组件库之上,Flutter还提供了 Material 和Cupertino两种视觉风格的组件库。而我们Flutter开发的大多数场景,只是和这两层打交道

    Rendering层,这一层是一个抽象的布局层,它依赖于dart UI层,Rendering层会构建一个UI树,当UI树有变化时,会计算出有变化的部分,然后更新UI树,最终将UI树绘制到屏幕上,这个过程类似于React中的虚拟DOM。Rendering层可以说是Flutter UI框架最核心的部分,它除了确定每个UI元素的位置、大小之外还要进行坐标变换、绘制(调用底层dart:ui)。

    (动画-绘制-手势-函数库)dart:ui包,它是Flutter引擎暴露的底层UI库,提供动画、手势及绘制能力。

    engine

    1. Skia 作为一个2D的图形系统,包括绘图,渲染,显示图片都是用Skia完成。

    embedder

    跨平台运行环境.提供给engine 四种runner

    UI task runner:
    Flutter的UI Task Runner负责执行Dart代码,而Flutter的渲染也是在UI Task Runner中运行的
    我们的flutter widget的运行都是 初始化活着需要更新时候.
    Framework会通过ui.window.scheduleFrame通知Engine。然后Engine会注册一个Vsync信号的回调,在下一个VSync信号到来之际,Engine会通过ui.window.onBeginFrame和ui.window.onDrawFrame回调给Framework来驱动Flutter渲染管线,渲染管线中的Build、Layout、Paint一一被执行,生成了最新的Layer Tree。最后Layer Tree通过ui.window.render发送到了Engine端,交给GPU Task Runner做光栅化与上屏。
    Engine是在UI TaskRunner里面新建并运行

    Platform task runner:
    1 跟Flutter Engine的所有交互(接口调用)必须发生在Platform Thread,

    2 flutter channel 提供了 flutter和native的通信能力:
    image.png
    最终都是分别注册一个【basic|method|event chanel】BinaryMessageHandler 的handler接口到 binaryMessager,当Binarymessage 有数据变化时候 分发给对应的观察者~

    这些都是运行在Platform task中,对应的native也是在主线程中。所以nativce不要做耗时操作切 开启其他线程操作后应该callback给主线程。保证都是Platform task 中交互。

    3 如何拓展自己的channel ?

    定义 channel 和 handler ,注册handler(BinaryMessageHandler),《-自定义编解码-》- Binarymessage