Flutter Engine在Windows上启动详解

1,187 阅读3分钟

这篇文章是对Flutter for Windows 启动流程解析 - 掘金 (juejin.cn)的一些内容补充,也就是针对FlutterViewController内部的代码逻辑进行梳理,了解Flutter Engine在Windows平台下的启动机制。

本篇最好配合官方Flutter Engine的源码食用!

前情提要

FlutterWindowOnCreate的函数内,我们创建了一个FlutterViewController,其构造方法如下。

源码在官方Engine库的位置:src\flutter\shell\platform\windows\client_wrapper\flutter_view_controller.cc

image.png

进入正题

我们看到了许多以FlutterDesktop开头命名的函数,也就是引擎创建和启动的关键,顺着头文件寻找,发现了它们的定义和实现文件:

  • 声明文件路径:src\flutter\shell\platform\windows\public\flutter_windows.h
  • 实现文件路径:src\flutter\shell\platform\windows\flutter_windows.cc

记住,这个文件是桌面平台和引擎底层交互的一个接口!大多数情况下是调用embedder的函数。

Engine的创建

image.png

朴实无华的一串代码,直接转到FlutterEngine的实现路径src\flutter\shell\platform\windows\client_wrapper\flutter_engine.cc,发现了和官方GLFW Example相似的代码。

image.png

  1. 首先,16-18行,把DartProject的路径地址拷贝到c_engine_properties里。

  2. 20-31行,是对命令行传入的参数个数和参数内容进行处理。

    • 如果你在Flutter看到过@vm-entrypoint的注解,你就明白他的意思。如果你不传递参数,那么默认入口为dart端的main

image.png

  1. 33-35行就是创建一个引擎,然后获得引擎创建的Messenger,我们深入看看FlutterDesktopEngineCreate做了什么

FlutterDesktopEngineCreate

这个部分的源码都在src\flutter\shell\platform\windows下,可自行查阅。

image.png

FlutterProjectBundle没做什么,就是把一些路径属性转换成内部读得懂的。 HandleForEngine也没做什么,就是一个类型转换。(flutter_project_bundle.cc)

  • flutter_winddows.cc里面的Handle开头的大多数是做这个工作。

FlutterWindowsEngine,也就是我们所创建的Engine类型了。

这些代码想知道含义看命名即可,不难理解,我感兴趣的是164-168行的内部逻辑,它也就是我的下一篇共享纹理文章猜想的来源。

Flutter for Windows共享纹理的猜想 - 掘金 (juejin.cn)

flutter_windows_engine.cc

image.png

至此,WIN平台的引擎构建好了,但是还没有启动!!

回到起点

创建好引擎后,我们又创建了FlutterDesktopViewControllerCreate,通过注释,得知,它里面包含了启动的逻辑,至于实现,这里就不贴了。

image.png

至此,引擎跑起来了,芜湖!

小尾巴:也许你会看到这个Run函数

但是直接调用是失败的,因为还没有设置引擎的渲染方式等等属性,这就是FlutterDesktopViewControllerCreate内部帮我们处理的任务。

好奇怎么失败的?下面这篇文章告诉你答案

-Flutter 使用VS2019和Cmake启动Flutter Engine(还没写)

image.png

END

再深入研究,Flutter都不会写了,等这几篇相关的文章写完,好好学习算法和原生了,毕竟下半学期要找个班上了。