From f149eec31bfeb5b165cdd507397c657c8c876b56 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 17 Mar 2020 16:37:06 -0700 Subject: [PATCH] [flutter_tools] always initialize the resident runner from dill (#52497) --- .../lib/src/resident_runner.dart | 14 +++++++++++++- .../general.shard/resident_runner_test.dart | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 29edd8dd56..5e8ba3954e 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -75,6 +75,12 @@ class FlutterDevice { if (device.platformType == PlatformType.fuchsia) { targetModel = TargetModel.flutterRunner; } + // For both web and non-web platforms we initialize dill to/from + // a shared location for faster bootstrapping. If the compiler fails + // due to a kernel target or version mismatch, no error is reported + // and the compiler starts up as normal. Unexpected errors will print + // a warning message and dump some debug information which can be + // used to file a bug, but the compiler will still start up correctly. if (targetPlatform == TargetPlatform.web_javascript) { generator = ResidentCompiler( globals.artifacts.getArtifactPath(Artifact.flutterWebSdk, mode: buildInfo.mode), @@ -84,6 +90,7 @@ class FlutterDevice { // Override the filesystem scheme so that the frontend_server can find // the generated entrypoint code. fileSystemScheme: 'org-dartlang-app', + initializeFromDill: globals.fs.path.join(getBuildDirectory(), 'cache.dill'), targetModel: TargetModel.dartdevc, experimentalFlags: experimentalFlags, platformDill: globals.fs.file(globals.artifacts @@ -107,6 +114,7 @@ class FlutterDevice { targetModel: targetModel, experimentalFlags: experimentalFlags, dartDefines: buildInfo.dartDefines, + initializeFromDill: globals.fs.path.join(getBuildDirectory(), 'cache.dill'), ); } @@ -637,7 +645,6 @@ abstract class ResidentRunner { final bool ipv6; final String _dillOutputPath; /// The parent location of the incremental artifacts. - @visibleForTesting final Directory artifactDirectory; final String packagesFilePath; final String projectRootPath; @@ -1017,6 +1024,11 @@ abstract class ResidentRunner { Future preExit() async { // If _dillOutputPath is null, we created a temporary directory for the dill. if (_dillOutputPath == null && artifactDirectory.existsSync()) { + final File outputDill = artifactDirectory.childFile('app.dill'); + if (outputDill.existsSync()) { + artifactDirectory.childFile('app.dill') + .copySync(globals.fs.path.join(getBuildDirectory(), 'cache.dill')); + } artifactDirectory.deleteSync(recursive: true); } } diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart index 39ab340b2d..f3f9ab8cd1 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:file/memory.dart'; +import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/command_help.dart'; import 'package:flutter_tools/src/base/common.dart'; @@ -356,6 +357,22 @@ void main() { expect(otherRunner.artifactDirectory.path, contains('foobar')); })); + test('ResidentRunner copies output dill to cache location during preExit', () => testbed.run(() async { + residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('hello'); + await residentRunner.preExit(); + final File cacheDill = globals.fs.file(globals.fs.path.join(getBuildDirectory(), 'cache.dill')); + + expect(cacheDill, exists); + expect(cacheDill.readAsStringSync(), 'hello'); + })); + + test('ResidentRunner handles output dill missing during preExit', () => testbed.run(() async { + await residentRunner.preExit(); + final File cacheDill = globals.fs.file(globals.fs.path.join(getBuildDirectory(), 'cache.dill')); + + expect(cacheDill, isNot(exists)); + })); + test('ResidentRunner printHelpDetails', () => testbed.run(() { when(mockDevice.supportsHotRestart).thenReturn(true); when(mockDevice.supportsScreenshot).thenReturn(true); @@ -697,6 +714,8 @@ void main() { target: null, )).generator as DefaultResidentCompiler; + expect(residentCompiler.initializeFromDill, + globals.fs.path.join(getBuildDirectory(), 'cache.dill')); expect(residentCompiler.librariesSpec, globals.fs.file(globals.artifacts.getArtifactPath(Artifact.flutterWebLibrariesJson)) .uri.toString());