返回

揭秘 Flutter 之 Dart 虚拟机启动

Android

引言

在探索 Flutter 之 Engine 启动流程时,我们了解到 Engine 的启动涉及 Dart VM 的创建和调用入口函数 main。本文将深入探讨 Dart VM 的启动过程,揭开其创建和初始化的机制。

创建 Dart VM

Dart VM 的创建过程与平台密切相关。在 Android 平台上,通过调用 Dart_CreateIsolate 函数创建 Dart VM,而 iOS 平台上则使用 Dart_CreateIsolateGroup 函数。

Android

Dart_Isolate isolate = Dart_CreateIsolate(
    "my_isolate",   // 标识符
    script_uri,     // 脚本 URI
    nullptr,       // 包含应用程序代码的 buffer
    nullptr,       // 传递给 main() 的数据
    nullptr        // 错误处理程序
);

iOS

Dart_Isolate isolate_group = Dart_CreateIsolateGroup(
    "my_isolate_group",   // 标识符
    script_uri,     // 脚本 URI
    nullptr,       // 包含应用程序代码的 buffer
    nullptr,       // 传递给 main() 的数据
    nullptr        // 错误处理程序
);

创建成功后,Dart VM 将初始化其内部数据结构,包括堆、栈和垃圾收集器。

初始化 Dart VM

Dart VM 初始化涉及多个步骤,包括:

  • 加载应用程序代码: Dart VM 从指定的脚本 URI 加载应用程序代码。
  • 编译代码: 加载的代码被编译成 Dart 字节码。
  • 创建入口点: Dart VM 为 main 函数创建入口点。
  • 设置参数: 将传递给 main 函数的数据作为参数传递。
  • 启动执行: Dart VM 启动执行 main 函数,从而启动 Flutter 应用程序。

Android 和 iOS 的差异

Dart VM 在 Android 和 iOS 平台上的创建和初始化过程略有不同。

在 Android 上,每个 isolate 都对应一个单独的 Dart VM。而 iOS 上,Dart VM 由一个称为 isolate group 的机制管理,其中包含多个 isolate

结论

了解 Dart VM 的创建和初始化过程对于深入理解 Flutter 的底层运行机制至关重要。通过本文,我们揭开了 Dart VM 启动过程的面纱,探索了其创建、初始化和跨平台差异的机制。掌握这些知识将有助于读者开发出更强大、更高效的 Flutter 应用程序。