1startup

Flutter 安卓平台源码剖析

Flutter启动流程源码分析

深入理解Flutter引擎启动–详细

Flutter作为一款跨平台的框架,可以运行在Android、iOS等平台,Android为例讲解如何从Android应用启动流程中衔接到Flutter框架,如何启动Flutter引擎的启动流程。 熟悉Android的开发者,应该都了解APP启动过程,会执行Application和Activity的初始化,并调用它们的onCreate()方法。那么FlutterApplication和FlutterActivity的onCreate()方法是连接Native和Flutter的枢纽。

  • FlutterApplication.java的onCreate过程:初始化配置文件/加载libflutter.so/注册JNI方法;
  • FlutterActivity.java的onCreate过程:创建FlutterView、Engine, Dart虚拟机、Isolate、taskRunner等对象,最终执行执行到Dart的main()方法,执行runApp(Widget app)来处理整个Dart业务代码。

image

深入理解Flutter应用启动–runApp(Widget app)方法开始

runApp(MyApp)是flutter应用开始真正执行业务逻辑代码的起点,整个过程主要工作:

  • WidgetsFlutterBinding初始化:这是一个单例模式,负责创建WidgetsFlutterBinding对象,WidgetsFlutterBinding继承抽象类BindingBase,并且附带7个mixin,初始化渲染、语义化、绘制、平台消息以及手势等一系列操作;
  • attachRootWidget:遍历挂载整个视图树,并建立Widget、Element、RenderObject之间的连接与关系,此处Element的具体类型为RenderObjectToWidgetElement;
  • scheduleWarmUpFrame:调度预热帧,执行帧绘制方法handleBeginFrame和handleDrawFrame。

image

image

从WidgetsFlutterBinding是单例模式,从小节[2.4]得WidgetsBinding的renderViewElement记录着唯一的RenderObjectToWidgetElement对象,从小节[2.3.2]可知RendererBinding的renderView记录着唯一的RenderView对象;也就是说每个flutter应用创建的Root Widget跟Element、RenderObject一一对应,且单例唯一。

MyApp是用户定义的根Widget,为了建立三棵树的关系,RenderObjectToWidgetAdapter起到重要的桥接功能,该类的createElement方法创建RenderObjectToWidgetElement对象,createRenderObject()方法获取的是RenderView。