Android Flutter 启动流程

FlutterMain.startInitialization(context)

  • initConfig

.android/Flutter/build/intermediates/flutter/release/app.so
.android/Flutter/build/intermediates/flutter/release/vm_snapshot_data
.android/Flutter/build/intermediates/flutter/release/vm_snapshot_instr
.android/Flutter/build/intermediates/flutter/release/isolate_snapshot_data
.android/Flutter/build/intermediates/flutter/release/isolate_snapshot_instr
.android/Flutter/build/intermediates/flutter/release/flutter_assets

  1. private static void initConfig(Context applicationContext) {
  2. try {
  3. Bundle metadata = applicationContext.getPackageManager().getApplicationInfo(applicationContext.getPackageName(), 128).metaData;
  4. if (metadata != null) {
  5. sAotSharedLibraryPath = metadata.getString(PUBLIC_AOT_AOT_SHARED_LIBRARY_PATH, "app.so");
  6. sAotVmSnapshotData = metadata.getString(PUBLIC_AOT_VM_SNAPSHOT_DATA_KEY, "vm_snapshot_data");
  7. sAotVmSnapshotInstr = metadata.getString(PUBLIC_AOT_VM_SNAPSHOT_INSTR_KEY, "vm_snapshot_instr");
  8. sAotIsolateSnapshotData = metadata.getString(PUBLIC_AOT_ISOLATE_SNAPSHOT_DATA_KEY, "isolate_snapshot_data");
  9. sAotIsolateSnapshotInstr = metadata.getString(PUBLIC_AOT_ISOLATE_SNAPSHOT_INSTR_KEY, "isolate_snapshot_instr");
  10. sFlx = metadata.getString(PUBLIC_FLX_KEY, "app.flx");
  11. sFlutterAssetsDir = metadata.getString(PUBLIC_FLUTTER_ASSETS_DIR_KEY, "flutter_assets");
  12. }
  13. } catch (NameNotFoundException var2) {
  14. throw new RuntimeException(var2);
  15. }
  16. }

image.png

  • initAot

image.png

  • initResources

image.png

  • System.loadLibrary(“flutter”)


FlutterMain.ensureInitializationComplete(context)

  1. private static native void nativeInit(Context var0, String[] var1, String var2, String var3, String var4);
  2. appBundlePath = /data/user/0/com.happy/app_flutter/flutter_assets
  3. appStoragePath= /data/user/0/com.happy/files
  4. engineCachesPath= /data/user/0/com.happy/code_cache
  5. nativeInit(applicationContext, (String[])shellArgs.toArray(new String[0]), appBundlePath, appStoragePath, engineCachesPath);


image.png

0 = “—icu-symbol-prefix=_binary_icudtl_dat”
1 = “—icu-native-lib-path=/data/app/com.happy-2Yn7gRujyKyQ2u5McJ0-3g==/lib/x86/libflutter.so”
2 = “—cache-dir-path=/data/user/0/com.happy/code_cache”
3 = “—aot-snapshot-path=/data/user/0/com.happy/app_flutter/flutter_assets”
4 = “—vm-snapshot-data=vm_snapshot_data”
5 = “—vm-snapshot-instr=vm_snapshot_instr”
6 = “—isolate-snapshot-data=isolate_snapshot_data”
7 = “—isolate-snapshot-instr=isolate_snapshot_instr”

runFromBundle

  • FlutterNativeView.runFromBundle
  1. final FlutterRunArguments arguments = new FlutterRunArguments();
  2. arguments.bundlePath = FlutterMain.findAppBundlePath(activity.getApplicationContext());
  3. arguments.entrypoint = "main";
  4. flutterView.runFromBundle(arguments);
  5. GeneratedPluginRegistrant.registerWith(flutterView.getPluginRegistry());
  • FlutterJNI.runBundleAndSnapshotFromLibrary

image.png