Flutter 引擎啟動流程

無若葉發表於2020-03-06

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 方法,這個方法將由外掛實現,這也是外掛必須實現的一個方法。

相關文章