Flutter在技术市场上的定位

324 阅读3分钟

跨平台开发与混合开发的区别

初步接触这两个词儿的人可能会觉得他们没有差别,但其实两者是完全隔离的概念。

跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。我们最早接触到跨平台这个词,可能是在Java语言身上。java是一种跨平台语言,确切的说,跨平台的并不是java这个开发语言,而是java生态中的一个重要环节--Java虚拟机(JVM),JVM在各种平台上都有自己的一套实现,比如 windows,mac,linux。他可以执行同一套java代码编译之后的字节码,并得到相同的运行结果。如果把JVM当成一个黑盒,那也可以认为Java语言本身就是跨平台的。

而混合开发,针对的则是 不同技术领域的人才整合。一套混合开发方案,应该能够支持 多种领域的开发人员在同一个软件框架中贡献自己的代码,所有人的代码打包编译,生成一个最终产物。

Flutter 在技术市场上的定位

Flutter严格来说是一套 跨平台的移动应用开发框架,编程语言是Dart。可以用一套Flutter工程,生成不同平台下的编译产物,比如 android平台下的apk,iOS设备上的ipa,windows平台上的exe,还有浏览器上的web程序包 等。 Flutter的开发者们可能来自各个不同的平台,android,iOS,web,pc等。为了开发一套跨平台的插件库,各个平台的开发者提供自己平台的plugin包,接入到一个Flutter plugin上,就形成了一个支持多平台的 Flutter库。

大部分时候我们更愿意使用纯Flutter的开发方式。但是谷歌可能为了切入现有的技术市场,也提供了将Flutter作为插件,挂靠在 其他平台应用上的方法。比如,一个 庞大的App原本是用 Android / iOS 原生去做的,现在要进行技术革新,引入Flutter。但是完全重构是不可能的,人力物力时间都不允许。比较理想的方式就是,原项目结构不变,在App上 引入Flutter模块,另外为了让Flutter、原生 模块能够正常跳转和传递数据,技术团队还会引入混合栈框架(如FlutterBoost,仅支持以原生作为底座,Flutter模块作为插件)。

就个人实践经验而言,最复杂的混合开发框架是,原生的底座,Flutter的插件,再用原生的WebView 嵌入H5 web页面。让前端H5,原生开发,Flutter开发,都能灵活参与,将人力成本灵活分配。 更新较快的业务代码用 H5,用较为稳定的原生WebView承载H5,其他模块用Flutter承担开发任务。

综上所述,无论是跨平台,还是混合开发,Flutter都有用武之地。

为什么Flutter应用有接近原生的性能?

有名的跨平台方案,诸如:React Native、Weex 等,都需要有一个桥阶层,将原本的语言代码进行解释转化,生成原生组件,导致界面渲染必然减慢:

image.png

而Flutter的dart代码,则在编译时直接编译不同平台的本地代码直接编译执行,无需转化桥阶层,效率自然不同。

image.png

Flutter是依靠FlutterEngine层运行在 android和iOS上的,这个engine是用c++写的,引擎中存在一个DVM部件,类似android的ART(Android Run Time)虚拟机,同样采用提前编译AOT(ahead of time)技术,在app安装时就将代码编译成机器语言,提高了app的启动性能。

Flutter自带渲染引擎Skia,这是android系统的自带引擎,而iOS工程,则会把这个引擎当作依赖打包到app中,渲染UI时就相当于企业内部沟通,比RN这种通过桥接去进行渲染的效率就高得多了。