今日头条 字节跳动 Flutter架构实践

2020-01-06 02:12:45 来源:网络


今日头条 字节跳动 Flutter架构实践


今日头条 字节跳动 Flutter架构实践


1

移动跨平台技术探究


◆ 为什么需要跨平台?

今日头条 字节跳动 Flutter架构实践

◆ 跨平台技术是如何发展起来的?


今日头条 字节跳动 Flutter架构实践

◆ 跨平台技术选型有哪些?

今日头条 字节跳动 Flutter架构实践


◆ Flutter有什么独特优势(为什么选择Flutter)?

今日头条 字节跳动 Flutter架构实践

◆ 为什么说Flutter是高性能的,体现在哪里?

今日头条 字节跳动 Flutter架构实践


2

Flutter引擎原理剖析

先来看看Flutter的技术架构图:


C++引擎四个核心线程


Flutter 里四个核心线程:平台线程、UI 线程、GPU 线程、IO 线程,它们的职责都是不一样的:

★ 平台线程(PlatformThread)对应着安卓和 iOS 的主线程。

★ UI线程(UI Thread)针对安卓本身的主线程,它就是一个独立的线程。

★ GPU线程(GPU Thread)运行在 GPU 上的线程,它主要是处理 Skia 相关的任务。

★ IO线程(IO Thread)主要处理IO有关的任务,比如:图片编解码等。


具体引擎架构图,如下图示所示:


今日头条 字节跳动 Flutter架构实践

Flutter如何编译成两个平台的应用程序

今日头条 字节跳动 Flutter架构实践

首先看下面的引擎代码是公共的部分,用于把程序的源代码编译Android和IOS两个平台的应用程序。中间左侧绿色部分Flutter针对Android生成的一些文件,然后最终通过引擎会编译生成Android的APK安装包,中间右侧蓝色部分是Flutter针对IOS平台生成的一些文件,然后最终通过引擎会编译会生成IOS平台的安装包。

线程通信(混合开发必须了解的难点)

今日头条 字节跳动 Flutter架构实践

这里以Android为例,对照Flutter做一个讲解。Flutter里面的线程主要依赖于Dart里面的一些API,比如我们常用的异步任务里面,需要用到:MicroTask和Future,就是非常重要和关键的。


我们可以看到技术是相通的,Android里面是一个Handler,对应一个Looper Thread,然后是一个MessageQueue,然后里面存放的是Message。很巧妙的是Flutter也有类似的做法,Flutter有一个Looper线程,主线程复用了Native的,然后为其他三个线程创建独立的Looper。不过与Android不同的是:Flutter用的是两个队列,一个是微任务队列(MicroTaskQueue),一个是普通延迟任务队列。Flutter会先处理为任务队列,再去处理普通任务队列。类比Android来讲,图中的TaskRunner类似于Handler,PostTask就是把一个消息放到一个消息队列的过程。和Android的Handler是很类似的。所以在学新技术的时候,举一反三,懂得变通才能学的更好。

Dart虚拟机

同一个进程里可以有很多 Isolate,两个 Isolate 的堆是不能共享的。Dart开发团队早就考虑到了交互的问题,于是就设计了一个VM Isolate,它是一个用户Isolate之间交互的桥梁,运行在 UI 线程中的。我们可以把数据放在内核态,因为这个内核态可以共享数据,然后把数据放到另一方的队列中,另一方就可以拿到和使用这些数据了。熟悉Android的朋友们应该听起来很熟悉,这就非常类似我们熟知的“进程间通信”。


今日头条 字节跳动 Flutter架构实践


可能这样讲还不是很清楚,具体流程是什么样的呢?请看下图:


今日头条 字节跳动 Flutter架构实践


