type
status
date
slug
summary
tags
category
icon
password
目前Flutter项目更新还是比较频繁的,这里主要是看主要的的流程,主要的代码,一些细枝末节或者与主题无关的代码均已忽略.
本文源码基于Flutter Engine master分支,updated 2020/12/07
基本流程
- 初始化Flutter: 找到APK包中的Flutter资源,并加载Flutter 的native库
- 启动FlutterActivity
onCreate()
回调中,启动FlutterEngine
- 创建PlatformPlugin
- 将所有配置再pubsepec.yaml中的插件注册到FlutterEngine中
- 设置ContentView为FlutterView
FlutterView实际上是一个FrameLayout,并且根据渲染模式内部会选择将Flutter UI渲染到SurfaceView或者SurfaceTexture.
- 建立FlutterView和FlutterEngine的联系
- FlutterActivity#onStart()的时候,找到Dart的入口函数,并使用DartExecutor执行Dart代码.
Flutter的初始化
FlutterApplication中有:
最后调用的是FlutterLoader中的初始化方法:
FlutterJNI中有:
其实就是加载libflutter.so的.
总结下:
Flutter初始化流程
- 注册VsyncWaiter,用于后面Vsync时做一些处理;
- 解析APK中的Flutter资源,加载libflutter.so
FlutterActivity的启动
这里FlutterActivity其实只是一个壳子,主要都是委托给
FlutterActivityAndFragmentDelegate
去处理的,至于为什么要用这个委托类,Google给出了解释:Flutter作为一个第三方库,如果再带上FragmentActivity等support库就显得有点臃肿了,因此自行实现Lifecyle机制和一个状态委托类
实际开发中可以继承FlutterActivity,重写各种方法,比如提供自定义的FlutterEngine,对FlutterSurfaceView或者FlutterTextureView进行自定义配置,为开发着提供了一定的灵活性.
FlutterEngine的创建和初始化
在FlutterEngine中有:
FlutterEngine的构造函数中做了很多重要组件的创建工作,比如:
- DartExecutor
- AssetManager
- 各种系统Channel
- 通过JNI调用Flutter Engine中的C++层代码
- FlutterRenderer
表示Flutter Engine的渲染能力,它提供了RenderSurface用于绘制Flutter UI像素到Android的View层级.
FlutterRenderer管理用于渲染的texture,和一些执行native方法的java JNI调用;
RenderSurface提供了Surface给Flutter去绘制.
FlutterSurafceView和FlutterTextureView都实现了RenderSurface.
- 注册插件
这里这是一个注册插件的入口,这里是自动注册
后面还有一次注册插件;
FlutterEngine中有:
这里会调用C++层的代码,在
shell/platform/android/platform_view_android_jni_impl.cc
中有:这里会创建
AndroidShellHolder
,这个AndroidShellHolder
用处巨大,后面会具体聊聊.PlatformPlugin的创建和作用
这里不多说,后面仔细聊聊.
插件注册
这里又注册了一次插件,需要与前面一次注册插件的调用区分,上一个带有一个参数判断,而这个是不带判断的.
在GeneratePluginRegister中有:
FlutterView的渲染流程
这里主要是选择渲染模式,然后建立起FlutterView和Flutter Engine间的联系.
FlutterView的渲染模式
- RenderMode#surface
默认的渲染模式,将Flutter UI渲染到SurfaceView上.
优点: 性能好
缺点: 在z轴方向上,不能放置在其他2个Android View之间,也不能使用animation和transform效果.
除非有特别需求要使用SurfaceTexture,一般都是使用SurafceView.
- RenderMode#texture
将Flutter UI渲染到SurfaceTexture上,性能没有SurfaceView模式好,但是由于它使用的是TextureView,表现得更像一个正常的Android View.
优点: 可以使用动画和转换效果,可以任意放在View之间.
缺点: 性能稍差一点
建立FlutterEngine 和 FlutterView的联系
这里拿FlutterSurfaceView举例:
然后就是FlutterRenderer中:
FlutterJNI中有:
到这就会调用到C++层了(
shell/platform/android/platform_view_android_jni_impl.cc
):这里Java的Surface和C++的Surface就建立了联系.
执行Dart代码
在FlutterActivity的onStart()回调中有:
到这里,Flutter中的Dart代码已经执行起来了.
- 作者:姜康
- 链接:https://jiangkang.tech/article/7d5d3217-50cd-424a-9327-c20cc9e54d2f
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。