7
7
#import " flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine_Internal.h"
8
8
9
9
#include < algorithm>
10
+ #include < filesystem>
10
11
#include < vector>
11
12
12
13
#import " flutter/shell/platform/darwin/macos/framework/Source/FlutterDartProject_Internal.h"
@@ -162,6 +163,16 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine,
162
163
163
164
#pragma mark -
164
165
166
+ namespace {
167
+
168
+ struct AotDataDeleter {
169
+ void operator ()(FlutterEngineAOTData aot_data) { FlutterEngineCollectAOTData (aot_data); }
170
+ };
171
+
172
+ using UniqueAotDataPtr = std::unique_ptr<_FlutterEngineAOTData, AotDataDeleter>;
173
+
174
+ }
175
+
165
176
@implementation FlutterEngine {
166
177
// The embedding-API-level engine object.
167
178
FLUTTER_API_SYMBOL (FlutterEngine) _engine;
@@ -184,6 +195,9 @@ @implementation FlutterEngine {
184
195
185
196
// A mapping of textureID to internal FlutterExternalTextureGL adapter.
186
197
NSMutableDictionary <NSNumber *, FlutterExternalTextureGL*>* _textures;
198
+
199
+ // Pointer to the Dart AOT snapshot and instruction data.
200
+ UniqueAotDataPtr _aotData;
187
201
}
188
202
189
203
- (instancetype )initWithName : (NSString *)labelPrefix project : (FlutterDartProject*)project {
@@ -274,6 +288,11 @@ - (BOOL)runWithEntrypoint:(NSString*)entrypoint {
274
288
};
275
289
flutterArguments.custom_task_runners = &custom_task_runners;
276
290
291
+ _aotData = [self loadAotData: flutterArguments.assets_path];
292
+ if (_aotData) {
293
+ flutterArguments.aot_data = _aotData.get ();
294
+ }
295
+
277
296
FlutterEngineResult result = FlutterEngineInitialize (
278
297
FLUTTER_ENGINE_VERSION, &rendererConfig, &flutterArguments, (__bridge void *)(self), &_engine);
279
298
if (result != kSuccess ) {
@@ -293,6 +312,33 @@ - (BOOL)runWithEntrypoint:(NSString*)entrypoint {
293
312
return YES ;
294
313
}
295
314
315
+ - (UniqueAotDataPtr)loadAotData : (std::string)assetsDir {
316
+ if (!FlutterEngineRunsAOTCompiledDartCode ()) {
317
+ return nullptr ;
318
+ }
319
+
320
+ std::filesystem::path assetsFsDir (assetsDir);
321
+ std::filesystem::path elfFile (" app_elf_snapshot.so" );
322
+ auto fullElfPath = assetsFsDir / elfFile;
323
+
324
+ if (!std::filesystem::exists (fullElfPath)) {
325
+ return nullptr ;
326
+ }
327
+
328
+ FlutterEngineAOTDataSource source = {};
329
+ source.type = kFlutterEngineAOTDataSourceTypeElfPath ;
330
+ source.elf_path = fullElfPath.c_str ();
331
+
332
+ FlutterEngineAOTData data = nullptr ;
333
+ auto result = FlutterEngineCreateAOTData (&source, &data);
334
+ if (result != kSuccess ) {
335
+ NSLog (@" Failed to load AOT data from: %@ " , @(fullElfPath.c_str()));
336
+ return nullptr ;
337
+ }
338
+
339
+ return UniqueAotDataPtr (data);
340
+ }
341
+
296
342
- (void )setViewController : (FlutterViewController*)controller {
297
343
_viewController = controller;
298
344
_mainOpenGLContext = controller.flutterView .openGLContext ;
0 commit comments