Isolate1是发送方,创建一个SendPort ,Isolate2是接收方,创建一个ReceivePort。我们创建一个 Isolate的时候,它里面有一个 worker 线程,worker 线程里面可以放入Task。SendPort调用send方法,发送数据到PortMap里面,这个里面每一个port对应一个Isolate 的 MessageHandler,这个Handler包括两个内容:普通的消息队列,一个是 OOB 高优先级消息,数据放入队列顺序有优先级区分。最后消息被封装成一个 MessageTask,传送到另一个Isolate里面去。回想一下是不是类似于Android的消息队列?

Platform Channels

今日头条 字节跳动 Flutter架构实践


Flutter提供了Channel是用于和Native功能做交互。Android这边使用MethodChannel,IOS这边使用FlutterMethdChannel。最终Flutter通过衔接两个平台,使用统一的规范去衔接两个平台,暴露出一些函数和接口,然后就可以很容易的使用Flutter去调用Native的功能了。这个依赖于开发者的水平,需要对Android或IOS比较了解才能更好的写出插件出来。pub.dev上面也有很多开源库,不过往往开发中需求总是在变更的,开源库远远达满足不了实际开发需求的功能点,所以还是需要自己掌握Platform Channels的知识点比较好。



3字节跳动在Flutter架构上的实践

下面来看字节跳动主要做了哪些架构实践,请看下图:

今日头条 字节跳动 Flutter架构实践

从上图中还是可以看到字节跳动做了很多基础工作的,比如:容器化、混合工程、渲染、包体积、编译优化、多端一体化等。看上去确实感觉是很多东西的。下面简单的介绍其中比较关键的几个:

容器化架构

今日头条 字节跳动 Flutter架构实践

个人感觉所谓“容器化”,就类似于原生平台的组件化或者业务分层架构的思想。就是为普通业务打造可扩展的接口和行为准则。不过这个Flutter容器化架构要适应Android和IOS两个平台,然后针对不同的平台的业务行为需要定义统一的标准和规范以及封装了一些通用业务模块功能(其中的某些可以看做是基础业务的基类),比如:图片调用,直接去这里面的协议层,直接调用就可以了,内部都封装好了,直接传参调用,这里面有默认的适配,你也可以自定义。有了“容器化”的架构,平台基础API的差异性就不需要考虑了,开发者只管调用内部的功能模块或者接口即可快速开发新需求功能。

多端一体化实践

今日头条 字节跳动 Flutter架构实践

这个就不用多说了,就是写一个应用可以同时运行在Android、IOS、Web上面,省去了大量的开发周期,多端一体化结合了Flutter,以及Flutter Web,然后定制化了一些内部引擎和功能模块的架构,最终打造出了这套多端一体化的工程体系架构。

监控体系

今日头条 字节跳动 Flutter架构实践


Flutter自带的性能监控工具颗粒度是很粗糙的,用的是物理平均,而不能反映真实的每一帧实时统计。UI线程和GPU线程的处理方式不一样,这样物理平均确实是不直观的做法。


业界很多公司通用的做法是框架层去统计UI线程耗时时间,消息 post 到 UI,然后再post到GPU。但是这种做法有两个缺陷:一个是等待时间没有考虑进去,一个是UI 线程非常快,但是 GPU 线程非常慢,UI 线程向 GPU 线程跑消息时最多 Post 两个消息,这时候 GPU 线程依然处理不过来,UI 线程就不会 Post 消息,但是 UI 线程体现不出来。


字节跳动采用的是“高精度无侵入性能监控方案”:引擎层提供了一套机制,可以知道绘制多少帧,统计你发了多少信号,统计 GPU 线程。另外“无侵入”体现在:框架系统会自动识别性能监控滚动会在什么时候开始,什么时候结束。

Flutter Turbo

今日头条 字节跳动 Flutter架构实践


这个主要是性能提升的方案,比如:消息调度、GC抑制、关闭Semantics、关闭抗锯齿等,另外为了提高性能,内部有一个 Benchmark 跑分,有了这些方案支持,可以大大的提升应用程序额性能。

图片透传优化方案

今日头条 字节跳动 Flutter架构实践

