导语 | Flutter 框架是当下非常热门的跨端解决方案,能够帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面等多端开发。但仍然有很多产品、设计、甚至开发同学并不了解 Flutter,所以本文将深入浅出和大家聊聊 Flutter 的设计背景、技术特点,以及与其他同类技术之间的对比,希望与大家一同交流。

一、跨平台背景

1. 移动互联网的重要性

如上图所示,与2019年1月相比,全球使用互联网的人数已增加到45.4亿,增长了7%(2.98亿新用户)。

到2020年1月,全球有38亿社交媒体用户,与去年同期相比,这个数字增长了9%以上(3.21亿新用户)。

在全球范围内,现在有超过51.9亿人使用手机,在过去的一年中,用户数量增加了1.24亿(2.4%)。

现在,普通的互联网用户每天在线花费6个小时43分钟,相当于每个互联网用户每年连接时间超过100天。如果我们每天需要大约8小时的睡眠,那就意味着醒来的时间中,有40%以上是通过互联网度过的。

在移动互联网的浪潮下,开发效率和使用体验可以说是同等重要。但是,使用原生的方式来开发 App,就要求我们必须针对 iOS 和 Android 这两个平台分别开发。

这样就导致了我们不仅需要在不同的项目间尝试用不同的语言去实现同样的功能,还要承担由此带来的维护任务。如果还要继续向其他平台(比如 Web、Mac 或 Windows)拓展的话,需要付出的时间和成本将成倍增长。而这,显然是难以接受的。于是,跨平台开发的概念顺势走进了大家的视野。

从本质上讲,跨平台开发是为了增加业务代码的复用率,减少因为要适配多个平台带来的工作量,从而降低开发成本。

2. 跨平台开发方案的三个时代

根据实现方式的不同,业内常见的观点是将主流的跨平台方案划分为三个时代。

(1)Web 容器时代

基于 Web 相关技术通过浏览器组件来实现界面及功能,典型的框架包括 Cordova(PhoneGap)、Ionic 和微信小程序。

Web 时代的方案,主要采用的是原生应用内嵌浏览器控件 WebView 的方式进行 HTML5 页面渲染。

由于采用了 Web 开发技术,社区和资源非常丰富,开发效率也很高。但是,一个完整 HTML5 页面的展示要经历浏览器控件的加载、解析和渲染三大过程,性能消耗要比原生开发增加 N 个数量级。

(2)泛 Web 容器时代

采用类 Web 标准进行开发,但在运行时把绘制和渲染交由原生系统接管的技术,代表框架有 React Native、Weex 和快应用,广义的还包括天猫的 Virtual View 等。

泛 Web 容器时代的解决方案优化了 Web 容器时代的加载、解析和渲染这三大过程,把影响它们独立运行的 Web 标准进行了裁剪,以相对简单的方式支持了构建移动端页面必要的 Web 标准(如 Flexbox 等),也保证了便捷的前端开发体验。

同时,采用原生自带的 UI 组件实现代替了核心的渲染引擎,仅保持必要的基本控件渲染能力,从而使得渲染过程更加简化,也保证了良好的渲染性能。

也就是说,在泛 Web 容器时代,我们仍然采用前端友好的 JavaScript 进行开发,整体加载、渲染机制大大简化,并且由原生接管绘制,即将原生系统作为渲染的后端,为依托于 JavaScript 虚拟机的 JavaScript 代码提供所需要的 UI 控件的实体。

这也是现在绝大部分跨平台框架的思路,而 React Native 和 Weex 就是其中的佼佼者。总结起来其实就是利用 JS 来调用 Native 端的组件,从而实现相应的功能。

(3)自绘引擎时代

自带渲染引擎,客户端仅提供一块画布即可获得从业务逻辑到功能呈现的多端高度一致的渲染体验。Flutter,是为数不多的代表。

这一时期的代表 Flutter 开辟了一种全新的思路,即从头到尾重写一套跨平台的 UI 框架,包括渲染逻辑,甚至是开发语言。

渲染引擎依靠跨平台的 Skia 图形库来实现,Skia 引擎会将使用 Dart 构建的抽象的视图结构数据加工成 GPU 数据,交由 OpenGL 最终提供给 GPU 渲染,至此完成渲染闭环,因此可以在最大程度上保证一款应用在不同平台、不同设备上的体验一致性。

而开发语言选用的是同时支持 JIT(Just-in-Time,即时编译)和 AOT(Ahead-of-Time,预编译)的 Dart,不仅保证了开发效率,更提升了执行效率(比使用 JavaScript 开发的泛 Web 容器方案要高得多)。

