Generate and use dep-file for --preview-dart-2 (#15077)

* Use depfile in --preview-dart-2 mode.

* Generate and use frontend_server.d to guard against reusing outdated dill files when frontend_server changes.
diff --git a/packages/flutter_tools/gradle/flutter.gradle b/packages/flutter_tools/gradle/flutter.gradle
index 403575a..0f95bba 100644
--- a/packages/flutter_tools/gradle/flutter.gradle
+++ b/packages/flutter_tools/gradle/flutter.gradle
@@ -438,9 +438,9 @@
             if (buildMode != "debug") {
                 args "--precompiled"
             } else {
+                args "--depfile", "${intermediateDir}/snapshot_blob.bin.d"
                 if (!previewDart2) {
                     args "--snapshot", "${intermediateDir}/snapshot_blob.bin"
-                    args "--depfile", "${intermediateDir}/snapshot_blob.bin.d"
                 }
             }
             args "--working-dir", "${intermediateDir}/flutter_assets"
@@ -508,6 +508,12 @@
             if (snapshotter != null) {
                 sources = sources.plus(snapshotter)
             }
+            if (previewDart2) {
+                FileCollection frontendServer = readDependencies(project.file("${intermediateDir}/frontend_server.d"))
+                if (frontendServer != null) {
+                    sources = sources.plus(frontendServer)
+                }
+            }
             if (localEngineSrcPath != null) {
                 sources = sources.plus(project.files("$localEngineSrcPath/$localEngine"))
             }
diff --git a/packages/flutter_tools/lib/src/commands/build_aot.dart b/packages/flutter_tools/lib/src/commands/build_aot.dart
index 5180509..a4409c5 100644
--- a/packages/flutter_tools/lib/src/commands/build_aot.dart
+++ b/packages/flutter_tools/lib/src/commands/build_aot.dart
@@ -367,6 +367,7 @@
       sdkRoot: artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
       mainPath: mainPath,
       outputFilePath: kApplicationKernelPath,
+      depFilePath: dependencies,
       extraFrontEndOptions: extraFrontEndOptions,
       linkPlatformKernelIn : true,
       aot : true,
@@ -376,6 +377,10 @@
       printError('Compiler terminated unexpectedly.');
       return null;
     }
+    // Write path to frontend_server, since things need to be re-generated when
+    // that changes.
+    await outputDir.childFile('frontend_server.d')
+        .writeAsString('frontend_server.d: ${artifacts.getArtifactPath(Artifact.frontendServerSnapshotForEngineDartSdk)}\n');
 
     genSnapshotCmd.addAll(<String>[
       '--reify-generic-functions',
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index b74327e..bfee499 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -59,6 +59,7 @@
     {String sdkRoot,
     String mainPath,
     String outputFilePath,
+    String depFilePath,
     bool linkPlatformKernelIn: false,
     bool aot: false,
     bool trackWidgetCreation: false,
@@ -96,6 +97,9 @@
   if (outputFilePath != null) {
     command.addAll(<String>['--output-dill', outputFilePath]);
   }
+  if (depFilePath != null) {
+    command.addAll(<String>['--depfile', depFilePath]);
+  }
 
   if (extraFrontEndOptions != null)
     command.addAll(extraFrontEndOptions);
diff --git a/packages/flutter_tools/lib/src/flx.dart b/packages/flutter_tools/lib/src/flx.dart
index fd0b136..b7b8236 100644
--- a/packages/flutter_tools/lib/src/flx.dart
+++ b/packages/flutter_tools/lib/src/flx.dart
@@ -80,11 +80,15 @@
       incrementalCompilerByteStorePath: fs.path.absolute(getIncrementalCompilerByteStoreDirectory()),
       mainPath: fs.file(mainPath).absolute.path,
       outputFilePath: applicationKernelFilePath,
+      depFilePath: depfilePath,
       trackWidgetCreation: trackWidgetCreation,
     );
     if (kernelBinaryFilename == null) {
       throwToolExit('Compiler terminated unexpectedly on $mainPath');
     }
+    await fs.directory(getBuildDirectory()).childFile('frontend_server.d')
+        .writeAsString('frontend_server.d: ${artifacts.getArtifactPath(Artifact.frontendServerSnapshotForEngineDartSdk)}\n');
+
     kernelContent = new DevFSFileContent(fs.file(kernelBinaryFilename));
   }