跨平台解决方案
- NativeScript
- Weex
- React Native
- Flutter
- …
Weex不支持横竖屏的切换
Flutter内部机制
以下内容描述了Flutter工具箱内部实现Flutter API的工作机制。由于Flutter组件的构建是基于渐进式组合的方式,因此UI构建包含了大量的组件。为了支持这些workload,Flutter采用次线性算法进行布局和构建widget以及数据结构,这些方法通过常量因素优化算法提高组件树tree surgery的效率。
Aggressive Composability(渐进式组合)
Flutter最具特色的方面是其“Aggressive Composability”特性(这里我理解并翻译为:渐进式组合特性)。
例如:在Flutter中,Padding是一个Widget组件,而不是作为Widget的一种属性。因此,在构建用户UI的时候,Flutter会用到非常多的Widgets,这也是Flutter中“一切皆Widget”这句话的由来。
Sublinear Layout( 次线性布局)
由于Flutter的UI构建过程会产生大量的组件和要渲染的对象,因此Flutter获得高性能的关键就是需要一个有效的算法支撑。
最重要的就是布局的性能,布局的性能是确定被渲染的对象的几何形状(如:大小、位置)的算法。
一些其他的工具使用的布局算法大部分都是或者更差。
Flutter的目标是使初始化布局的性能达到线性效果(意思是让布局的算法的复杂度接近)。
Sublinear widget building(次线性组件构建)
与布局算法类似,Fluter的widget构建算法也是次线性的。
Linear reconciliation(线性调和)
Flutter没有采用tree-diffing算法。相反,框架通过使用算法来检查每个元素的子集列表来决定是否重用元素。
Tree Surgery(Tree 裁剪)
常量-因素优化(Constant-factor optimizations)
除了上述算法优化之外,为了达成渐进式兼容同样也以来一些重要的常量因素优化。
- Child-model agnostic
- Visual render tree, logical widget tree
- Text handled by a specialized render object
- Observable objects
拆分Element和RenderObject树
RenderObject 和 Element(Widget)树在flutter中是同构的(严格来说,RenderObject树是Element树的子集)。一个明显的简化是将这些树合并成一棵树。但是在实际实践中,将这些树拆分是有如下好处的:
- 性能(Performance)
- 清晰(Clarity)
- 类型安全(Type Safety)
Flutter 概述
Flutter的引擎采用的核心技术包括:一个2D的图形渲染库 - Skia;Dart及其基于垃圾收集、面向对象的语言特性及相应的Dart VM管理技术;并将它们托管在Shell中。不同的平台有不同的Shell,例如Android和iOS都有各自的Shell。这些Shell实现特定于平台的代码(例如:与屏幕键盘(IME)进行通讯及系统应用程序的生命周期事件等)。
为提供最佳性能,Embedder 为 Flutter Engine 创建并管理线程(及Message Loops)。
主要的Task Runners包括:
- Platform Task Runner
- UI Task Runner
- GPU Task Runner
- IO Task Runner
Flutter Framework
参考资料
https://github.com/flutter/flutter/wiki/The-Framework-architecture
Dart VM简介
参考资料:
https://dart.dev/tools/dart-vm
https://mrale.ph/dartvm/
Runtime System(运行时系统)
对象模型(Object Model)
垃圾回收(Garbage Collection)
快照(Snapshots)
核心库原生方法
通过服务协议访问的开发体验组件
- Debugging
- Profiling
- Hot-reload(热重载)
JIT(Just-In-Time) & AOT(Ahead-Of-Time)
参考资料:
https://annatarhe.github.io/2019/01/31/introduction-to-dart-vm.html
- Dart Native:对于诸如面向移动设备、桌面、服务器的程序,Dart Native包括了既具有JIT编译功能的Dart VM,也包括了用于生成机器代码的AOT预编译器。
Flutter的Debug模式采用的是JIT编译,Release模式采用的是AOT编译。Flutter在Debug模式下能支持Hot Reload的根本原因正是采用了JIT编译方式。
JIT
JIT是指在程序运行中,将热点代码编译成机器码,提高运行效率,JIT也是实现热重载的技术。
AOT
AOT指运行前编译,指的是在程序运行之前,已经编译成对应平台的机器码,不需要在运行中解释编译就可以直接运行。常见的例子如C和C++。
编译器(Interpreter)
ARM模拟器
渲染引擎
Skia官方网址:https://skia.org
Widgets介绍
Flutter中的组件实际上是受到了React的启发。(因此,作为使用过React相关技术的同学,理解起来多少有一些优势。)
StatelessWidget类
无需操作state,stateless widget主要用于构建不依赖用户操作或交互的UI组件。
StatefulWidget类
Flutter与Web开发特性对比
‘Flutter Hot Reload’ vs ‘Webpack HMR’
https://tech.meituan.com/2018/08/09/waimai-flutter-practice.html
Webpack HMR原理解析
https://zhuanlan.zhihu.com/p/30669007
Webpack 热加载原理探索
http://shepherdwind.com/2017/02/07/webpack-hmr-principle/
Flutter Hot Reload详解
https://xiaozhuanlan.com/topic/0845671932
参考资料
关于AOT的google会议讨论
https://www.youtube.com/watch?v=lqE4u8s8Iik
Dart VM 简介
https://annatarhe.github.io/2019/01/31/introduction-to-dart-vm.html