当前位置:首页 > 闲鱼技术 > 正文内容

关于Flutter初始化流程,我必须告诉你的是…

xianyu3年前 (2021-03-08)闲鱼技术267

作者:闲鱼技术-然道

微信号:pps688888
添加微信, 免费测试软件
复制微信号

1. 引言

最近在做性能优化的时候发现,在混合栈开发中,第一次启动Flutter页面的耗时总会是第二次启动Flutter页面耗时的两倍左右,这样给人感觉很不好。分析发现第一次启动Flutter页面会做一些初始化工作,借此,我梳理了下Flutter的初始化流程。

2. Flutter初始化时序

TB10j3HqSzqK1RjSZFpXXakSXXa-1242-752.jpg

Flutter初始化主要分四部分,FlutterMain初始化、FlutterNativeView初始化、FlutterView初始化和Flutter Bundle初始化。
我们先看下Flutter初始化的时序图,来整体把握下Flutter初始化的一般流程: 

Flutter初始化时序

3. 具体分析

3.1 FlutterMain初始化

这部分初始化工作是由Application.onCreate方法中调用开始的,在Application创建的时候就会初始化完成,不会影响Flutter页面的第一次启动,所以这里只是做一个简单分析。 
从FlutterMain.startInitialization方法代码中可以轻易看出来,初始化主要分四部分。 
前面三部分比较类似,分别是初始化配置信息、初始化AOT编译和初始化资源,最后一部分则是加载Flutter的Native环境。 
这部分感兴趣的同学可以看下FlutterMain.java源码,逻辑还是比较清晰的。

3.2 FlutterNativeView初始化

先用一个图来展现FlutterNativeView构造函数的调用栈: 

TB1zKGiq3HqK1RjSZJnXXbNLpXa-1250-532.png

FlutterNativeView构造函数调用栈

从上图的调用栈中我们知道FlutterNativeView的初始化主要做了些什么,我们再从源码角度较为深入的了解下: 
FlutterNativeView的构造函数最终主要调用了一个nativeAttach方法。到这里就需要分析引擎层代码了,我们可以在JNI文件中找到对应的jni方法调用。(具体文件为platform_view_android_jni.cc)

从代码中很容易看出FlutterNativeView.attach方法最终调用了shell::Attach方法,而shell::Attach方法主要做了两件事: 
1. 创建PlatformViewAndroid。 
2. 调用PlatformViewAndroid::Attach。

那我们再分析下PlatformViewAndroid的构造函数和Attach方法都做了些什么呢?

其中: 
1. PlatformViewAndroid的构造函数主要是调用了InitializePlatformSurface方法,这个方法主要是初始化了Surface,其中Surface有Vulkan、OpenGL和Software三种类型的区别。 
2. PlatformViewAndroid::Attach方法这里主要调用三个方法:CreateEngine、SetupResourceContextOnIOThread和UpdateThreadPriorities。 
2.1 CreateEngine比较好理解,创建Engine,这里会重新创建一个Engine对象。 
2.2 SetupResourceContextOnIOThread是在IO线程去准备资源的上下文逻辑。 
2.3 UpdateThreadPriorities是设置线程优先级,这设置GPU线程优先级为-2,UI线程优先级为-1。

3.3 FlutterView初始化

FlutterView的初始化就是纯粹的Android层啦,所以相对比较简单。分析FlutterView.java的构造函数就会发现,整个FlutterView的初始化在确保FlutterNativeView的创建成功和一些必要的view设置之外,主要做了两件事: 
1. 注册SurfaceHolder监听,其中surfaceCreated回调会作为Flutter的第一帧回调使用。 
2. 初始化了Flutter系统需要用到的一系列桥接方法。例如:localization、navigation、keyevent、system、settings、platform、textinput。 
FlutterView初始化流程主要如下图所示: 

TB14PmYq7voK1RjSZPfXXXPKFXa-815-427.png

FlutterView初始化

3.4 Flutter Bundle初始化

