Open5

Flutter Engineが実行されるまでを調べた軌跡 for Android

johnnymanjohnnyman

engine/src/flutter/shell/platform/android/AndroidManifest.xml
を参照すると、

  • Applicaton: FlutterApplication
  • Activity: FlutterAcitvity
    が存在することがわかる。
johnnymanjohnnyman

FlutterApplicationの実装は以下。

public class FlutterApplication extends Application {
  @Override
  @CallSuper
  public void onCreate() {
    super.onCreate();
    FlutterInjector.instance().flutterLoader().startInitialization(this);
  }

そのうちFutureLoader.startInitialization()では主に以下を実行している。

// System.loadLibrary("flutter")を実行し、JNIでlibflutter.soを呼び出し
flutterJNI.loadLibrary();

// フレームレートを60FPSに設定
flutterJNI.updateRefreshRate();

johnnymanjohnnyman

JNIの呼び出しでは、FlutterのJavaコードとAndroidネイティブAPIのマッピング行われる。

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
  // Initialize the Java VM.
  fml::jni::InitJavaVM(vm);

  // Registery dlsym lookups for NDK functions
  flutter::NDKHelpers::Init();

  JNIEnv* env = fml::jni::AttachCurrentThread();
  bool result = false;

  // Register FlutterMain.
  result = flutter::FlutterMain::Register(env);
  FML_CHECK(result);

  // Register PlatformView 
  result = flutter::PlatformViewAndroid::Register(env);

  // Register VSyncWaiter.
  result = flutter::VsyncWaiterAndroid::Register(env);
  FML_CHECK(result);

  // Register AndroidImageDecoder.
  result = flutter::AndroidImageGenerator::Register(env);
  FML_CHECK(result);

  return JNI_VERSION_1_4;
}
johnnymanjohnnyman

続いて、FlutterAcitivityについて。
Eingineの中にはFlutterActivityクラスが2つ定義されているが、下記のものが実際にアプリケーションコードで実行されている(もう一方はDeprecated)。

shell/platform/android/io/flutter/embedding/android/FlutterActivityAndFragmentDelegate

  void onAttach(@NonNull Context context) {
    ensureAlive();

    if (flutterEngine == null) {
      // ここでFlutterEngineが起動される
      setUpFlutterEngine();
    }

    if (host.shouldAttachEngineToActivity()) {
     // FlutterEingineとActivityのライフサイクルを同期させる
      flutterEngine.getActivityControlSurface().attachToActivity(this, host.getLifecycle());
    }

    platformPlugin = host.providePlatformPlugin(host.getActivity(), flutterEngine);

    host.configureFlutterEngine(flutterEngine);
    isAttached = true;
  }
johnnymanjohnnyman

FlutterApplication自体も必須ではなくなっているようだ。

shell/platform/android/io/flutter/embedding/android/FlutterActivityのonCreateですべて実行されている模様。

  protected void onCreate(@Nullable Bundle savedInstanceState) {
    switchLaunchThemeForNormalTheme();

    super.onCreate(savedInstanceState);

    delegate = new FlutterActivityAndFragmentDelegate(this);
    delegate.onAttach(this);
    delegate.onRestoreInstanceState(savedInstanceState);

    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);

    configureWindowForTransparency();

    setContentView(createFlutterView());

    configureStatusBarForFullscreenFlutterExperience();
  }