持续创作,加速成长!这是我参加「日新计划 10 月更文应战」的第3天,点击查看活动详情
以下首要针对往期录入的面试题进行一个分类归纳收拾,便利一致回忆和参考。本篇是第九集【完结篇】~
强调一下:别问了别问了, 面试文档要的在大众号<Android苦做舟>获取。
第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)
第二篇在这: Android中高级进阶开发面试题冲刺合集(二)
第三篇在这: Android中高级进阶开发面试题冲刺合集(三)
第四篇在这: Android中高级进阶开发面试题冲刺合集(四)
第五篇在这: Android中高级进阶开发面试题冲刺合集(五)
第六篇在这: Android中高级进阶开发面试题冲刺合集(六)
第七篇在这: Android中高级进阶开发面试题冲刺合集(七)
第八篇在这:Android中高级进阶开发面试题冲刺合集(八)【Flutter篇】
Dart相关
1.Dart 傍边的 「..」表明什么意思?
参考答案:
“..” 和 “.” 不同:调用..后回来的适当所以this,而.回来的则是该办法回来的值;
2.Dart 的作用域是怎样样的?
参考答案:
Dart没有public和private等关键词,默许便是揭露的,私有变量运用下划线开始;
3.dart是多线程仍是单线程履行?
参考答案:
单线程履行,多线程是运用异步来履行的;
4.堵塞式调用和非堵塞式调用是怎样样的?
参考答案:
堵塞:调用成果之前,当时线程会被挂起,调用线程只要在得到成果之后才会持续履行;
非堵塞:调用履行之后,当时线程不会中止运转,只需求过一段时刻来查看有没有成果回来即可;
5.事情循环是什么?
参考答案:
将需求处理的一系列事情,放在一个事情行列(Event Queue)中,不断从事情行列中取出事情,并履行需求履行的代码块,直到事情被清空。
6.dart是值传递仍是引证传递?
参考答案:
dart是值传递。咱们每次调用函数,传递曩昔的都是目标的内存地址,而不是这个目标的仿制。
7.Dart 言语有哪些重要的特性?
参考答案:
- Productive(生产力高,Dart的语法明晰明晰,东西简略但功能强大)
- Fast(履行速度快,Dart供给提早优化编译,以在移动设备和Web上取得可预测的高功能和快速发动。)
- Portable(易于移植,Dart可编译成ARM和X86代码,这样Dart移动运用程序能够在iOS、Android和其他地方运转)
- Approachable(容易上手,充分吸收了高级言语特性,假如你现已知道C++,C言语,或许Java,你能够在短短几天内用Dart来开发)
- Reactive(呼应式编程)
8.Dart 言语有哪些重要的概念?
参考答案:
- 在Dart中,一切都是目标,一切的目标都是承继自
Object - Dart是强类型言语,但能够用var或
dynamic来声明一个变量,Dart会主动推断其数据类型,dynamic相似c# - 没有赋初值的变量都会有默许值
null - Dart支撑顶层办法,如
main办法,能够在办法内部创立办法 - Dart支撑顶层变量,也支撑类变量或目标变量
- Dart没有
publicprotectedprivate等关键字,假如某个变量以下划线(_)开始,代表这个变量在库中是私有的
9.Dart线程模型是怎样履行的?
参考答案:
Dart 是单线程模型,运转的的流程如下图。
Dart 在单线程中是以音讯循环机制来运转的,包含两个使命行列,一个是“微使命行列” microtask queue,另一个叫做“事情行列” event queue。 当Flutter运用发动后,音讯循环机制便发动了。首要会依照先进先出的次序逐个履行微使命行列中的使命,当一切微使命行列履行完后便开始履行事情行列中的使命,事情使命履行完毕后再去履行微使命,如此循环往复,生生不息。
10.Dart 是怎样完结多使命并行的?
参考答案:
Dart 是单线程的,不存在多线程,那怎样进行多使命并行的呢?其实,Dart的多线程和前端的多线程有许多的相似之处。Flutter的多线程首要依靠Dart的并发编程、异步和事情驱动机制。
简略的说,在Dart中,一个Isolate目标其实便是一个isolate履行环境的引证,一般来说咱们都是经过当时的isolate去控制其他的isolate完结彼此之间的交互,而当咱们想要创立一个新的Isolate能够运用Isolate.spawn办法获取回来的一个新的isolate目标,两个isolate之间运用SendPort彼此发送音讯,而isolate中也存在了一个与之对应的ReceivePort承受音讯用来处理,可是咱们需求注意的是,ReceivePort和SendPort在每个isolate都有一对,只要同一个isolate中的ReceivePort才干承受到当时类的SendPort发送的音讯而且处理。
11.await for 怎样运用?
参考答案:
await for是不断获取stream流中的数据,然后履行循环体中的操作。它一般用在直到stream什么时分完结,而且有必要等候传递完结之后才干运用,不然就会一向堵塞。
12.Stream 有哪两种订阅形式?别离是怎样调用的?
参考答案:
单订阅(single)和多订阅(broadcast)。
单订阅便是只能有一个订阅者,而广播是能够有多个订阅者。这就有点相似于音讯服务(Message Service)的处理形式。单订阅相似于点对点,在订阅者出现之前会持有数据,在订阅者出现之后就才转交给它。而广播相似于发布订阅形式,能够一同有多个订阅者,当有数据时就会传递给一切的订阅者,而不管当时是否已有订阅者存在。
Stream 默许处于单订阅形式,所以同一个 stream 上的 listen 和其它大多数办法只能调用一次,调用第二次就会报错。但 Stream 能够经过 transform() 办法(回来另一个 Stream)进行接连调用。经过 Stream.asBroadcastStream() 能够将一个单订阅形式的 Stream 转化成一个多订阅形式的 Stream,isBroadcast 属功能够判断当时 Stream 所在的形式。
13.dart中mixin机制是怎样样的?
参考答案:
mixin 是Dart 2.1 参加的特性,以前版别一般运用abstract class替代。简略来说,mixin是为了处理承继方面的问题而引进的机制,Dart为了支撑多重承继,引进了mixin关键字,它最大的特殊处在于:mixin界说的类不能有结构办法,这样能够避免承继多个类而发生的父类结构办法抵触。 mixins的目标是类,mixins绝不是承继,也不是接口,而是一种全新的特性,能够mixins多个类,mixins的运用需求满足一定条件。
14.JIT 与 AOT别离是什么?
参考答案:
借助于先进的东西链和编译器,Dart 是少数一同支撑 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运转前编译)的言语之一。那,到底什么是 JIT 和 AOT 呢?言语在运转之前一般都需求编译,JIT 和 AOT 则是最常见的两种编译形式。JIT 在运转时即时编译,在开发周期中运用,能够动态下发和履行代码,开发测验功率高,但运转速度和履行功能则会因为运转时即时编译受到影响。
AOT 即提早编译,能够生成被直接履行的二进制代码,运转速度快、履行功能表现好,但每次履行前都需求提早编译,开发测验功率低。
15.Dart的内存分配与废物收回是怎样样的?
参考答案:
Dart VM 的内存分配策略比较简略,创立目标时只需求在堆上移动指针,内存增加始终是线性的,省去了查找可用内存的进程。在 Dart 中,并发是经过 Isolate 完结的。Isolate 是相似于线程但不同享内存,独立运转的 worker。这样的机制,就能够让 Dart 完结无锁的快速分配。
Dart 的废物收回,则是选用了多生代算法。新生代在收回内存时选用“半空间”机制,触发废物收回时,Dart 会将当时半空间中的“活泼”目标拷贝到备用空间,然后全体开释当时空间的一切内存。收回进程中,Dart 只需求操作少数的“活泼”目标,没有引证的许多“死亡”目标则被疏忽,这样的收回机制很合适 Flutter 结构中许多 Widget 毁掉重建的场景。
16.运用mixins的条件是什么?
参考答案:
因为mixins运用的条件,随着Dart版别一向在变,这儿讲的是Dart2.1中运用mixins的条件:
-
mixins类只能承继自object mixins类不能有结构函数 - 一个类能够
mixins多个mixins类 - 能够
mixins多个类,不破坏Flutter的单承继
17.mixin 怎样指定反常类型?
参考答案:
on关键字可用于指定反常类型。 on只能用于被mixins标记的类,例如mixins X on A,意思是要mixins X的话,得先接口完结或许承继A。这儿A能够是类,也能够是接口,可是在mixins的时分用法有差异.
on 一个类:
on 的是一个接口: 得首要完结这个接口,然后再用mix
18.main future mirotask 的履行次序是怎样的?
参考答案:
一般代码都是同步履行的,结束后会开始查看microtask中是否有使命,若有则履行,履行完持续查看microtask,直到microtask列队为空。终究会去履行event行列(future)。
19.Future和Isolate有什么差异?
参考答案:
future是异步编程,调用本身立即回来,并在稍后的某个时分履行完结时再取得回来成果。在一般代码中能够运用await 等候一个异步调用结束。 isolate是并发编程,Dart有并发时的同享状况,一切Dart代码都在isolate中运转,包含开始的main()。每个isolate都有它自己的堆内存,意味着其间一切内存数据,包含大局数据,都仅对该isolate可见,它们之间的通讯只能经过传递音讯的机制完结,音讯则经过端口(port)收发。isolate仅仅一个概念,详细取决于怎样完结,比方在Dart VM中一个isolate或许会是一个线程,在Web中或许会是一个Web Worker。
20.Stream 与 Future是什么联系?
参考答案:
Stream 和 Future 是 Dart 异步处理的中心 API。Future 表明稍后取得的一个数据,一切异步的操作的回来值都用 Future 来表明。可是 Future 只能表明一次异步取得的数据。而 Stream 表明屡次异步取得的数据。比方界面上的按钮或许会被用户点击屡次,所以按钮上的点击事情(onClick)便是一个 Stream 。简略地说,Future将回来一个值,而Stream将回来屡次值。Dart 中一致运用 Stream 处理异步事情流。Stream 和一般的集合相似,都是一组数据,只不过一个是异步推送,一个是同步拉取。
Flutter
1.介绍下Flutter的FrameWork层和Engine层,以及它们的作用
参考答案:
Flutter的FrameWork层是用Dart编写的结构(SDK),它完结了一套根底库,包含Material(Android风格UI)和Cupertino(iOS风格)的UI界面,下面是通用的Widgets(组件),之后是一些动画、制作、烘托、手势库等。这个纯 Dart完结的 SDK被封装为了一个叫作 dart:ui的 Dart库。咱们在运用 Flutter写 App的时分,直接导入这个库即可运用组件等功能。 Flutter的Engine层是Skia 2D的绘图引擎库,其前身是一个向量绘图软件,Chrome和 Android均选用 Skia作为绘图引擎。Skia供给了十分友爱的 API,而且在图形转化、文字烘托、位图烘托方面都供给了友爱、高效的表现。Skia是跨渠道的,所以能够被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS闭源的 Core Graphics / Core Animation。Android自带了 Skia,所以 Flutter Android SDK要比 iOS SDK小许多。
2.介绍下Widget、State、Context 概念
参考答案:
- Widget:在Flutter中,几乎一切东西都是
Widget。将一个Widget想象为一个可视化的组件(或与运用可视化方面交互的组件),当你需求构建与布局直接或直接相关的任何内容时,你正在运用Widget。 - Widget树:
Widget以树结构进行组织。包含其他Widget的widget被称为父Widget(或widget容器)。包含在父widget中的widget被称为子Widget。 - Context:仅仅是已创立的一切
Widget树结构中的某个Widget的方位引证。简而言之,将context作为widget树的一部分,其间context所对应的widget被添加到此树中。一个context只从属于一个widget,它和widget相同是链接在一同的,而且会形成一个context树。 - State:界说了
StatefulWidget实例的行为,它包含了用于”交互/干预“Widget信息的行为和布局。运用于State的任何更改都会强制重建Widget。
3.介绍下StatelessWidget和StatefulWidget两种状况组件类
参考答案:
- StatelessWidget: 一旦创立就不关心任何改变,在下次构建之前都不会改变。它们除了依靠于本身的装备信息(在父节点构建时供给)外不再依靠于任何其他信息。比方典型的
Text、Row、Column、Container等,都是StatelessWidget。它的生命周期适当简略:初始化、经过build()烘托。 - StatefulWidget: 在生命周期内,该类
Widget所持有的数据或许会发生改变,这样的数据被称为State,这些具有动态内部数据的Widget被称为StatefulWidget。比方复选框、Button等。State会与Context相相关,而且此相关是永久性的,State目标将永远不会改变其Context,即使能够在树结构周围移动,也仍将与该context相相关。当state与context相关时,state被视为已挂载。StatefulWidget由两部分组成,在初始化时有必要要在createState()时初始化一个与之相关的State目标。
4.StatefulWidget 的生命周期是怎样样的?
参考答案:
Flutter的Widget分为StatelessWidget和StatefulWidget两种。其间,StatelessWidget是无状况的,StatefulWidget是有状况的,因此实际运用时,更多的是StatefulWidget。StatefulWidget的生命周期如下图:
-
initState():Widget初始化当时State,在当时办法中是不能获取到Context的,如想获取,能够试试Future.delayed() -
didChangeDependencies():在initState()后调用,State目标依靠联系发生改变的时分也会调用。 -
deactivate():当State被暂时从视图树中移除时会调用这个办法,页面切换时也会调用该办法,和Android里的onPause差不多。 -
dispose():Widget毁掉时调用。didUpdateWidget:Widget状况发生改变的时分调用。
5.说下Widgets、RenderObjects 和 Elements的联系
参考答案:
首要看一下这几个目标的含义及作用。
-
Widget:仅用于存储烘托所需求的信息。 -
RenderObject:担任办理布局、制作等操作。 -
Element:才是这颗巨大的控件树上的实体。
Widget会被inflate(填充)到Element,并由Element办理底层烘托树。Widget并不会直接办理状况及烘托,而是经过State这个目标来办理状况。Flutter创立Element的可见树,相对于Widget来说,是可变的,一般界面开发中,咱们不用直接操作Element,而是由结构层完结内部逻辑。就如一个UI视图树中,或许包含有多个TextWidget(Widget被运用屡次),可是放在内部视图树的视角,这些TextWidget都是填充到一个个独立的Element中。Element会持有renderObject和widget的实例。记住,Widget 仅仅一个装备,RenderObject 担任办理布局、制作等操作。 在第一次创立 Widget 的时分,会对应创立一个 Element, 然后将该元素刺进树中。假如之后 Widget 发生了改变,则将其与旧的 Widget 进行比较,而且相应地更新 Element。重要的是,Element 不会被重建,仅仅更新而已。
6.Flutter 是怎样与原生Android、iOS进行通讯的?
参考答案:
Flutter 经过 PlatformChannel 与原生进行交互,其间 PlatformChannel 分为三种:
-
BasicMessageChannel:用于传递字符串和半结构化的信息。 -
MethodChannel:用于传递办法调用。Flutter主动调用Native的办法,并获取相应的回来值。 -
EventChannel:用于数据流(event streams)的通讯。
关于原理:www.jianshu.com/p/39575a90e…
7.简述下Flutter 的热重载
参考答案:
Flutter 的热重载是基于 JIT 编译形式的代码增量同步。因为 JIT 属于动态编译,能够将 Dart 代码编译成生成中间代码,让 Dart VM 在运转时解说履行,因此能够经过动态更新中间代码完结增量同步。
热重载的流程能够分为 5 步,包含:扫描工程改动、增量编译、推送更新、代码兼并、Widget 重建。
Flutter 在接收到代码改变后,并不会让 App 重新发动履行,而只会触发 Widget 树的重新制作,因此能够坚持改动前的状况,大大缩短了从代码修正到看到修正发生的改变之间所需求的时刻。
另一方面,因为涉及到状况的保存与康复,涉及状况兼容与状况初始化的场景,热重载是无法支撑的,如改动前后 Widget 状况无法兼容、大局变量与静态特点的更改、main 办法里的更改、initState 办法里的更改、枚举和泛型的更改等。
能够发现,热重载提高了调试 UI 的功率,十分合适写界面样式这样需求反复查看修正作用的场景。但因为其状况保存的机制所限,热重载本身也有一些无法支撑的边界。
8.说下Flutter 和其他跨渠道计划的本质差异
参考答案:
React Native 之类的结构,仅仅经过 JavaScript 虚拟机扩展调用体系组件,由 Android 和 iOS 体系进行组件的烘托;
Flutter 则是自己完结了组件烘托的闭环。那么,Flutter 是怎样完结组件烘托的呢?这需求从图画显现的根本原理说起。在核算机体系中,图画的显现需求 CPU、GPU 和显现器一同配合完结:CPU 担任图画数据核算,GPU 担任图画数据烘托,而显现器则担任终究图画显现。CPU 把核算好的、需求显现的内容交给 GPU,由 GPU 完结烘托后放入帧缓冲区,随后视频控制器依据垂直同步信号(VSync)以每秒 60 次的速度,从帧缓冲区读取帧数据交由显现器完结图画显现。操作体系在出现图画时遵循了这种机制,而 Flutter 作为跨渠道开发结构也选用了这种底层计划。下面有一张更为详尽的示意图来解说 Flutter 的制作原理。
Flutter 制作原理能够看到,Flutter 关注怎样尽或许快地在两个硬件时钟的 VSync 信号之间核算并组成视图数据,然后经过 Skia 交给 GPU 烘托:UI 线程运用 Dart 来构建视图结构数据,这些数据会在 GPU 线程进行图层组成,随后交给 Skia 引擎加工成 GPU 数据,而这些数据会经过 OpenGL 终究供给给 GPU 烘托。
9.Widget 仅有标识Key有哪几种?
参考答案:
在flutter中,每个widget都是被仅有标识的。这个仅有标识在build或rendering阶段由结构界说。该标识对应于可选的Key参数,假如省掉,Flutter将会主动生成一个。
在flutter中,首要有4种类型的Key:GlobalKey(保证生成的Key在整个运用中仅有,是很贵重的,允许element在树周围移动或改变父节点而不会丢掉状况)、LocalKey、UniqueKey、ObjectKey。
10.什么是Navigator? MaterialApp做了什么?
参考答案:
Navigator是在Flutter中担任办理保护页面仓库的导航器。
MaterialApp在需求的时分,会主动为咱们创立Navigator。
Navigator.of(context),会运用context来向上遍历Element树,找到MaterialApp供给的_NavigatorState再调用其push/pop办法完结导航操作。
11.Flutter动画类型有哪些?
参考答案:
-
补间动画:给定初值与终值,体系主动补齐中间帧的动画
-
物理动画:遵循物理学定律的动画,完结了弹簧、阻尼、重力三种物理作用
在运用运用进程中常见动画形式:
- 动画列表或许网格:例如元素的添加或许删去操作;
- 转场动画
Shared element transition:例如从当时页面打开另一页面的过渡动画; - 交错动画
Staggered animations:比方部分或许彻底交错的动画。
12.怎样一致办理错误页面?
参考答案:
在main办法修正ErrorWidget.builder 来自界说一个属于自己的Widget;
如:
/// 自界说报错页面
ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) {
debugPrint(flutterErrorDetails.toString());
return new Center(child: new Text("App错误,快去反馈给作者!"));
};
13.Flutter 中存在哪四大线程?
参考答案:
Flutter 中存在四大线程,别离为 UI Runner、GPU Runner、IO Runner, Platform Runner (原生主线程) ,一同在 Flutter 中能够经过 isolate 或许 compute 履行真实的跨线程异步操作。
14.PlatformView的作用有哪些?
参考答案:
Flutter 中经过 PlatformView 能够嵌套原生 View 到 Flutter UI 中;
15.PlatformView运用了哪些东西来完结?
参考答案:
Presentation、VirtualDisplay 、 Surface 等;
16.PlatformView大致原理是怎样样的?
参考答案:
运用了相似副屏显现的技能,VirtualDisplay 类代表一个虚拟显现器,调用 DisplayManager 的 createVirtualDisplay() 办法,将虚拟显现器的内容烘托在一个 Surface 控件上,然后将 Surface 的 id告诉给 Dart,让 engine 制作时,在内存中找到对应的 Surface 画面内存数据,然后制作出来。 实时控件截图烘托显现技能。
17.Flutter 的 Debug 和 release 别离是在什么形式下运转的?
参考答案:
Flutter 的 Debug 下是 JIT 形式,release下是AOT形式。
18.Platform Channel有哪几种通讯办法?别离是用于什么操作?
参考答案:
-
BasicMessageChannel:用于传递字符串和半结构化的信息。 -
MethodChannel:用于传递办法调用(method invocation)。 -
EventChannel: 用于数据流(event streams)的通讯。
19.RenderObject布局相关办法调用次序是怎样样的?
参考答案:
layout -> performResize -> performLayout -> markNeedsPaint , 可是用户一般不会直接调用 layout,而是经过 markNeedsLayout ,详细流程如下:
20.RenderObject怎样使得页面重绘?流程是怎样样的?
参考答案:
RenderObject 在 attch/layout 之后会经过 markNeedsPaint(); 使得页面重绘,流程大概如下:
经过isRepaintBoundary 往上确认了更新区域,经过 requestVisualUpdate 办法触发更新往下制作。
21.Flutter存在哪几棵树?他们有什么联系?
参考答案:
Flutter 中存在 Widget 、 Element 、RenderObject 、Layer 四棵树,其间 Widget 与 Element 是一对多的联系
22.简述下Flutter的线程办理模型
参考答案:
默许情况下,Flutter Engine层会创立一个Isolate,而且Dart代码默许就运转在这个主Isolate上。必要时能够运用spawnUri和spawn两种办法来创立新的Isolate,在Flutter中,新创立的Isolate由Flutter进行一致的办理。 事实上,Flutter Engine自己不创立和办理线程,Flutter Engine线程的创立和办理是Embeder担任的,Embeder指的是将引擎移植到渠道的中间层代码,Flutter Engine层的架构示意图如下图所示。
在Flutter的架构中,Embeder供给四个Task Runner,别离是Platform Task Runner、UI Task Runner Thread、GPU Task Runner和IO Task Runner,每个Task Runner担任不同的使命,Flutter Engine不在乎Task Runner运转在哪个线程,可是它需求线程在整个生命周期里边坚持安稳。
状况办理
1.状况办理是什么?
参考答案:
程序=算法+数据结构 数据是程序的中心。数据结构和算法两个概念间的逻辑联系贯穿了整个程序国际,首要二者表现为不可分割的联系。其实Flutter不便是一个程序吗,那咱们面对的最底层的问题仍是算法和数据结构,所以咱们推导出
Flutter=算法+数据结构 那状况办理是什么?我也用公式来表达一下,如下:
Flutter状况办理=算法+数据结构+UI绑定
2.为什么需求状况办理?
参考答案:
用于处理状况更新问题,不需求WidgetState 被大局化,保证组件隐私,使得代码可扩展,易保护,能够动态替换UI而不影响算法逻辑,安全可靠,坚持数据的安稳伸缩,功能佳,部分优化;
3.说下状况办理根本分类
参考答案:
分为部分办理和大局办理;
- 部分办理:时刻短的状况,这种状况根本不需求做大局处理;
- 大局办理:即运用状况,非时刻短状况,您要在运用程序的许多部分之间同享,以及希望在用户会话之间坚持的状况,便是咱们所说的运用程序状况(有时也称为同享状况)
4.状况办理的底层逻辑一般是怎样样的?
参考答案:
-
State:如StatefulWidget、StreamBuilder状况办理办法; -
InheritedWidget专门担任Widget树中数据同享的功能型Widget:如Provider、scoped_model便是基于它开发; -
Notification:与InheritedWidget正好相反,InheritedWidget是从上往下传递数据,Notification是从下往上,但两者都在自己的Widget树中传递,无法跨过树传递; -
Stream数据流 :如Bloc、flutter_redux、fish_redux等也都基于它来做完结;
5.状况办理的运用原则是怎样样的?
参考答案:
部分办理优于大局、坚持数据安全性、考虑页面重新build带来的影响;
6.运用成熟状况办理库的坏处有哪些?
参考答案:
增加代码复杂性、结构bug修复需求时刻等候、不理解结构原理导致运用办法不对,反而带来更多问题、选型错误导致不符合运用要求、与团队风格抵触不适用;
进阶
1.flutter run实际走了哪三个命令?别离用于什么操作?
参考答案:
-
flutter build apk:经过gradle来构建APK -
adb install:装置APK -
adb am start:发动运用
2.setState做了哪些作业?是怎样更新UI的?
参考答案:
setState 其实是调用了 markNeedsBuild ,该办法内部标记此Element 为 Dirty ,然后在下一帧 WidgetsBinding.drawFrame 才会被制作, setState并不是立即生效的。
3.Flutter运用发动runApp(MyApp)进程是怎样样的?
参考答案:
Flutter 中 runApp 发动入口其实是一个 WidgetsFlutterBinding ,它首要是经过 BindingBase 的子类 GestureBinding 、ServicesBinding 、 SchedulerBinding 、PaintingBinding 、SemanticsBinding 、 RendererBinding 、WidgetsBinding 等,经过 mixins 的组合而成的。
4.Dart虚拟机怎样办理的?怎样调用?怎样跟Flutter引擎交互?
参考答案:
Dart虚拟机具有自己的Isolate,彻底由虚拟机自己办理的,Flutter引擎也无法直接访问。Dart的UI相关操作,是由Root Isolate经过Dart的C++调用,或许是发送音讯告诉的办法,将UI烘托相关的使命提交到UIRunner履行,这样就能够跟Flutter引擎相关模块进行交互。
5.Isolate组成部分有哪些?别离有什么作用?
参考答案:
-
isolate堆是运该isolate中代码分配的一切目标的GC办理的内存存储; -
vm isolate是一个伪isolate,里边包含不可变目标,比方null,true,false; -
isolate堆能引证vm isolate堆中的目标,但vm isolate不能引证isolate堆; -
isolate彼此之间不能彼此引证 每个isolate都有一个履行dart代码的Mutator thread,一个处理虚拟机内部使命(比方GC, JIT等)的helper thread;
6.线程和isolate的联系是什么?
参考答案:
1、同一个线程在同一时刻只能进入一个isolate,当需求进入另一个isolate则有必要先退出当时的isolate;
2、一次只能有一个Mutator线程相关对应的isolate,Mutator线程是履行Dart代码并运用虚拟机的公共的C言语API的线程;
7.介绍下JIT运转形式中kernel service
参考答案:
是一个辅助类isolate,其中心作业便是CFE,将dart转为Kernel二进制,然后VM可直接运用Kernel二进制运转在主isolate里边运转。
8.setState在哪种场景下或许会失效?
参考答案:
1、改写办法内声明的变量;
2、改写被final修饰的变量;
9.isolate是怎样进行通讯的?实例化进程是怎样样的?
参考答案:
isolate线程之间的通讯首要经过port来进行,这个port音讯传递进程是异步的。
实例化一个isolate的进程包含:
- 1.实例化
isolate结构体。 - 2.在堆中分配线程内存。
- 3.装备
port等进程。
10.虚拟机怎样运转Dart代码?
参考答案:
1.源码或许Kernel二进制(JIT)
2.snapshot :
- AOT snapshot
- AppJIT snapshot
11.JIT运转形式中debug运转原理是怎样样的?
参考答案:
将dart代码转化为kernel二进制和履行kernel二进制,这两个进程也能够分离开来,在两个不同的机器履行,比方host机器履行编译,移动设备履行kernel文件。












