1:原生开发与跨平台技术对比
1.1 原生开发
原生应用程序是指某一个移动平台(比如iOS或安卓)所特有的应用,使用相应平台支持的开发工具和语言,并直接调用系统提供的SDK API,原生开发有以下主要优势:
- 可访问平台全部功能(GPS、摄像头);
- 速度快、性能高、可以实现复杂动画及绘制,整体用户体验好;
主要缺点:
- 平台特定,开发成本高;不同平台必须维护不同代码,人力成本随之变大;
- 内容固定,动态化弱,大多数情况下,有新功能更新时只能发版;
1.2 跨平台技术简介
针对原生开发面临问题,跨平台技术应运而生,根据其原理,主要分为三类:
- H5+原生(Cordova、Ionic、微信小程序)
- JavaScript开发+原生渲染 (React Native、Weex、快应用)
- 自绘UI+原生(QT for mobile、Flutter)
下面主要说一下第三种(自绘UI+原生)跨平台技术方案(其他方案介绍请查看移动技术简介 )这种技术的思路是,通过在不同平台实现一个统一接口的渲染引擎来绘制UI,而不依赖系统原生控件,所以可以做到不同平台UI的一致性。<mark>注意,自绘引擎解决的是UI的跨平台问题,如果涉及其它系统能力调用,依然要涉及原生开发</mark>基于此目前Flutter的优缺点如下:
主要优点
- 性能高;由于自绘引擎是直接调用系统API来绘制UI,所以性能和原生控件接近。
- 灵活、组件库易维护、UI外观保真度和一致性高;由于UI渲染不依赖原生控件,也就不需要根据不同平台的控件单独维护一套组件库,所以代码容易维护。
- 开发效率:Flutter的热重载可帮助开发者快速地进行测试、构建UI、添加功能并更快地修复错误。在iOS和Android模拟器或真机上可以实现毫秒级热重载,并且不会丢失状态。
主要缺点
- 动态性不足;为了保证UI绘制性能,自绘UI系统一般都会采用AOT模式编译其发布包,所以应用发布后,不能像Hybrid和RN那些使用JavaScript(JIT)作为开发语言的框架那样动态下发代码。
- 现阶段APP启动速度低于原生APP,因为Appqi因存在Flutter运行时环境的初始化过程
- 特定功能性能略低于Native:混合栈或部分功能需要基于Native来实现
- Flutter不支持直接操作摄像机、GPS等硬件以及平台相关的一些服务
针对移动端的系统底层的一些服务以及硬件相关的操作,目前有两种方案:
1: flutter官方插件管理平台pub提供了一些基础的插件开发者使用.这些插件的基本原理是内部封装iOS和android端的原生API,对上层调用者提供统一的dart接口(例如:操作摄像头的camera 插件,用于本地文件存储的shared_preferences 插件)。
2:开发者自己开发一些插件供Flutter调用(需要对两端系统sdk都比较了解)
- Flutter安装包比原生安装包大很多(主要是工程包含flutter SDK ,并且flutter不支持bitCode)。
- Flutter内存占用比较大详见闲鱼技术团队对Android Flutter内存初探文章
2:Flutter应用概况
2.1.国内使用Flutter的主流应用
-
o闲鱼:混合栈模式,宝贝详情页等10+页面采用了Flutter
o京东金融:混合栈模式
o腾讯Now直播:仅iOS
2.2.国外使用Flutter的主流应用
- oGoogle Ads
- oHamilton Musical
- oAbbey Road Studios
- oReflectly
- oAppTree:仅Android
2.3.Flutter社区App列表
Flutter社区App列表
这个社区收集了热度较高的Flutter App数据,总数为346个,其中92个为开源项目
2.4.GitHub的Flutter项目列表
GitHub的Flutter项目列表
GitHub上flutter相关的项目有23,323个,其中分布于各平台的特性插件大致有5K+,Android的有400+
总结:
经过调研我认为,Flutter确实解决了UI的跨平台问题,UI层面性能接近原生,目前确实发展十分迅速,但是生态远远没到成熟的地步,这对于资源有限的应用开发团队来说是很致命的,且现在在开发调试上还是有些痛苦的,比如无法准确定位错误堆栈等。