Flutter - 它在幕后是如何工作的?

Flutter - How does it work behind the scenes?

显然,flutter 是 运行 应用程序在 iOSAndroid 上使用一个代码库的框架。但它是如何做到这一点的呢?它会编译为本机代码,还是在该过程中涉及中级语言或虚拟机?我尝试阅读 Github 上的一些源代码,但我找不到任何东西。

使用 Dart 的 AoT 编译功能将 Dart 源代码编译为本机代码。它仍然需要部分 Dart VM(一些 运行time 组件,如垃圾收集)到 运行,但是代码提前编译为本机代码,因为 iOS 没有不允许动态编译。

Flutter 还可以调用 Android 并使用 Android 仅在 Java 中可用的功能(与 iOS 相同)。 Flutter 支持构建自定义插件(除了许多提供的插件之外)以调用原生平台代码。

让我借助这张图来解释一下:

Flutter 是使用 Dart 编程语言构建的。 Flutter 有 2 个主要组件:

  1. Flutter 框架。
  2. Flutter SDK.

Flutter Framework 使用 Dart 作为编程语言,Framework 有一组实用函数,您可以通过这些函数在您的 Flutter 应用程序中添加 UI 元素和小部件。

并且 Flutter SDK 允许您构建、部署和自定义您的 Flutter 应用程序。

Flutter 使用 Dart

因为 Dart 是强类型的面向对象编程语言。 并且具有提前编译和即时编译的特点。

提前编译使 Flutter SDK 和 Dart 有资格生成可在 Android 和 iOS.

上编译的原生 ARM 代码

更多详情您可以观看此视频: How Flutter Works and Why Flutter uses Dart

术语Flutter指的是两大things/concepts

  1. Flutter SDK
  2. Flutter 框架

1.Flutter SDK: 是一组工具,可让您为 Android 和 iOS 平台构建任何类型的应用程序在一个代码库中。

2.Flutter 框架: 基本上它提供了所有预定义的 widgets/widget 库、实用函数和包。

我们知道 flutter 使用 Dart 作为编程语言。 Flutter 的应用 build/developed 可以在 Android 和 iOS 上 运行。因此,我们需要将 dart 代码编译为本机 android/ios 代码。

And the compilation task is done by Flutter SDK.

说到编译,有两种operation/compilation

  • 静态编译
  • 动态解释

静态编译:静态编译的程序在执行前全部被翻译成机器码。例如:AOT(提前)- C/C++.

动态解释:是一对一翻译执行的。例如:JIT(准时制)- Javascript/Python.


现在我们知道了dart代码如何转换为机器码,以及两种编译方式。

但是这两种编译跟Flutter有什么关系呢?

要知道这一点,我们需要了解几件事。 Flutter 不使用任何类型的 Web 视图或操作系统的本机控件。相反,flutter 使用它自己的高性能渲染引擎(Skia)来绘制小部件。

而高性能主要靠两点来保证。

  • Dart 语言
  • 拥有 render/draw 小部件的引擎

现在我们终于进入正题了。在讲dart语言的编译过程之前,需要说明的是,JIT&AOT指的是程序运行s的方式,与编程语言没有强相关。有些语言同时支持 JIT 和 AOT,例如:Java、Python.

first time - Compiled -> intermediate byte code
later -> byte code will be directly executed

DART 运行时间和编译器还支持两个关键功能的组合 - JIT 和 AOT。


???如果您有兴趣了解 Flutter 框架结构 ??? 底部两层(Foundation and Animation, Painting, Gestures)合并为dart UI层,dart:ui.

渲染层负责构建UI树,如果发生任何变化,比较并更新widget树。最后在设备屏幕上绘制(类似于 React Virtual DOM)。

Widgets层是flutter提供的基础组件库

而top(Material, Cupertino)是flutter提供的组件库。这是 where/what 我们开发人员最常处理的问题。

我想,现在大家都清楚了。快乐编码!

更新:2022 年 4 月 23 日

Flutter 的渲染引擎 Skia 使用 Metal 在 iOS 上渲染整个应用程序的 UI。与本机 iOS 开发不同,没有呈现 UI 组件。这一切都是使用 Apple 的 Metal 引擎绘制在屏幕上的。下面是在xcode-

中使用3D调试的证明

来源:book.flutterchina.club,flutter.dev,maximilian schwarzmüller的flutter课程,Flutter官方YouTube频道,@vandadnp