From efe8737ea0a26d73dbbbe87b0a7da00b77ee5fbf Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Thu, 21 Nov 2024 09:53:57 -0800 Subject: [PATCH] Shut down DevTools and DDS processes if flutter_tools is killed by a signal (#159238) See https://github.com/flutter/flutter/issues/159154 --- .../lib/src/resident_devtools_handler.dart | 4 +--- packages/flutter_tools/lib/src/run_hot.dart | 2 ++ .../flutter_tools/test/general.shard/hot_shared.dart | 10 +++++++--- .../flutter_tools/test/general.shard/run_hot_test.dart | 4 ++++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/flutter_tools/lib/src/resident_devtools_handler.dart b/packages/flutter_tools/lib/src/resident_devtools_handler.dart index ae5f2b2a840..38e66b64e64 100644 --- a/packages/flutter_tools/lib/src/resident_devtools_handler.dart +++ b/packages/flutter_tools/lib/src/resident_devtools_handler.dart @@ -69,7 +69,6 @@ class FlutterResidentDevtoolsHandler implements ResidentDevtoolsHandler { final ResidentRunner _residentRunner; final Logger _logger; bool _shutdown = false; - bool _served = false; @visibleForTesting bool launchedInBrowser = false; @@ -105,7 +104,6 @@ class FlutterResidentDevtoolsHandler implements ResidentDevtoolsHandler { _devToolsLauncher.devToolsUrl = devToolsServerAddress; } else { await _devToolsLauncher.serve(); - _served = true; } await _devToolsLauncher.ready; // Do not attempt to print debugger list if the connection has failed or if we're shutting down. @@ -305,7 +303,7 @@ class FlutterResidentDevtoolsHandler implements ResidentDevtoolsHandler { @override Future shutdown() async { _shutdown = true; - if (_devToolsLauncher == null || !_served) { + if (_devToolsLauncher == null) { return; } _readyToAnnounce = false; diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 1f8d040ca7c..3d737c5913c 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart @@ -1248,8 +1248,10 @@ class HotRunner extends ResidentRunner { @override Future cleanupAfterSignal() async { + await residentDevtoolsHandler!.shutdown(); await stopEchoingDeviceLog(); await hotRunnerConfig!.runPreShutdownOperations(); + shutdownDartDevelopmentService(); if (stopAppDuringCleanup) { return exitApp(); } diff --git a/packages/flutter_tools/test/general.shard/hot_shared.dart b/packages/flutter_tools/test/general.shard/hot_shared.dart index 5a1bda9d231..7b878c10691 100644 --- a/packages/flutter_tools/test/general.shard/hot_shared.dart +++ b/packages/flutter_tools/test/general.shard/hot_shared.dart @@ -54,7 +54,7 @@ class FakeDevice extends Fake implements Device { bool disposed = false; @override - final DartDevelopmentService dds = _FakeDartDevelopmentService(); + final DartDevelopmentService dds = FakeDartDevelopmentService(); @override bool isSupported() => true; @@ -94,9 +94,13 @@ class FakeDevice extends Fake implements Device { } } -class _FakeDartDevelopmentService extends Fake implements DartDevelopmentService { +class FakeDartDevelopmentService extends Fake implements DartDevelopmentService { + bool wasShutdown = false; + @override - void shutdown() {} + void shutdown() { + wasShutdown = true; + } } class FakeFlutterDevice extends Fake implements FlutterDevice { diff --git a/packages/flutter_tools/test/general.shard/run_hot_test.dart b/packages/flutter_tools/test/general.shard/run_hot_test.dart index d1394c1a3ef..c53ba116481 100644 --- a/packages/flutter_tools/test/general.shard/run_hot_test.dart +++ b/packages/flutter_tools/test/general.shard/run_hot_test.dart @@ -9,6 +9,7 @@ import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; +import 'package:flutter_tools/src/resident_devtools_handler.dart'; import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/vmservice.dart'; @@ -56,11 +57,14 @@ void main() { target: 'main.dart', debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), analytics: _FakeAnalytics(), + devtoolsHandler: createNoOpHandler, ); await runner.run(); await runner.cleanupAfterSignal(); expect(flutterDevice.wasExited, true); + expect((flutterDevice.device.dds as FakeDartDevelopmentService).wasShutdown, true); + expect((runner.residentDevtoolsHandler! as NoOpDevtoolsHandler).wasShutdown, true); }, overrides: { FileSystem: () => fileSystem,