TB1waOZq7voK1RjSZFDXXXY3pXa-1886-1134.pn

Flutter Bundle的初始化是由调用FlutterActivityDelegate.runFlutterBundle开始的,先用一张图来说明下runFlutterBundle方法的调用栈: 

Flutter的Bundle初始化

我们再从源码角度较为深入了解下: 
FlutterActivity的onCreate方法在执行完FlutterActivityDelegate的onCreate方法之后会调用它的runFlutterBundle方法。FlutterActivityDelegate.runFlutterBundle代码如下:

很明显,这个runFlutterBundle并没有做太多事情,而且直接调用了FlutterView.runFromBundle方法。而后兜兜转转最后会调用到PlatformViewAndroid::RunBundleAndSnapshot方法。

[engine=engine_->GetWeakPtr(),
asset_provider=std::move(asset_provider),
bundle_path=std::move(bundle_path), entrypoint=std::move(entrypoint),
reuse_runtime_controller=reuse_runtime_controller]

{ if (engine) engine->RunBundleWithAssets( std::move(asset_provider), std::move(bundle_path), std::move(entrypoint), reuse_runtime_controller); }); }

PlatformViewAndroid::RunBundleAndSnapshot在UI线程中调用Engine::RunBundleWithAssets,最终调用Engine::DoRunBundle。 
DoRunBundle方法最后只会调用RunFromPrecompiledSnapshot、RunFromKernel和RunFromScriptSnapshot三个方法中的一个。而这三个方法最终都会调用SendStartMessage方法。

而SendStartMessage方法主要做了三件事: 
1. 获取Flutter入口方法(例如main方法)的closure。 
2. 获取FlutterLibrary。 
3. 发送消息来调用Flutter的入口方法。

4. 总结一下

本次主要分析了下FlutterActivity的onCreate方法中的Flutter初始化部分逻辑,很明显会发现主要耗时在FlutterNativeView、FlutterView和Flutter Bundle的初始化这三块,将这三部分的初始化工作前置就可以比较容易的解决引言中提出的问题。经测试发现,这样改动之后,Flutter页面第一次启动时长和后面几次启动时长差不多一样了。 
对于FlutterMain.startInitialization的初始化逻辑、SendStartMessage发送的消息如何最终调用Flutter中的入口方法逻辑没有进一步深入分析,这些内容后续再继续分析撰文分享。

<

扫描二维码推送至手机访问。

版权声明:本文由中客网络发布,如需转载请注明出处。

本文链接:http://www.zzzmc.cc/43.html

分享给朋友:

相关文章

新手做闲鱼店群如何赚钱?

新手做闲鱼店群如何赚钱?

新手做闲鱼店群如何赚钱?新手做转转店群如何赚钱? 说《新手做闲鱼店群如何赚钱》之前,我们先说说为什么要做闲鱼店群 闲鱼店群概念已经出现好一阵子了,我们有幸是最早加入的团队之一。从模拟器到按键脚本,没有现在这么多精细化的操作,以前以量取胜、以高频发布取胜,以引流为主。 因为无脑操作,简单暴力。一时江湖豪杰四起,烽烟万里,热闹非凡,手上亲戚朋友就能凑个几十店轻松月赚三四万。 这就如同07~08年的淘宝,遍地黄金,10个加入8个富,一懒一拖,两人至今还在看项目。 好景不长,随即平台打压,瞬间满目苍夷,换了天地。伴随着封号导致号源紧缺,号商随即提...

“我把闲鱼当副业,两个星期赚了5000块”

“我把闲鱼当副业,两个星期赚了5000块”

  置顶 ? " 进击的阿秀 "   和优秀的人一起成长,做牛逼闪闪的职场青年   一个人的收入,和他的抗风险能力相关。   年初这场意外,让不少人的生活,到处都是大窟窿。然而,这样的心酸对很多人来说,意外之前,就已经存在了。   前段时间,几个月没见面的同学张淼半夜打电话给我。说自己代理的产品出问题被举报,一下子赔了大几万,老公气的要和她离婚。   本来经济就雪上加霜,又碰上疫情不能复工,家里基本没了收入来源。   还没说两句,一向坚强的张淼 " 哇 " 的一声哭出来。   听着电话那头她绝望的哭声,想着毕业以后大家各奔东西,被现实磨砺,却没几个人能...

