Open5
Flutter Engineが実行されるまでを調べた軌跡 for Android
engine/src/flutter/shell/platform/android/AndroidManifest.xml
を参照すると、
- Applicaton:
FlutterApplication
- Activity:
FlutterAcitvity
が存在することがわかる。
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();
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;
}
続いて、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;
}
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();
}