| Index: packages/flutter_tools/lib/src/commands/build_aot.dart
|
| diff --git a/packages/flutter_tools/lib/src/commands/build_aot.dart b/packages/flutter_tools/lib/src/commands/build_aot.dart
|
| index e5b31a908051ac3e60af5c3a5b785cb90bf52b0e..8389a4b4b545d8b4deab16aa15137826e7f612fc 100644
|
| --- a/packages/flutter_tools/lib/src/commands/build_aot.dart
|
| +++ b/packages/flutter_tools/lib/src/commands/build_aot.dart
|
| @@ -15,6 +15,7 @@ import '../build_info.dart';
|
| import '../dart/package_map.dart';
|
| import '../globals.dart';
|
| import '../resident_runner.dart';
|
| +import '../toolchain.dart';
|
| import 'build.dart';
|
|
|
| // Files generated by the ahead-of-time snapshot builder.
|
| @@ -52,8 +53,10 @@ class BuildAotCommand extends BuildSubCommand {
|
|
|
| String typeName = path.basename(tools.getEngineArtifactsDirectory(platform, getBuildMode()).path);
|
| Status status = logger.startProgress('Building AOT snapshot in ${getModeName(getBuildMode())} mode ($typeName)...');
|
| - String outputPath = await buildAotSnapshot(
|
| - findMainDartFile(targetFile),
|
| + String dartFile = findMainDartFile(targetFile);
|
| + String dillFile = await buildDilFile(dartFile);
|
| + String outputPath = await buildAotSnapshot(
|
| + dillFile != null ? dillFile : dartFile,
|
| platform,
|
| getBuildMode(),
|
| outputPath: argResults['output-dir'],
|
| @@ -72,6 +75,87 @@ String _getSdkExtensionPath(PackageMap packageMap, String package) {
|
| return path.dirname(packageMap.map[package].toFilePath());
|
| }
|
|
|
| +
|
| +Future<String> buildDilFile(String dartFile) async {
|
| + String engineSourcePath = ToolConfiguration.instance.engineSrcPath;
|
| + String engineBuildPath = ToolConfiguration.instance.engineBuildPath;
|
| + if (engineSourcePath == null) {
|
| + throw new Exception('Engine source path not found!');
|
| + }
|
| + if (engineBuildPath == null) {
|
| + throw new Exception('Engine build path path not found!');
|
| + }
|
| + String buildScript = path.join(
|
| + engineSourcePath, 'dart/pkg/kernel/bin/dartk.dart');
|
| + String transformScript = path.join(
|
| + engineSourcePath, 'dart/pkg/kernel/bin/transform.dart');
|
| + String patchedSdk = path.join(
|
| + engineBuildPath, 'patched_sdk');
|
| +
|
| + PackageMap packageMap = new PackageMap(PackageMap.globalPackagesPath);
|
| + String packageMapError = packageMap.checkValid();
|
| + if (packageMapError != null) {
|
| + printError(packageMapError);
|
| + return null;
|
| + }
|
| +
|
| + String skyEnginePkg = _getSdkExtensionPath(packageMap, 'sky_engine');
|
| + String uiPath = path.join(skyEnginePkg, 'dart_ui', 'ui.dart');
|
| + String jniPath = path.join(skyEnginePkg, 'dart_jni', 'jni.dart');
|
| + String vmServicePath = path.join(skyEnginePkg, 'sdk_ext', 'vmservice_io.dart');
|
| +
|
| + String dillFile = dartFile.replaceAll('.dart', '.dill');
|
| + String transformedDillFile = dartFile.replaceAll('.dart', '.transformed.dill');
|
| + String inferredDillFile = dartFile.replaceAll('.dart', '.transformed.inferred.dill');
|
| + RunResult results = await runAsync(<String>[
|
| + 'dart',
|
| + '-c',
|
| + buildScript,
|
| + dartFile,
|
| + '--target=flutter',
|
| + '--link',
|
| + '--sdk=$patchedSdk',
|
| + '-o',
|
| + dillFile,
|
| + '--url-mapping=dart:ui::$uiPath',
|
| + '--url-mapping=dart:jni::$jniPath',
|
| + '--url-mapping=dart:vmservice_sky::$vmServicePath',
|
| + ]);
|
| + if (results.exitCode != 0) {
|
| + printStatus(results.toString());
|
| + return null;
|
| + }
|
| + results = await runAsync(<String>[
|
| + transformScript,
|
| + '-o',
|
| + transformedDillFile,
|
| + dillFile,
|
| + ]);
|
| + if (results.exitCode != 0) {
|
| + printStatus(results.toString());
|
| + return null;
|
| + }
|
| +
|
| + bool disableInference = false;
|
| + //bool disableInference = true;
|
| + if (disableInference) return transformedDillFile;
|
| +
|
| + results = await runAsync(<String>[
|
| + transformScript,
|
| + '-t',
|
| + 'infervalues',
|
| + '-o',
|
| + inferredDillFile,
|
| + transformedDillFile,
|
| + ]);
|
| + if (results.exitCode != 0) {
|
| + printStatus(results.toString());
|
| + return null;
|
| + }
|
| +
|
| + return inferredDillFile;
|
| +}
|
| +
|
| /// Build an AOT snapshot. Return `null` (and log to `printError`) if the method
|
| /// fails.
|
| Future<String> buildAotSnapshot(
|
|
|