文章目录
一、浅谈跨平台开发
简单地说,跨平台开发就是“一石二鸟”的开发技术。早期没有跨平台框架的时候,开发者必须为同一应用的各个平台(比如Android、iOS、Windows 等)分别编写代码。这对开发者以及投资开发该应用的企业而言都是费时费力又花钱的工作。
跨平台开发就是只用一套代码就可以在Android、iOS等多个平台运行,避免了过高的维护成本,节省了大量时间与资源。
跨平台开发是当下最受欢迎、应用最广泛的框架之一。能实现跨平台开发的框架也五花八门,比如Cordova、Ionic、Weex、DCloud、
React Native、Flutter等。有很多框架因为性能不佳等各种原因已经渐渐退出历史舞台。但Flutter框架依旧地位坚挺,备受欢迎。
二、初识Flutter
1. Flutter面世
Flutter 是 Google 在2015年开源的 UI 工具包,作为新一代的跨平台方案,Flutter能帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台,而且Flutter是未来新操作系统Fuchsia的默认开发软件。
Flutter第一次亮相于2015年5月Dart开发者峰会上,初始名字叫做“Sky”,后更名为Flutter。
2017年5月Google发布第一个版本,并且在2018年12月初发布1.0稳定版,2019年MWC上发布1.2版本。截至笔者写这篇文章时(2021/02/13),Flutter 1.22 正式版已经发布。
Google目前正在大力推广Flutter,可以说是目前比较前沿的开发工具。国内目前也已经有不少大型项目接入Flutter,比如阿里的淘宝、头条的抖音、腾讯的NOW直播、绝地求生、QQ音乐等,都使用了Flutter开发。除此之外,还有一些其他中小型公司也在使用Flutter。
2. Flutter的优势
在 StackOverflow 2019 年的全球开发者问卷调查中,Flutter 被选为最受开发者欢迎的框架之一,超过了 TensorFlow 和 Node.js。Flutter能够获得如此多开发者的青睐,自然有它突出的优点:
- 跨平台开发
真正做了一套代码可以同时在Android和iOS等平台上运行,避免过高的维护成本,提高了开发效率。
- 性能优越
通过“自绘UI+原生系统”实现高帧率的流畅UI,性能更接近原生。使用Skia作为2D渲染引擎,使用Dart语言作为运行,以及使用Text作为文字排版引擎。
- 热重载快速开发
Flutter选用了Google于2011年推出的Dart作为其开发语言。Dart既可以是AOT(Ahead Of Time)编译,也可以是JIT(Just In Time)编译,其JIT编译的特性使Flutter在开发阶段可以达到亚秒级热重载,而且不会丢失状态,从而大大提升了开发效率。
- 访问本地功能和SDK
通过平台相关的API、第三方SDK和原生代码让应用变得强大易用。 Flutter允许复用现有的Java、Swift或ObjC代码,访问iOS和Android上的原生系统功能和系统SDK。
- 精美的UI
Flutter内置众多精美的Material Design和Cupertino(iOS风格)小部件,提供了可定制的 UI 框架,不再受制于手机平台控件。开发者可快速构建精美的用户界面,以提供更好的用户体验。
- 支持混合开发
Flutter拥有丰富的工具和库,可以轻松地同时在iOS和Android系统中实现各种的想法和创意。 如果你没有任何移动端开发体验,Flutter将是一个轻松快捷的框架帮助你构建漂亮的移动应用程序。 如果你是一位经验丰富的iOS或Android开发人员,则可以使用Flutter作为视图(View)层, 并使用已经用Java、ObjC或者Swift完成的部分,从而获得统一的应用开发体验。
- 学习成本低
具有前端或者原生开发经验的读者,学Flutter将比较省力。
3. Flutter的不足
每一个跨平台框架都有各自的优势和不足,Flutter也不例外。总得来说,Flutter有以下不足:
- Flutter框架诞生不久,有部分功能可能会欠缺。
- Flutter不支持开发Android TV和Apple TV上的应用。
- 相比JS和TS,Flutter目前可用的包还比较少。
这些不足还是源于Flutter面世时间尚短,但作为Google大力扶持的一个框架,Flutter面临的这些不足未来将会逐一被解决。
三、Flutter整体架构与原理
Flutter框架分为两个部分,上层是开源的Framework,下层是Engine。可以理解为基于Framework开发应用并再Engine里运行。
1. Framework层
Framework层是由Dart实现的,包含视觉库(Widgets)、渲染、动画、绘图和手势等。视觉库又分为Material风格和Cupertino风格两种。Framework含有日常开发所需要的大量API,普通应用开发熟悉这些API的使用基本上就OK了,不过很多特殊场景的控件需要自己根据实际情况进行自定义。
Framework包含的两套视觉库,Material是Android风格的,Cupertino是iOS风格的。开发者可以在此基础上,封装自己风格的系统组件。
Framework层的源码地址:
https://github.com/flutter/flutter/tree/master/packages/flutter/lib
2. Engine层
Engine层是由C++实现的,是Flutter的核心引擎,主要包括Skia图形引擎、Dart运行时的环境Dart VM、Text文本渲染引擎等。
如果想深入了解Flutter原理,建议阅读该层的源代码。源代码地址:
https://github.com/flutter/engine
3. 原理
无论是iOS还是Android,都是提供一个平台的View给Flutter层,页面内容渲染交由Flutter层自身来完成,所以Flutter相对React Native等框架性能更好。Flutter中图形渲染流程如下:
大致流程如下:
- GPU的Vsync信号同步到UI线程;
- UI线程使用Dart来构建抽象的视图结构;
- 视图结构在GPU线程中进行图层合成;
- 合成后的视图数据提供给Skia图形引擎处理成GPU数据;
- 数据再通过OpenGL或Vulkan提供给GPU进行渲染。
四、为什么选择Flutter
Flutter虽然是全新的跨平台解决方案,但已经相对成熟。与React Native相比,Flutter的性能显然要出色许多。此外,Flutter的其他一些特性,也让其成为跨平台开发的终极之选:
- 原生ARM代码
Flutter 有一个名为原生ARM 的功能,对初创企业和科技公司而言很有意义。
它可以帮助开发者更轻松地实现自己的想法,为应用项目带来最显著的优势。
- Web 视图组件
这一功能使用户可以轻松地在移动应用中查看Web 内容。此外,Flutter 还让
应用中的页面跳转和稳定更加容易。
- Android 应用包
Flutter 支持Android 应用包,这是一种新的上传格式,包含应用程序的所有编译代码和资源。这种格式可以加快APK 的打包和向Google Play 发布的流程。
- 无需手动管理多个APK
这些功能让用户可以下载更小、更优化的APK。开发者也不需要为了支持多种设备而构建、发布和管理多个APK 。
- 减小APK 大小
Android 应用包使用的APK 拆分机制可以缩减应用的大小,并支持Android应用程序的动态交付等新功能。
- 动态功能模块
此功能允许开发者将某些功能和资源与应用程序的基础模块分离开来,并将前者添加到应用程序包中。例如,如果你的应用包含相机功能,则可以将其设为动态模块。之后当用户想要下载并安装这个功能时就可以按需操作了。
五、总结
综上所述,如果你想以较小的成本、较短的时间、较少的代码快速构建功能强大的跨平台应用,无论是否作为商用,Flutter无疑都是最佳的解决方案!