共计 4460 个字符,预计需要花费 12 分钟才能阅读完成。
Flutter 初见
本文概述:
- 文章以跨平台开发为背景,探讨了跨平台开发技术的倒退历史,以及 Flutter 的劣势。
-
思维导图:
学习跨平台技术的必要性
-
传统挪动端原生开发弊病:
- 传统的原生开发须要保护 Android、IOS 两个平台;
-
应用 Flutter 进行挪动端开发的长处:
- Flutter 为跨平台的 UI 框架,
- 真正做到一套代码多端应用,减少代码复用,易保护;
- 在于求职中,若具备跨平台开发能力,将具备更强的市场竞争力;
跨平台开发倒退历史:
第一阶段:纯原生开发
- 开发成本大:须要保护 Android 与 IOS 两套代码;
-
动态化需要:需要发生变化时,纯原生利用大多须要通过版本升级来更新内容。
- 短少热更新
- 原生开发不可代替的劣势:性能劣势
-
混合开发呈现的起因:
- 当硬件设施性能晋升,反哺开发模式,即,可就义一部分性能应用混合开发,以缩小开发成本。
第二阶段:基于 WebView 的 PhoneGap & Cordova(H5)
-
呈现机会:
- 在 20008 年提出
PhoneGap
,其采纳HTML + CSS + JavaScript
,依靠于 Android 内置WebView
实现混合开发,声称靠近原生性能。后衍生出Cordova
,这个是从PhoneGap
中抽离出的外围代码,因为收买起因,所以改了名字,其实还是一套代码;
- 在 20008 年提出
-
技术现状:
- 除了简略页面外,在思考性能时,根本不会采纳此种跨平台伎俩。
-
底层机制:
- 在 Android 中应用
WebView
加载HTML
,HTML
传给JS
一个JavaInterface
,Js
通过传入的JavaInterface
进而调用到 Android 上的代码。 -
图示:
- 在 Android 中应用
-
外围代码:HTML 要与原生进行交互
- Java 代码:应用
WebView
加载HTML
,HTML
传给JS
一个JavaInterface
webview.addJavaInterface(new AndroidPlatform(this),"android");
- Js 代码:
Js
通过传入的JavaInterface
进而调用到 Android 上的代码。
<button type= "button" onclick = "android".toast('在 JS 中,通过传入的 JavaInterface 调用 Android 平台的代码(toast)')> 按钮 </button>
- AndroidPlatform.class
public class AndroidPlatform{ private Context mContext; public AndroidPlatform(Context context){// 结构 mContext = context.getApplicationContext();} @JavascriptInterface public void toast(String msg){Toast.makeText(mContext,msg,Toast.LENGTH_SHORT).show();} }
- Java 代码:应用
-
技术长处:
- 构造较为清晰,写起来比较简单
-
存在的问题:
- 兼容性太差:因为手机厂商的不同,所以细节上的实现也不同
-
渲染性能太差:加载
HTML
十分迟缓- 并且
HTML
中可能充斥过多JS
代码,而JS
可是 解释型语言,其执行效率太差了。 -
补充:Java 不是编译型也不是解释型
- Java 先编译成
xxx.class
文件,再交由虚拟机解释执行;但存在JIT
,且Java9 引入了 AOT
- Java 先编译成
- 并且
-
内存透露:
WebView 的一大弊病
- 惯例伎俩:将
WebView
放入子过程,用完就杀掉 - 底层机制:在应用
WebView
过程中耗费的内存,Android 不能在不须要的时候将其及时回收,因而导致内存越用越少
- 惯例伎俩:将
-
倒退历史:渲染效率
- 思路:应用
WebView
渲染效率太差,那么,如果能够将渲染操作交给原生平台,这就十分好了。 - 后果:Facebook 在 2015 年提出
RN(React Navtie)
- 思路:应用
第三阶段:RN 的呈现:2015 年 — 2018 年
-
呈现机会:
- 2015 年 4 月 Facebook 开源了 JS 框架 React 在挪动端的衍生物 React Native。
-
技术现状:
- RN 学习老本高,且性能依然存在瓶颈(JS 通过桥与原生进行渲染);
-
2017 年百度全面放弃 RN。
- Facebook + BSD + Patents 许可协定引起的寰球风暴,导致 BAT 弃用;
- 因为用了 RN 后,本人搞出的专利都要收费(其实不是这个问题,实际上是公司之间的纠纷)
-
底层实现机制:渲染交由原生平台,但
Bridge
老本过高-
图示:
- 代码执行逻辑:程序员写好
Js
代码后,通过Bridge
与具体平台交互。平台读取Js
配置后,执行操作(new Button 等), 留神,此时应用的是原生代码进行渲染
-
-
与原生开发相较:更新 UI 时
- 原生开发中的
XML
是动态的:在更新 UI 时,咱们仅需操作的是原生Java
代码 - RN 开发中:所有代码都是应用
Js
,那么在更新 UI 时,仍需原生平台通过Bridge
读取Js
代码后,能力更新 UI,相较于原生开发,RN 开发每次操作都须要多走一个Bridge
,那么,Bridge
老本太高。
- 原生开发中的
-
演变历史:
- 思路:如果说,呈现一款框架能将咱们写好的代码,间接编译成各平台原生开发编译后的后果(机器码),就好了。
- 后果:依据此愿景,衍生出 Flutter;
第四阶段:Flutter 的呈现:2018 — 至今
-
呈现机会:
- Flutter Beta1 于 2018 年开发者大会呈现于公众视线,甚至还没有公布正式版本时,国内头部互联网已开始联手推广。依靠于 Google,声称对标原生性能,具备更加标准的开发模式;
-
技术现状:
- 由咸鱼团队率先引入,并在大厂逐渐站稳脚跟。
-
图示:
-
底层实现机制:应用 Dart 语言,配合 Dart 虚拟机,Flutter 将代码编译后,间接就称为了对应平台的机器码;
-
节俭掉了
Bridge
:Flutter 依据不同的平台,编译成对应平台的机器码。- 编译型语言,性能最好,然而没方法跨平台;
-
补充:
- Java 能够跨平台,然而 JVM 不能跨平台
- NDK 就不是跨平台,平台是指具体的操作系统;
- DVM 是什么:Dart 语言的虚拟机,就是一个虚拟环境。
-
Flutter 根本介绍:
概述
- Google 跨平台挪动 UI 框架,能够兼容现有代码,且完全免费开源。
- 应用 DVM(dart 虚拟机) 防止了
Bridge
的交互,Flutter 代码在编译后可在挪动端平台间接运行 -
补充:Fuchsia 零碎
- 在 2019 年华为在测试这个零碎,这是 Google 开发的第三个零碎(Google Chrome、Android、fuchsia)
整体架构:
-
示意图:
-
FrameWork 层:为业务代码提供 API
- 提供各种根底组件库,包含各种 Widget、动画等
-
Engine 层:
- 由 C ++ 编写,下载的 Flutter 时候须要区别不同的操作系统,因为 C ++ 是不能跨平台的
- Skia:是 Android 中绘图的底层,
native
的JNI
代码就是用这个的,Chrome 浏览器中也是这个 - 虚拟机就在这 Engine 层
Flutter 倒退历史
-
倒退历史:
-
补充:
Dart 语言的倒退历史
- 因为 Google 外部对
JS
的不满,其开发出Dart
语言,并在 Chrome 浏览器中内置了Dart 虚拟机
,为Dart 语言
提供了执行环境。因为 Chrome 浏览器影响微小,Dart 语言
也在前端开发中占据一席之地。 Node.js
呈现又让Js
焕发第二春,其充斥前端、后端、挪动端。甚至呈现能被 Js 实现的,终究会被 Js 实现
等。Dart 语言
也逐步淡出公众视线,甚至 Dart 虚拟机也被从 Chrome 中移除了。
- 因为 Google 外部对
Flutter 特点:
-
疾速开发:热重载
-
是什么:亚秒级批改,跟之前的
instant run
相似- 但 AS 提供的
instant run
在批改 UI 后,不必重新安装,即可查问到其装置在手机上后的实在成果; - 然而这个有点坑,基本上不必这个
- 但 AS 提供的
-
有什么用:节俭
重复装置、运行以测试
的工夫- 批改 UI 后,CTRL + S 就能够看到更新后的 UI,不必重新安装、运行。
- 但,这个是有肯定弊病的,本质上只重载了特定区域的代码。
-
热重载的底层原理:
- 当咱们对我的项目,批改一部分代码后。Flutter,将咱们批改的中央,搞成一个配置文件,交给 DVM;
- 其底层应用的 WebSocket,在 PC 端启动一个服务,手机端也连贯这个服务,这样就实现全双工通信。
-
-
富裕表现力和灵便的 UI
- UI 设计师个别都是依照 IOS 设计的,然而 Android 中往往没有,这个时候须要咱们自定义 UI;
- Flutter 内置了许多
widget 组件
,其对立了 App 的格调;
-
本地性能:Flutter 声称其媲美原生性能
- 只是较为趋近而已,Flutter 还是多了一层 Engine 层;然而还是算是目前性能最好的了
Flutter 开发与原生开发的比照:
-
从任玉刚大佬的博客能够看出如下几点
-
安装包体积:雷同性能
- 原生 APK 须要 1.3MB
<!—->
- Flutter APK 须要 7.5MB
-
运行性能比照:雷同性能
-
CPU 资源占用:
- 原生开发 CPU 占用率在 26.8%,且占用率曲线安稳
- Flutter CPU 占用率在 35.5%,且占用率曲线平缓
-
内存占用:两者相似
- 但 Flutter 略高于原生开发
-
-
怎么判断一个 App 是否是 Flutter 开发的?
-
以腾讯 Now 直播为例;
- 将其解压后在 lib 目录下,查看发现有 libflutter.so 那么就是了;
<!—->
-
- Flutter 架构中的
Engine 层
就在这个文件
- Flutter 架构中的
- lib 目录中的
.so 文件
是由 C /C++ 编译而成的,就是由NDK
开发而成的,其作用能够简略看做 Java 类库
Dart 语言根本介绍
位置:
- Google 亲儿子,Flutter 官网指定语言
反对混合编译:JIT & AOT
-
基于
JIT
的疾速开发周期- Flutter 在开发阶段采纳
JIT
模式,防止每次改变都要进行编译,极大节俭开发工夫 -
补充:什么是
JIT (just in time)
-
在
Java
在解释执行时,将热点代码段应用JIT
编译成本地代码(机器码);- 在程序执行期间,实时将代码编译成机器码
- Flutter 在
DeBug
模式下,应用JIT
,及时处理热点代码,间接将这段代码部署在终端设备上,防止反复编译 JIT
的毛病:其须要在执行后,挑选出热点代码,编译成机器码,导致 Flutter 在DeBug 模式
下的效率不如Release 模式(应用的是 AOT)
-
- Flutter 在开发阶段采纳
-
基于
AOT
的公布包- Flutter 在公布时,能够通过
AOT
生成高效的ARM
代码以保障利用性能; - Flutter 在
Release
模式下就是应用AOT
,此时,间接运行机器码
- Flutter 在公布时,能够通过
Flutter 高刷新率:120 fps
-
概述:
- Flutter 声称,能在一秒中刷新 120 张图片;
- 人眼在 15 fps 就感觉很晦涩了,游戏个别在 30 fps 以上;
- 为了保障疾速的用户体验,须要可能在每个动画帧运行大量代码,不能有周期性的进展,否则会造成掉帧;
-
Dart 语言:
-
单线程:
isolate
机制- 不须要锁,不存在数据竞争和变量状态同步,其也没有线程上下文切换带来的性能损耗和锁导致的卡顿
-
垃圾回收:多生代无锁垃圾回收器,专门为 UI 框架中常见的大量
widget
对象创立和销毁优化。- 新生代中寄存大量长期对象,此处会产生频繁垃圾回收;
- 回收不了的,其
gc 分代年龄
减少,满足条件后晋入老年代
-