diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 359f13bd834b6..663ccd21f2fb1 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -7,6 +7,7 @@ #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine_Internal.h" #include +#include #include #import "flutter/shell/platform/darwin/macos/framework/Source/FlutterDartProject_Internal.h" @@ -162,6 +163,16 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, #pragma mark - +namespace { + +struct AotDataDeleter { + void operator()(FlutterEngineAOTData aot_data) { FlutterEngineCollectAOTData(aot_data); } +}; + +using UniqueAotDataPtr = std::unique_ptr<_FlutterEngineAOTData, AotDataDeleter>; + +} + @implementation FlutterEngine { // The embedding-API-level engine object. FLUTTER_API_SYMBOL(FlutterEngine) _engine; @@ -184,6 +195,9 @@ @implementation FlutterEngine { // A mapping of textureID to internal FlutterExternalTextureGL adapter. NSMutableDictionary* _textures; + + // Pointer to the Dart AOT snapshot and instruction data. + UniqueAotDataPtr _aotData; } - (instancetype)initWithName:(NSString*)labelPrefix project:(FlutterDartProject*)project { @@ -274,6 +288,11 @@ - (BOOL)runWithEntrypoint:(NSString*)entrypoint { }; flutterArguments.custom_task_runners = &custom_task_runners; + _aotData = [self loadAotData:flutterArguments.assets_path]; + if (_aotData) { + flutterArguments.aot_data = _aotData.get(); + } + FlutterEngineResult result = FlutterEngineInitialize( FLUTTER_ENGINE_VERSION, &rendererConfig, &flutterArguments, (__bridge void*)(self), &_engine); if (result != kSuccess) { @@ -293,6 +312,33 @@ - (BOOL)runWithEntrypoint:(NSString*)entrypoint { return YES; } +- (UniqueAotDataPtr)loadAotData:(std::string)assetsDir { + if (!FlutterEngineRunsAOTCompiledDartCode()) { + return nullptr; + } + + std::filesystem::path assetsFsDir(assetsDir); + std::filesystem::path elfFile("app_elf_snapshot.so"); + auto fullElfPath = assetsFsDir / elfFile; + + if (!std::filesystem::exists(fullElfPath)) { + return nullptr; + } + + FlutterEngineAOTDataSource source = {}; + source.type = kFlutterEngineAOTDataSourceTypeElfPath; + source.elf_path = fullElfPath.c_str(); + + FlutterEngineAOTData data = nullptr; + auto result = FlutterEngineCreateAOTData(&source, &data); + if (result != kSuccess) { + NSLog(@"Failed to load AOT data from: %@", @(fullElfPath.c_str())); + return nullptr; + } + + return UniqueAotDataPtr(data); +} + - (void)setViewController:(FlutterViewController*)controller { _viewController = controller; _mainOpenGLContext = controller.flutterView.openGLContext;