二、Flutter 的前世今生

1. Flutter 出现的历史背景

为不同的操作系统开发拥有相同功能的应用程序,开发人员只有两个选择:

  • 使用原生开发语言(即 Java 和 Objective-C),针对不同平台分别进行开发;
  • 使用跨平台解决方案,对不同平台进行统一开发。

原生开发方式的体验最好,但研发效率和研发成本相对较高;而跨平台开发方式研发虽然效率高,但为了抹平多端平台差异,各类解决方案暴露的组件和 API 较原生开发相比少很多,因此研发体验和产品功能并不完美。

所以,最成功的跨平台开发方案其实是依托于浏览器控件的 Web。浏览器保证了 99% 的概率下 Web 的需求都是可以实现的,不需要业务“将就”技术。

不过,Web 最大的问题在于它的性能和体验与原生开发存在肉眼可感知的差异,因此并不适用于对体验要求较高的场景。

对于用户体验更接近于原生的 React Native,对业务的支持能力却还不到浏览器的 5%,仅适用于中低复杂度的低交互类页面。面对稍微复杂一点儿的交互和动画需求,开发者都需要 case by case 地去 review,甚至还可能要通过原生代码去扩展才能实现。

带着这些问题,我们终于迎来了本次的主角——Flutter。

Flutter 是构建 Google 物联网操作系统 Fuchsia 的 SDK,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App,一套代码可以同时运行在 iOS 和 Android 平台。Flutter 使用 Native 引擎渲染视图,并提供了丰富的组件和接口,这无疑为开发者和用户都提供了良好的体验。

那么,Flutter 是怎么完成组件渲染的呢?

这需要从图像显示的基本原理说起。在计算机系统中,图像的显示需要 CPU、GPU 和显示器一起配合完成:CPU 负责图像数据计算,GPU 负责图像数据渲染,而显示器则负责最终图像显示。

随后视频控制器会以每秒 60 次的速度,从帧缓冲区读取帧数据交由显示器完成图像显示。

可以看到,Flutter 关注如何尽可能快地在两个硬件时钟的 VSync 信号之间计算并合成视图数据,然后通过 Skia 交给 GPU 渲染:UI 线程使用 Dart 来构建视图结构数据,这些数据会在 GPU 线程进行图层合成,随后交给 Skia 引擎加工成 GPU 数据,而这些数据会通过 OpenGL 最终提供给 GPU 渲染。

2. 关于Skia

Skia是一个开源的 2D 图形库,提供各种常用的API,并可在多种软硬件平台上运行。谷歌Chrome浏览器、Chrome OS、安卓、Flutter、火狐浏览器、火狐操作系统以及其它许多产品都使用它作为图形引擎。

Skia 在图形转换、文字渲染、位图渲染方面都表现卓越,并提供了开发者友好的 API。

因此,架构于 Skia 之上的 Flutter,也因此拥有了彻底的跨平台渲染能力。通过与 Skia 的深度定制及优化,Flutter 可以最大限度地抹平平台差异,提高渲染效率与性能。

底层渲染能力统一了,上层开发接口和功能体验也就随即统一了,开发者再也不用操心平台相关的渲染特性了。也就是说,Skia 保证了同一套代码调用在 Android 和 iOS 平台上的渲染效果是完全一致的。

同样的在界面渲染、绘制的过程中,Flutter也做了很多优化处理,提升合成、渲染效率。

3. FLutter的优势

(1)在所有的平台下,都可以保持同样UI样式,同样的业务逻辑

大多数跨平台框架中的UI呈现如下图所示:

而Flutter是直接画在画布上:

(2)减少开发所需的时间

  • Flutter的热重载可以高效快速的看到改变,甚至保留应用状态;
  • 官方提供的各种现成的组件(Material和Cupertino)。

(3)快速迭代上线

不需要单独适配 iOS、Android 双端的 UI 层面。

(4)更接近native的性能表现

Flutter不依赖任何中间代码,最终直接构建成机器码,提高了性能。

(5)自定义复杂动画

Flutter最大的优势之一就是可以定制你在屏幕上看到的任何东西,不管它有多复杂。

(6)有自己的渲染引擎

Flutter使用Skia将界面渲染到平台提供的画布上,意味着不需调整,即可迁移到其他平台。

(7)更方便调用native api