闲鱼降权恢复该怎么弄呢?一招轻松上权重√

闲鱼降权恢复该怎么弄呢?一招轻松上权重√

  闲鱼一直都是一个很好的二手市场,在这个平台上经常会看到很多物美价廉的产品,其实全部都是8成新到9成新左右,而且还有很多明星在这个平台上出售东西。有些时候新手在操作的过程当中,一不小心可能就会降权,那么闲鱼降权恢复该怎么弄呢?   首先在这个平台上确实有隐形降权这样的一个说法,只是这个名字看起来好像比较高端,简单来讲就是店主的产品在整个排行上面非常的靠后,几乎算是搜索不到。所以在这里就可以得出一个结论,那就是隐形降权指的是没有办法排名,如果没有排名的话,那么在整个平台上也就没有什么曝光度了,也就没有人看到你的店铺买东西了。   当然了,如果之前曾经收藏过你的宝贝的,或者是之前就曾...

闲鱼自动发布软件要如何进行操作使用

闲鱼自动发布软件要如何进行操作使用

  我们在使用闲鱼助手之中的闲鱼自动发布软件时,一定要先了解到其中自动发布的原理过程。闲鱼的发布原理主要就是,当我们在软件里面制作好所需要的数据以后,就可以去利用模拟器,然后再去用脚本工具,这样就可以实现我们想要的自动上传功能了。当然,人工怎么操作,那么这里的脚本也一样就是怎么操作了。自动发布的作用有很多,可以帮助我们更好的经营自己在闲鱼之中开设的平台店铺。   不过我们要知道的还有,因为闲鱼之中查的也是比较严格的,所以说如果我们想要不被查封,那也要有所注意一点。首先我们不可以一天二十四小时不间断的上传,而且也不要太过于频繁的使用点赞与关注的功能。这样可以更好的保护我们自己的闲鱼账户。注...

卖家: 如何选择出售的货物上的闲置鱼?

卖家: 如何选择出售的货物上的闲置鱼?

  很多老手卖家可以通过闲鱼赚取了中国巨额的薪资。这让许多研究新手卖家服务感到非常羡慕,但是,新手卖家在店铺上架卖货的时候,却发现学生自己的商品信息无法及时卖出去,商品在店铺设计里面摆了半个月却无人问津。在闲鱼上卖货过程中应该学习如何进行选品呢?如何选品才能使闲鱼每日的销量已经达到200以上呢?下面,让我来为大家主要介绍,新手卖家在闲鱼上卖货,应该就是如何选品。   借鉴同行的爆款。   如何进行借鉴其他同行的爆款呢?在闲鱼上,有很多企业卖家能日入千金,而卖不出货的卖家,就一定要通过借鉴学习这些日入斗金的同行的销售管理规则。如何可以借鉴呢?   首先,借鉴学习他们的商品。作为...

流言终结者

流言终结者

背景 论坛上很多小伙伴关心为什么闲鱼选择了Flutter而不选择其他跨端方案?站在质量的角度,高性能是一个很重的因素,我们使用Flutter重写了宝贝详情页之后,对比了Flutter和Native详情页的性能表现,结论是中高端机型上Flutter和Native不相上下,在低端机型上,Flutter会比Native更加的流畅,其实闲鱼团队在使用Flutter做详情页过程中,没有更多地关注性能优化,为了更快地上线,也是优先功能的实现,不过测试结果出来之后,却出乎意料地优于原先的Native的实现(具体的测试结果,属于敏感数据,要走披露流程,伤不起…) 但是这样很显然不...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。