Revert "[flutter_tools] only copy cached dill after startup (#58188)" (#58454)

This reverts commit 39d1e4b7e9222394d6013aa21731968b36b30cc7.
diff --git a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart
index b4cd7a4..0ecb2d6 100644
--- a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart
+++ b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart
@@ -434,7 +434,6 @@
             return 1;
           }
           device.generator.accept();
-          cacheInitialDillCompilation();
         } else {
           await buildWeb(
             flutterProject,
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 00b9f7f..b7ced11 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -1099,19 +1099,6 @@
     );
   }
 
-  @protected
-  void cacheInitialDillCompilation() {
-    globals.logger.printTrace('Caching compiled dill');
-    final File outputDill = globals.fs.file(dillOutputPath);
-    if (outputDill.existsSync()) {
-      final String copyPath = getDefaultCachedKernelPath(
-        trackWidgetCreation: trackWidgetCreation,
-      );
-      globals.fs.file(copyPath).parent.createSync(recursive: true);
-      outputDill.copySync(copyPath);
-    }
-  }
-
   /// If the [reloadSources] parameter is not null the 'reloadSources' service
   /// will be registered.
   //
@@ -1221,9 +1208,14 @@
 
   @mustCallSuper
   Future<void> preExit() async {
-    // If _dillOutputPath is null, the tool created a temporary directory for
-    // the dill.
+    // If _dillOutputPath is null, we created a temporary directory for the dill.
     if (_dillOutputPath == null && artifactDirectory.existsSync()) {
+      final File outputDill = globals.fs.file(dillOutputPath);
+      if (outputDill.existsSync()) {
+        outputDill.copySync(getDefaultCachedKernelPath(
+          trackWidgetCreation: trackWidgetCreation,
+        ));
+      }
       artifactDirectory.deleteSync(recursive: true);
     }
   }
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index 1c7793c..76fc6e2 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -63,6 +63,7 @@
   List<vm_service.ReloadReport> reports; // List has one report per Flutter view.
 }
 
+// TODO(mklim): Test this, flutter/flutter#23031.
 class HotRunner extends ResidentRunner {
   HotRunner(
     List<FlutterDevice> devices, {
@@ -387,7 +388,6 @@
       if (!results.every((bool passed) => passed)) {
         return 1;
       }
-      cacheInitialDillCompilation();
     } on Exception catch (err) {
       globals.printError(err.toString());
       return 1;
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 9ab5636..319df1a 100644
--- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -521,12 +521,22 @@
     expect(otherRunner.artifactDirectory.path, contains('foobar'));
   }));
 
-  test('ResidentRunner deletes artifact directory on preExit', () => testbed.run(() async {
+  test('ResidentRunner copies output dill to cache location during preExit', () => testbed.run(() async {
     fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
-    residentRunner.artifactDirectory.childFile('app.dill').createSync();
+    residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('hello');
     await residentRunner.preExit();
+    final File cacheDill = globals.fs.file(globals.fs.path.join(getBuildDirectory(), 'cache.dill'));
 
-    expect(residentRunner.artifactDirectory, isNot(exists));
+    expect(cacheDill, exists);
+    expect(cacheDill.readAsStringSync(), 'hello');
+  }));
+
+  test('ResidentRunner handles output dill missing during preExit', () => testbed.run(() async {
+    fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
+    await residentRunner.preExit();
+    final File cacheDill = globals.fs.file(globals.fs.path.join(getBuildDirectory(), 'cache.dill'));
+
+    expect(cacheDill, isNot(exists));
   }));
 
   test('ResidentRunner can run source generation', () => testbed.run(() async {
@@ -1050,64 +1060,6 @@
     expect(await globals.fs.file('foo').readAsString(), testUri.toString());
   }));
 
-  test('HotRunner copies compiled app.dill to cache during startup', () => testbed.run(() async {
-    fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
-      listViews,
-      listViews,
-    ]);
-    setWsAddress(testUri, fakeVmServiceHost.vmService);
-    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-    residentRunner = HotRunner(
-      <FlutterDevice>[
-        mockFlutterDevice,
-      ],
-      stayResident: false,
-      debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
-    );
-    residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
-    when(mockFlutterDevice.runHot(
-      hotRunner: anyNamed('hotRunner'),
-      route: anyNamed('route'),
-    )).thenAnswer((Invocation invocation) async {
-      return 0;
-    });
-    await residentRunner.run();
-
-    expect(await globals.fs.file(globals.fs.path.join('build', 'cache.dill')).readAsString(), 'ABC');
-  }));
-
-  test('HotRunner copies compiled app.dill to cache during startup with --track-widget-creation', () => testbed.run(() async {
-    fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
-      listViews,
-      listViews,
-    ]);
-    setWsAddress(testUri, fakeVmServiceHost.vmService);
-    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-    residentRunner = HotRunner(
-      <FlutterDevice>[
-        mockFlutterDevice,
-      ],
-      stayResident: false,
-      debuggingOptions: DebuggingOptions.enabled(const BuildInfo(
-        BuildMode.debug,
-        '',
-        treeShakeIcons: false,
-        trackWidgetCreation: true,
-      )),
-    );
-    residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
-    when(mockFlutterDevice.runHot(
-      hotRunner: anyNamed('hotRunner'),
-      route: anyNamed('route'),
-    )).thenAnswer((Invocation invocation) async {
-      return 0;
-    });
-    await residentRunner.run();
-
-    expect(await globals.fs.file(globals.fs.path.join('build', 'cache.dill.track.dill')).readAsString(), 'ABC');
-  }));
-
-
   test('HotRunner unforwards device ports', () => testbed.run(() async {
     fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
       listViews,
diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart
index aca6cec..7a30f97 100644
--- a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart
@@ -257,21 +257,13 @@
     expect(bufferLogger.statusText, contains('Debug service listening on ws://127.0.0.1/abcd/'));
     expect(debugConnectionInfo.wsUri.toString(), 'ws://127.0.0.1/abcd/');
   }, overrides: <Type, Generator>{
-    Logger: () => DelegateLogger(BufferLogger.test()),
-  }));
-
-  test('WebRunner copies compiled app.dill to cache during startup', () => testbed.run(() async {
-    fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList());
-    _setupMocks();
-
-    residentWebRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
-    final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
-    unawaited(residentWebRunner.run(
-      connectionInfoCompleter: connectionInfoCompleter,
-    ));
-    await connectionInfoCompleter.future;
-
-    expect(await globals.fs.file(globals.fs.path.join('build', 'cache.dill')).readAsString(), 'ABC');
+    Logger: () => DelegateLogger(BufferLogger(
+      terminal: AnsiTerminal(
+        stdio: null,
+        platform: const LocalPlatform(),
+      ),
+      outputPreferences: OutputPreferences.test(),
+    )),
   }));
 
   test('Can successfully run without an index.html including status warning', () => testbed.run(() async {