我个人觉得这个方案还是挺不错的,非常有借鉴价值,值得学习和研究一下。现有的方式 Image.network加载网络图片,传入一个路径就可以加载了,然后Dart底层引擎层做解码操作。另外外接纹理方案也是不错的,也是可以实现的,但是它没有在这个基础上进行改造,性能上还有提升空间。字节跳动的透传方案是这样的:使用框架加载图片,然后生成Bitmap,然后Native和Dart VM共享Bitmap,而不是直接的数据传过来的,然后Dart引擎再转成Pixel buffer,这样一来对性能有很大的提升。包体积优化

今日头条 字节跳动 Flutter架构实践

大概有这些优化:做了编译优化;对Flutter产物的数据端做了压缩,对Skia做了裁剪,不需要的东西删掉了,引擎库对一些功能三方库也做了裁剪。

【虽说看的云里雾里,感觉还是很厉害的样子。类型一万个:“卧槽,这么牛逼!”】

今日头条 字节跳动 Flutter架构实践

在这次会议上的第3个主题演讲中,来自字节跳动的专家还专门对包体积优化做了讲解,我会在后面的文章再整理一下分享给大家。

启动速度优化

修改了引擎代码,对启动速度做了优化,几乎提升了1倍。(虽然很牛逼,但是看不到摸不着,也不知道是如何修改的,我只能说希望早点贡献给Flutter社区,我们这些吃瓜群众都来享一下福,沾一点光啊。)

原文:字节跳动技术团队

,今日头nba虎扑 条 字节跳动 Flutter架构实践

相关:

生鲜电商的“灾难月”,这家烧光18亿黯然退场最近,生鲜电商玩家们接连爆雷,整个行业笼罩在肃杀之中,巨头为何还在穷追?11月,“呆萝卜”陆续关店、资金链断裂,员工讨薪无门,加盟商撤资无门,烧掉18亿,最后烧出一地鸡毛。生鲜电商的“灾难月”最近两个月,生鲜电商们的日子可不好过:欠款的欠款,倒闭的倒闭,整个行业今非昔比。曾经:2012年,生鲜电商元年,“本来生活”在5天之内卖空20吨褚橙,打响生鲜电商战役。2016年,生鲜电商领域的玩家已经突破4000家。艾媒咨..

CES 2020看点预测,苹果回归,5G+8K未来感十足十年以前,我们都在畅想着2020年的样子,在我们的眼里,那就是未来。十年后,2020年到了,然而却和想象中相差甚远。是我们的科技没进步吗?其实并不是,只不过它是在我们看不见的地方,奇形怪状的设备、最牛X的显示屏幕、全新的人工智能概念等,都已经无限贴近未来。新的技术自然有着它的舞台。全世界最大的科技盛会:CES,即将开始。在这里,所有的高新科技厂家都会在此处“Show”出自己,竭尽全力炫耀最创新,最奇特,最具有实..

生活垃圾焚烧发电: 线上千里监控,线下执法联动  热点追踪   出于对环境质量等方面的担忧,生活垃圾焚烧发电是我国“邻避效应”较为突出的行业。生态环境部近日印发了《生活垃圾焚烧发电厂自动监测数据应用管理规定》(以下简称《管理规定》),提出自动监测数据可作为生活垃圾焚烧发电行业污染物排放超标等违法行为认定和处罚的依据。   生态环境部执法局副局长隋筱婵说,该规定填补了自动监测数据直接用于行政处罚的空白,并在全国范围内率先全面应用,实现对生活垃圾..

陈浩民夫妇怎么回事!越整越上瘾,近照看着都快认不出了陈浩民曾经也是电视剧一哥,基本每部剧收视率都不错。不过如今的他为了赚钱养家,接戏无下限,各种商业片都接,所以导致演技退步,口碑也大不如前了,为了巩固地位,人到中年的他还走起了整容路线,和妻子两个人越整越上瘾,感觉都像是一个模子。在今年8月份,陈浩民出席活动时,脸上看着就十分不自然,堪称现场翻车了。照片中,陈浩民一身灰色休闲西装,蓄着胡须,不过整个人看着却有些认不出,因为面部十分僵硬不自然,苹果肌..

