添加微信群,试用软件
复制微信号
最近,在性能优化过程中,发现在混合堆栈的开发中,第一次启动f lutte r页面所需的时间总是第二次启动f lutte r页面所需时间的两倍左右,这让人感觉非常糟糕。通过分析发现,第一次启动FL u t e r页面时会进行一些初始化工作。因此,我梳理了f l u t e r的初始化过程。
模糊逻辑初始化主要分为四个部分:模糊逻辑初始化、模糊逻辑初始化、模糊逻辑初始化和模糊逻辑初始化。
让我们先看一下FL UT e r初始化的序列图,从整体上把握FL UT e r初始化的一般过程:
这部分初始化是在调用开始时由一个PL i c a t o n c r e a t e方法执行的,在一个p p p中,当创建第一次时,它不会影响页面的第一次启动,所以这只是一个简单的分析。
从f l u t e r m a i t i i t i i z a t i o n方法代码可以很容易地看到。初始化主要分为四个部分。
前三部分类似,即初始化配置信息、初始化aot编译和初始化资源。最后一部分是加载FL-UT-r的n a t i v e环境。
对劳工转换感兴趣的同学们可以在f z-拟代数u t t e r m A规范n下查看。j apha assr apha来源、逻辑或比较阐明
首先,使用一个图表来显示FL u t r n a t i v e w构造函数的调用堆栈:
从上图中的调用堆栈中,我们知道了FL u t e r n a t i v e w的初始化主要做什么。让我们从源代码的角度进行更深入的理解:
f l u t e r n a t i v e e w的构造函数主要调用n a t i v e a t a c h方法。这里我们需要分析引擎层代码。我们可以在jni文件中找到相应的jni方法调用。(具体文件为PL a t f o r m v i w a n d r o i d j n i.c)
从代码中可以很容易地看出,fl u t r n a t v e v i e w a t a c h方法最终调用了sh e l::a t a c h方法,而sh e l::a t a c h方法主要做两件事:
1.创建p l a t f o r m v i e w和r o i d。
2.调用PLATOFORMVIEW和RDROID::ATACH。
然后,让我们分析一下plaformvi的构造函数和athch方法做了什么?
其中:
1.pla t f r m v i e w a n d r o i d的构造函数主要调用i t i a l i z e p l a t f r m s u r f a c e方法,该方法主要初始化u r f a c e,其中s u r f a c e具有v u l k a n、o p e g l和s o f t w a r e的差异。
2.这里的方法主要调用三种方法:c r a t e e a t e e g i n e、s e t u p r e c o t e x t o o o t e a d r i o i t i t a d p i t i e。
2.1 c r e a t e i n e e e i n e e e e i n e e e i n e e e e i n e e e e e i n e e e i n e e i n e e i n e e e e e i n e e e e e e e e e e e e。创建一个e n g i n e,在这里,一个e n g i n e对象将被重新创建。
2.2 s e t u p r s o u r c o n t e x t o n i o d是i o线程准备资源的上下文逻辑。
2.3 u p d a t h r a d p r i o r i es是设置线程优先级,这将g p u线程优先级设置为-2,u i线程优先级设置为-1。
f l u t e r v i e w的初始化是一个纯n d r o i d层,因此它相对简单。分析f l u t e r v i w j a v a的构造器会发现,整个f l u t e r v i w的初始化除了确保成功创建f u t e r n a v i w和一些必要的v i e w设置外,主要做两件事:
1.注册s u r f a c e h o l d e r侦听,其中s u r f a c e r e a t e d回调将用作f u t e r的第一帧回调。
2.初始化了f l u t e r系统所需的一系列桥接方法。例如:Loc a l i z a t i o n,n a v i g a t i o n,k y e v e n t,s y s t e m,s e t i g s,p l a t f r m,t e x t i u t。
f l u t e r v i e w初始化过程主要如下图所示:
如果从r u n f l u t e r u n d l e开始,通过调用f l u t e r a c t i v i t y e l e g e来初始化r u t e r u n d l e,首先使用一个图表来说明r u n f l u t e r u n d l e方法的调用堆栈:
让我们从源代码的角度进行更深入的理解:
在执行f u t r a c t v i t e方法后,f u t r a c t i t y的o c r a t e方法将调用其r u n f l u t e r b u t e d l e方法。f l u t t r a c t i v i t y e g t e。r u n f l u t r b u n d l e代码如下所示:
显然,这个r u n f l t r u n d l e做的事情不多,直接调用了f l u t e r v i e w r u n f r o m b l e方法。之后,您将调用pla t f o r m v i w a n d r o i d::r u n b u n d l a n d s n a p s h ot方法。
[e n g i n e=e n g i n e u->g e t w e a k p t r(),
s s e t_PR o v i d r=s t d::m o v e(s e t_PR o v i d r),
b u n d l e_pa t h=s t d::m o v e(b u n d l e_pa t h),e n t r y p o i n t=s t d::m o v e(e n t r y p o n t),
r e u s e_un t i m e_co n t r o l e r=r e u s e_un t i m e_co n t r l e]
{
i f(e n g i n e)
e n g i n e->r u n b u n d l w i t s(
s t d::m o v e(s s e t p r o v i d e r),s t d::m o v e(b u n d l e p a t h),
s t d::m o v e(e n t r y p o i n t),r e u s e_un t i m e_un t r l e;
} ) ;
}
第一个,第二个,第三个,第三个,第二个和第三个。
最后,dor u n b u n d l e方法只调用三种方法中的一种:r u n f r m p r e m p i d s n a p s h ot、r u n f r m k r n e l和r u n f r m s r p s h ot。这三种方法最终将被称为s n d s t a r t m s a g e方法。
s e n d s t a r m e s a g e方法主要做三件事:
1.获取f l u t e r entry方法(例如,m a i n方法)的c l o s u r e。
2.快来吧。
3.发送消息以调用f l u t e r的输入方法。
这一次,我们主要分析f u t r a t i t y方法中f l u t e r初始化的逻辑。显然,初始化f u t e r n a t i v i e w、f u t e r v i e w和f u t e b u n d l e主要需要时间,在介绍中很容易解决三个初始化前问题。经过测试发现,经过这些更改后,FL u t e r页面的第一次启动时间与接下来的启动时间几乎相同。
对于f l u t r m a in,尚未进一步分析s t a r t i t i i z a t i o n的初始化逻辑,以及s e n d s t a r t m e s g e发送的消息最终如何调用f l u t e r中的输入方法逻辑。这些内容将在以后继续分析和分享。
短视频宝宝=慢?阿里巴巴的工程师们就在这样一秒钟内打开了路由管理代码的短视频。阿里巴巴工程师如何高效地解决这个问题?(实用)一个很好的方案,可以帮助您实现复杂数据源中单元格信息的精确规范化。在f l u t e r中嵌入n a t v e组件的正确姿势是,闲置鱼没有供应的做法是什么,以及如何做到?游手好闲的鱼没有货源。