Place hot reload artifacts in a temp directory (#40171)
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 770253d..b373751 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -536,34 +536,33 @@ this.ipv6, this.stayResident = true, this.hotMode = true, - this.dillOutputPath, + String dillOutputPath, }) : mainPath = findMainDartFile(target), projectRootPath = projectRootPath ?? fs.currentDirectory.path, packagesFilePath = packagesFilePath ?? fs.path.absolute(PackageMap.globalPackagesPath), + _dillOutputPath = dillOutputPath, + artifactDirectory = dillOutputPath == null + ? fs.systemTempDirectory.createTempSync('_fluttter_tool') + : fs.file(dillOutputPath).parent, assetBundle = AssetBundleFactory.instance.createBundle() { - // TODO(jonahwilliams): this is transitionary logic to allow us to support - // platforms that are not yet using flutter assemble. In the "new world", - // builds are isolated based on a number of factors. Thus, we cannot assume - // that a debug build will create the expected `build/app.dill` file. For - // now, I'm working around this by just creating it if it is missing here. - // In the future, once build & run are more strongly separated, the build - // environment will be plumbed through so that it all comes from a single - // source of truth, the [Environment]. - final File dillOutput = fs.file(dillOutputPath ?? fs.path.join('build', 'app.dill')); - if (!dillOutput.existsSync()) { - dillOutput.createSync(recursive: true); + if (!artifactDirectory.existsSync()) { + artifactDirectory.createSync(recursive: true); } } @protected @visibleForTesting final List<FlutterDevice> flutterDevices; + final String target; final DebuggingOptions debuggingOptions; final bool stayResident; final bool ipv6; + final String _dillOutputPath; + /// The parent location of the incremental artifacts. + @visibleForTesting + final Directory artifactDirectory; final Completer<int> _finished = Completer<int>(); - final String dillOutputPath; final String packagesFilePath; final String projectRootPath; final String mainPath; @@ -571,6 +570,8 @@ bool _exited = false; bool hotMode ; + + String get dillOutputPath => _dillOutputPath ?? fs.path.join(artifactDirectory.path, 'app.dill'); String getReloadPath({ bool fullRestart }) => mainPath + (fullRestart ? '' : '.incremental') + '.dill'; bool get debuggingEnabled => debuggingOptions.debuggingEnabled; @@ -716,6 +717,7 @@ /// Throws an [AssertionError] if [Devce.supportsScreenshot] is not true. Future<void> screenshot(FlutterDevice device) async { assert(device.device.supportsScreenshot); + final Status status = logger.startProgress('Taking screenshot for ${device.device.name}...', timeout: timeoutConfiguration.fastOperation); final File outputFile = getUniqueFile(fs.currentDirectory, 'flutter', 'png'); try { @@ -850,7 +852,13 @@ return exitCode; } - Future<void> preExit() async { } + @mustCallSuper + Future<void> preExit() async { + // If _dillOutputPath is null, we created a temporary directory for the dill. + if (_dillOutputPath == null && artifactDirectory.existsSync()) { + artifactDirectory.deleteSync(recursive: true); + } + } Future<void> exitApp() async { final List<Future<void>> futures = <Future<void>>[];
diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart index b621c78..ddfde2e 100644 --- a/packages/flutter_tools/lib/src/run_cold.dart +++ b/packages/flutter_tools/lib/src/run_cold.dart
@@ -206,5 +206,6 @@ if (device.vmServices == null || device.vmServices.isEmpty) await device.device.stopApp(device.package); } + await super.preExit(); } }
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 3be3253..f9b590a 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -1010,6 +1010,7 @@ Future<void> preExit() async { await _cleanupDevFS(); await hotRunnerConfig.runPreShutdownOperations(); + await super.preExit(); } @override