获取GPS坐标、蓝牙通信、收集传感器数据、权限处理等,未支持的也可通过platform channel 。

(8)更高的潜力

iOS、Android、Web、Desktop…

三、Flutter 与 React Native (Hippy)

1. UI方面

在新旧设备上也能保持一致

Flutter动画效果:

2. 性能方面

基于 ListView ,我们做了一个基准测试。在 ListView 中,有1000个元素,并且到达列表最后一个元素的滚动时间相同,这里使用到了一些第三方库:

  • ios Nuke
  • Android Glide
  • react native React-native-fast-image

结果展示:

3. Flutter缺点

  • 开发者社区的规模和第三方库
  • 持续集成的能力
  • APK的大小
  • Dart语言学习成本
  • 动态更新能力

Q&A

Q:Flutter 和 Hippy 有什么区别,为什么用 Flutter,不用 Hippy?

A: 第一,Flutter开发效率高,可减少客户端开发时间;第二,Flutter 在跨端UI差异小;第三,Flutter 动画支持很全面;第四,它更接近native。

Q:Flutter 和 Hippy 在方案选型上有一些差异,比如自定义 UI 组件性能方面有哪些差异,接口怎么通信?

A:Flutter 自定义 UI 组件 platformview 的性能还有待提升,接口通信方面,Hippy 与客户端通过 jsbridge,而 Futter 是通过 methodchannel 。

Q:Flutter 为什么暂时还不支持动态更新?

A:初期考虑到应用安全和苹果方面的策略,所以不支持动态更新。现在 Android 端可以通过整包方式实现动态更新, iOS 目前还不支持。

学习分享,共勉

题外话,毕竟我在三星小米工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心,但很多FLutter兴趣爱好者进阶学习确实资料,今天我把我搜集和整理的这份学习资料分享给有需要的人,若有关Flutter学习进阶可以与我在Flutter跨平台开发终极之选交流群一起讨论交流。

如有需要获取完整的资料文档的朋友可以【点击我】免费获取。

目录

第一章 为什么 Flutter 是跨平台开发 的终极之选

01 这是为什么?
02 跨平台开发
03 什么是 Flutter
04 Flutter 的特性
05 Flutter 构建应用的工具
06 使用 Flutter 构建的热门应用
07 构建 Flutter 应用的成本
08 结论

第二章 在 Windows 上搭建 Flutter 开发环境

01 使用镜像
02 系统要求
03 获取 Flutter SDK
04 编辑器设置
05Android 设置

第三章 编写您的第一个 Flutter App(含源码)

第 1 步: 创建 Flutter app
第 2 步: 使用外部包(package)
第 3 步: 添加一个 有状态的部件(Stateful widget)
第 4 步: 创建一个无限滚动 ListView
第 5 步: 添加交互
第 6 步: 导航到新页面
第 7 步:使用主题更改 UI

第四章 Flutter 开发环境搭建和调试

1.开发环境的搭建
2.模拟器的安装与调试
3…开发环境的搭建
4.模拟器的安装与调试

第五章 Dart 语法篇之基础语法(一)

简述:
一、Hello Dart
二、数据类型
三、变量和常量
四、集合(List、Set、Map)
五、流程控制
六、运算符
七、异常
八、函数

Flutter 技术进阶精编笔记预览图