明道亲哥掐死儿子后自杀:万般皆苦,唯有自渡台湾男星明道的亲哥哥,自杀身亡。更令人心痛的是,他在自杀前,先后勒死了老婆和儿子。自杀的原因,现在锁定在,明道哥哥因为欠下巨额赌债,无法偿还。此前,他还一直用明道的名义四处借钱,明道帮忙还了几百万之后,他更变本加厉,最后明道实在忍无可忍,只能逃离这个"无底洞"。可就就像这位网友说的,他死就死,为什么还要带上妻子和孩子,孩子才10几岁啊。家家有本难念的经,或许他也有不得言说的苦衷,但是谁不是这..

全网都在支持张翰和她复合,他却选择了马天宇!笑死了举高高?你确定看的不是偶像剧?并不是,这是综艺《亲爱的客栈》中马天宇把张翰举高高了。#张翰被马天宇举高高#这条热搜挂了一整天,什么时候开始男女CP干不过男男CP了!在这热搜之前,是#张翰马天宇合唱《因为爱情》所以这到底是什么神仙友(爱)情!问号脸?这也就算了,两个人在客栈中还模仿对方走路,像极了小情侣中互相伤害的样子。对了,他们还有点情侣步,一个内八字一个外八字。关键这两人还有一个身份,说出来容易招打..

平台“缺斤少两”骑手背锅 外卖员盼成立行业协会  平台显示距离短 实际路程却更远 催单消息频频传 送餐晚了落埋怨   外卖骑手最想“减压”希望成立行业协会 ▲倒计时10分钟、5分钟、1分钟都会提示,目的是提示骑手不要晚点   一日三餐点外卖,不想出门找代买,外卖平台的发展极大地便利了人们的生活。但你知道吗,每一份准时送达的背后,都有一个外卖小哥在“争分夺秒”。为赚取每单不足5元的配送费,无论风雨,不管寒暑,他们不停地往返于商家和客户之间,..

生死订单:一场和死亡赛跑的救援  生死订单:一场和死亡赛跑的救援   网购商品订单暗藏无声呼救 “自杀干预师”用人工智能技术联动各方力量协作干预  冬日的深夜,武纲躺在床上,感觉寒意还是浸透了四周,很多时候他都觉得自己这个岗位充满荒诞,在一家电商平台工作,别人卖货,他则是负责把一些订单拦截下来。  “只是把商品拦下来有用吗?”他常问自己,在网上买不到一把刀一根绳子,屏幕那头的自杀者可能随时把自己塞进车轮,或是从天台上跳下去。..

为了逃离施暴者,她们选择花钱让自己人间蒸发…在日本,每年都有近10万人失踪:活不见人、死不见尸,家人和朋友都找不到。这样的现象在日本,被称作人间蒸发。而后来的一些调查证明,这些蒸发的人很多都是主动消失。他们或许是因为压力、或许是因为伤痛,最终选择通过消失来逃离家人和社会。加上过去几十年,日本社会的经济发展缓慢、竞争压力巨大,这样主动消失的人非常多,因此也催生出了一种特别的搬家公司:专门在夜里或在家人邻居不知道的情况下,帮客户搬离原住所:迅速..

世卫组织就肺炎事件发声:不建议对中国实施旅行贸易限制新京报讯 (记者 张胜坡)“根据目前掌握的信息,不建议对中国实施任何旅行或贸易限制。”1月5日,世界卫生组织就武汉不明原因肺炎事件发布的通报称。该通报显示,2019年12月31日,世界卫生组织中国办公室获悉了湖北省武汉市发现了不明病因肺炎病例。1月1日,世界卫生组织要求中国政府提供进一步的资料,以评估风险。世界卫生组织表示,根据目前掌握的资料,“不建议对旅客采取任何特殊措施;如果旅行期间或旅行后出现呼吸系统..