的Flutter包大小也同样不再是一个问题 , 或许Flutter技术的生命期比客户端更长 , 或许Fuchsia正在驰骋IOT疆场 , 你所掌握的Flutter技术栈可以无缝迁移 , 一次弯道超车的机会 。
到此 , 介绍完跨平台技术演进以及Flutter的优势 。看到这 , 相信你可能对Flutter技术有一定兴趣 , 为了能让大家快速了解Flutter内部原理而不枯燥 , 本文不放任何的源码 , 通过一系列图来帮大家从整体架构来快速理解Flutter 。
二、Flutter引擎架构1. Flutter技术架构先来看看Flutter整体的技术架构 , 分为四层 , 从上之下依次是Dart APP , Dart Framework , C++ Engine , Platform 。

文章插图
Flutter架构最核心的便是Framework(框架)和Engine(引擎):
- Flutter Framework层:用Dart编写 , 封装整个Flutter架构的核心功能 , 包括Widget、动画、绘制、手势等功能 , 有Material(Android风格UI)和Cupertino(iOS风格)的UI界面 , 可构建Widget控件以及实现UI布局 。
- Flutter Engine层:用C++编写 , 用于高质量移动应用的轻量级运行时环境 , 实现了Flutter的核心库 , 包括Dart虚拟机、动画和图形、文字渲染、通信通道、事件通知、插件架构等 。引擎渲染采用的是2D图形渲染库Skia , 虚拟机采用的是面向对象语言Dart VM , 并将它们托管到Flutter的嵌入层 。shell实现了平台相关的代码 , 比如跟屏幕键盘IME和系统应用生命周期事件的交互 。不同平台有不同的shell , 比如Android和iOS的shell 。
2. Flutter编译产物看完Flutter内部架构 , 或许你好奇 , Flutter不用Android/iOS的本地语言技术开发 , Dart编写完的代码如何让不同系统可以识别 , 最终编译后得到的产物是什么呢?

文章插图
Flutter产物分为Dart业务代码和Engine代码各自生成的产物 , 图中的Dart Code包含开发者编写的业务代码 , Engine Code是引擎代码 , 如果并没有定制化引擎 , 则无需重新编译引擎代码 。
一份Dart代码 , 可编译生成双端产物 , 实现跨平台的能力 。经过编译工具处理后可生成双端产物 , 图中便是release模式的编译产物 , Android产物是由vm、isolate各自的指令段和数据段以及flutter.jar组成的app.apk , iOS产物是由App.framework和Flutter.framework组成的Runner.app 。
这个过程涉及frontendserver、gensnapshot、xcrun、ninja编译工具 。frontendserver前端编译器会进行词法分析、语法分析以及相关全局转换等工作 , 将dart代码转换为AST(抽象语法树) , 并生成app.dill格式的dart kernel 。gensnapshot经过CHA、内联等一系列执行流的优化 , 根据中间代码生成优化后的FlowGraph对象 , 再转换为具体相应系统架构(arm/arm64等)的二进制指令 。
3. Flutter引擎启动既然了解了Flutter的编译产物 , 那你或许又好奇 , Flutter这台引擎如何发动的 , 怎么跟Native衔接呢?

文章插图
这里以Android为例 , 熟悉Android的开发者 , 应该都了解APP启动过程 , 会执行Application和Activity的onCreate方法 , FlutterApplication和FlutterActivity的onCreate方法正是连接Native和Flutter的枢纽 。
- FlutterApplication.java的onCreate过程主要完成初始化配置、加载引擎libflutter.so、注册JNI方法;
- FlutterActivity.java的onCreate过程 , 通过FlutterJNI的AttachJNI方法来初始化引擎Engine、Dart虚拟机、Isolate、taskRunner等对象 。再经过层层处理最终调用main.dart中main方法 , 执行runApp(Widget app)来处理整个Dart业务代码 。
4. TaskRunner工作原理Flutter引擎启动过程 , 会创建UI/GPU/IO这3个线程 , 会为这些线程依次创建MessageLoop对象 , 启动后处于epoll_wait等待状态 。对于Flutter的消息机制跟Android原生的消息机制有很多相似之处 , 都有消息(或者任务)、消息队列(或任务队列)以及Looper;有一点不同的是Android有一个Handler类 , 用于发送消息以及执行回调方法 , 相对应Flutter中有着相近功能的便是TaskRunner 。
推荐阅读
- 成茶拼配
- 中世纪后期煮茶茶具的演进
- 刨腹产如何坐月子
- 三明,茶叶生产技术开发取得明显成效
- 福建白茶的百年演进
- 福建九都,茶叶技术培训走进赖岭村
- 山楂果茶粉加工技术
- 福鼎白茶质量技术要求
- 人类移民火星可能吗 就现有技术而言,移民火星面临的最大问题
- 老茶人探索北方茶树越冬防护技术