第六章 Dart 语法篇之集合的使用与源码 解析(二)
第七章 Dart 语法篇之集合操作符函数与 源码分析(三)
第八章 Dart 语法篇之函数的使用(四)
第九章 Dart 语法篇之面向对象基础(五
第十章 Dart 语法篇之面向对象继承和 Mixins(六)
第十二章 Dart 语法篇之类型系统与泛型 (七)
第十三章 Flutter 中的 widget

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

如有需要获取完整的资料文档的朋友可以【点击我】免费获取。

腾讯技术团队整理,为什么 Flutter 能最好地改变移动开发的更多相关文章

  1. 腾讯QQ会员技术团队:人人都可以做深度学习应用:入门篇(下)

    四.经典入门demo:识别手写数字(MNIST) 常规的编程入门有"Hello world"程序,而深度学习的入门程序则是MNIST,一个识别28*28像素的图片中的手写数字的程序 ...

  2. 腾讯QQ会员技术团队:以手机QQ会员H5加速为例,为你揭开sonic技术内幕

    目前移动端越多越多的网页开始H5化,一方面可以减少安装包体积,另一方面也方便运营.但是相对于原生界面而言,H5的慢速问题一定被大家所诟病,针对这个问题,目前手Q存在几种方案,最常见的便是离线包方案,但 ...

  3. 精选腾讯技术干货200+篇,云加社区全年沙龙PPT免费下载!

    2019年已经过去,小编为大家整理了这一年以来云加社区发布的 200多篇腾讯干货,点击文章标题即可跳转到原文,请速速收藏哦~ 看腾讯技术: 腾讯成本优化黑科技:整机CPU利用率最高提升至90%: 腾讯 ...

  4. CTO俱乐部下午茶:技术团队管理中的那些事儿

    摘要:"CTO下午茶"是一种有效的集体对话的模式,参加活动的成员在真诚互动和共同学习的宗旨下齐聚一堂,在喝茶聊天氛围下交流工作心得.本期"CTO下午茶"的主题是 ...

  5. 腾讯技术分享:Android版手机QQ的缓存监控与优化实践

    本文内容整理自公众号腾讯Bugly,感谢原作者的分享. 1.问题背景 对于Android应用来说,内存向来是比较重要的性能指标.内存占用过高,会影响应用的流畅度,甚至引发OOM,非常影响用户体验.因此 ...

  6. 如何开发一款堪比APP的微信小程序(腾讯内部团队分享)

    一夜之间,微信小程序刷爆了行业网站和朋友圈,小程序真的能如张小龙所说让用户"即用即走"吗? 其功能能和动辄几十兆安装文件的APP相比吗? 开发小程序,是不是意味着移动应用开发的一次 ...

  7. BAT 技术团队博客

    1. 美团技术团队博客:  地址: http://tech.meituan.com/ 2. 腾讯社交用户体验设计(ISUX) 地址:http://isux.tencent.com/ 3. 京东设计中心 ...

  8. <转>技术团队新官上任之基层篇

    发表于2013-09-04 17:17| 10455次阅读| 来源<程序员>| 35 条评论| 作者高博 <程序员>杂志2013年9月刊技术团队管理EMC高博CTO 摘要:从技 ...

  9. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

随机推荐

  1. 33、jQuery介绍

    33.1.jQuery是什么: (1)jQuery由John Resig创建,至今已吸引了来自世界各地的众多 javascript 高手加入其team. (2)jQuery是继prototype之后又 ...

  2. CRM企业管理系统对于企业的价值

    对于企业来说,一个完整的工作流程可以概括为三个阶段:售前.售中.售后.每个阶段都需要不同的管理.此外,客户关系管理客户关系管理系统可以帮助企业在这三个阶段进行业务管理和客户管理,帮助企业更好地运作,增 ...

  3. 别错过了,130+个微信小程序源码 “限时分享“

    ​里面有130+款微信小程序源码和效果图,我只放了其中几款小程序的截图,具体请看下方图片 ​ ​ ​ ​ ​ ​ ​ ​ 仿网易云音乐小程序源码 链接:https://pan.baidu.com/s/ ...

  4. AcWing 106. 动态中位数

    依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. #include<bits/stdc++.h> using namespace std; pri ...

  5. docker安装和配置nginx

    配置nginx docker配置nginx 本机ip是192.168.0.200 docker pull nginx 配置nginx主机 vi /root/docker/nginx/nginx01.c ...

  6. shell中的特殊变量IFS

    shell中特殊变量IFS的使用 IFS是内部字段分隔符(internal field separator).默认情况下,bash shell会将空格.制表符.换行符 当做字段分隔符. IFS=$'\ ...

  7. Archive for required library:’ WebRoot/WEB-INF/Mytag.tld’in project ‘TagTest’ cannot be read or is not a valid ZIP file

    Description::部署tld文件时报错 我的解决方法: 右击(当前项目)->Build Path->Java Build Path ( Configure Build Path.. ...

  8. ESP32-性能监控笔记

    基于ESP-IDF4.1 1 #include <stdio.h> 2 #include <string.h> 3 #include <unistd.h> 4 #i ...

  9. Appearance-Based Loop Closure Detection for Online Large-Scale and Long-Term Operation

    Abstract: 本文提出一种用于大规模的长期回环检测,基于一种内存管理方法:限制用于回环检测的位置数目,以满足实时性要求. introduction: 大场景存在的最关键问题:随着场景增大,回环检 ...

  10. 使用deepin系统自带命令切割视频使用lossless免费软件切割

    1,使用ffmpeg命令:ffmpeg -ss 00:00:10 -i gaodengshuxue.mp4 -vcodec copy -acodec copy -t 00:00:20 output.m ...