**一、首先先对三种跨端语言做一下比较**
语言
|
使用的开发语言
|
开发公司
|
原理
|
特点
|
weex
|
Vue V8
|
阿里巴巴
|
生成原生View
|
热更新,适合单页面
|
Flutter
|
Dart
|
Google
|
使用Skia在原生App中渲染画面
|
跨多端、UI流畅、开发快速
|
RN
|
React JSCore
|
FaceBook
|
生成原生View
|
热更新
|
**二、Flutter 如何解决热更新问题**
腾讯:MXFlutter
GitHub Android: [https://github.com/magicbaby810/HotfixFlutter](https://github.com/magicbaby810/HotfixFlutter)
Flutter 代码产物替换 Android:[https://juejin.cn/post/6844903992066048013](https://juejin.cn/post/6844903992066048013)
AST Runtime方案:[https://juejin.cn/post/6855129008083271694](https://juejin.cn/post/6855129008083271694)
**三、Flutter 架构**
**Flutter框架分三层:Framework,Engine, Embedder**
Framework使用dart语言实现,包括UI,文本,图片,按钮等Widgets,渲染,动画,手势等。此部分的核心代码是flutter仓库下的flutter package,以及sky_engine仓库下的 io, async, ui(dart:ui库提供了Flutter框架和引擎之间的接口)等package。
Engine使用C++实现,主要包括:Skia, Dart 和 Text。
- Skia是开源的二维图形库,提供了适用于多种软硬件平台的通用API。其已作为Google Chrome,Chrome OS,Android, Mozilla Firefox, Firefox OS等其他众多产品的图形引擎,支持平台还包括Windows, macOS, iOS,Android,Ubuntu等。
- Dart 部分主要包括:Dart Runtime,Garbage Collection(GC),如果是Debug模式的话,还包括JIT(Just In Time)支持。Release和Profile模式下,是AOT(Ahead Of Time)编译成了原生的arm代码,并不存在JIT部分。
- Text 即文本渲染,其渲染层次如下:衍生自 Minikin的libtxt库(用于字体选择,分隔行);HartBuzz用于字形选择和成型;Skia作为渲染/GPU后端,在Android和Fuchsia上使用FreeType渲染,在iOS上使用CoreGraphics来渲染字体。
Embedder是一个嵌入层,通过该层把Flutter嵌入到各个平台上去,Embedder的主要工作包括渲染Surface设置, 线程设置,以及插件等。平台(如iOS)只是提供一个画布,剩余的所有渲染相关的逻辑都在Flutter内部,这就使得它具有了很好的跨端一致性。
**四、Dart 语言特点**
特点:
1、AOT。Release和Profile模式下使用AOT编译方式。类似的语言有C++/C/Java等
2、JIT。Debug模式下使用JIT编译方式。类似的语言有PHP/Python/Java Script等
3、UI、动画流畅
4、支持Android/iOS/Web/Windows/Mac等。
5、单进程。独特的隔离区( Isolate ),可以实现多线程
**线程管理:**
Flutter Engine自己不创建, 管理线程。Flutter Engine线程的创建和管理是由embedder负责的。Embeder提供四个Task Runner, 每个Task Runner负责不同的任务
1、Platform Task Runner
2、UI Task Runner
3、GPU Task Runner
4、IO Task Runner
**isolate:**
isolate是Dart对actor并发模式的实现。运行中的Dart程序由一个或多个actor组成,actor也就是Dart概念里面的isolate。isolate是隔离的,每个isolate有自己的内存和单线程运行的实体. isolate之间不互相共 享内存,且独立GC。
isolate中的代码是顺序执行的,且是单线程,所以不存在资源竞争和变量状态同步的问题,也就不需要锁。Dart中的并发都是多个isolate并行实现的
由于isolate不共享内存,所以isolate之间不能直接互相通信,只能通过Port进行通信,而且是异步的
Flutter和iOS中异步任务罗列
Flutter
|
iOS
|
Isolate
|
NSThread
|
Future
|
NSOperation
|
asyc await
|
Dispatch
|
stream 订阅
|
GCD
|
广播订阅
|
**Flutter Platform Channel:**
1、BasicMessageChannel:用于传递字符串和半结构化的信息
2、MethodChannel:用于传递方法调用(method invocation)
3、EventChannel: 用于数据流(event streams)的通信