Flutter 引擎启动流程

933 阅读1分钟

nch ,经过一系列的调用之后,最终会调用 DartIsolate::RunFromLibrary,这个函数中会调用 InvokeMainEntrypoint 函数完成对 Dart main 函数的调用,由此进入 Flutter 的领域。Flutter 先建立好自身运营所需的环境之后,便通过与 C++ 互相调用的方法,利用 C++ 作为与 native 的中介,获取 native 上的一些服务,具体到 Android 上的话,就是 Choreographer 、TouchEvent 等,另外,画面的绘制等工作,也会交给 C++ 完成,还有可以为 Flutter 提供更多 native 功能的插件,为其提供服务 MethodChannel ,只是一种封装

GeneratedPluginRegistrant.registerWith(PluginRegistry)

这个方法会在 FlutterActivity 的 onCreate 方法中调用,GeneratedPluginRegistrant 是自动生成的一个类,用于注册所有在 pubspec.yaml 中声明的 Flutter 插件,比如 shared_preference 插件,生成的类就是这样的:

public static void registerWith(PluginRegistry registry) {
  if (alreadyRegisteredWith(registry)) {
    return;
  }
  SharedPreferencesPlugin.registerWith(registry.registrarFor("io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin"));
}

private static boolean alreadyRegisteredWith(PluginRegistry registry) {
  final String key = GeneratedPluginRegistrant.class.getCanonicalName();
  if (registry.hasPlugin(key)) {
    return true;
  }
  registry.registrarFor(key);
  return false;
}

先判断是否已经注册过插件,然后执行插件的 registerWith 方法,这个方法将由插件实现,这也是插件必须实现的一个方法。