diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index ad99ac9e885950fcc8effe3c145322a68a67ebf5..3100f2bb33eddaccf5c6fe53c4559933d8593750 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:meta/meta.dart';
+import 'package:package_config/package_config_types.dart';
 
 import 'base/config.dart';
 import 'base/context.dart';
@@ -33,9 +34,10 @@ class BuildInfo {
     @required this.treeShakeIcons,
     this.performanceMeasurementFile,
     this.packagesPath = '.packages', // TODO(jonahwilliams): make this required and remove the default.
-    this.nullSafetyMode = NullSafetyMode.autodetect,
+    this.nullSafetyMode = NullSafetyMode.sound,
     this.codeSizeDirectory,
     this.androidGradleDaemon = true,
+    this.packageConfig = PackageConfig.empty,
   });
 
   final BuildMode mode;
@@ -134,6 +136,12 @@ class BuildInfo {
   /// The Gradle daemon may also be disabled in the Android application's properties file.
   final bool androidGradleDaemon;
 
+  /// The package configuration for the loaded application.
+  ///
+  /// This is captured once during startup, but the actual package configuration
+  /// may change during a 'flutter run` workflow.
+  final PackageConfig packageConfig;
+
   static const BuildInfo debug = BuildInfo(BuildMode.debug, null, treeShakeIcons: false);
   static const BuildInfo profile = BuildInfo(BuildMode.profile, null, treeShakeIcons: kIconTreeShakerEnabledDefault);
   static const BuildInfo jitRelease = BuildInfo(BuildMode.jitRelease, null, treeShakeIcons: kIconTreeShakerEnabledDefault);
@@ -751,5 +759,6 @@ List<String> decodeDartDefines(Map<String, String> environmentDefines, String ke
 enum NullSafetyMode {
   sound,
   unsound,
+  /// The null safety mode was not detected. Only supported for 'flutter test'.
   autodetect,
 }
diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart
index f4b3074125afc7c1208eb338c6d5bbdd08b2d703..0a238accc4cbdc749334c79faedafb71cd65a476 100644
--- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart
+++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart
@@ -198,10 +198,7 @@ class WebAssetServer implements AssetReader {
     // Allow rendering in a iframe.
     httpServer.defaultResponseHeaders.remove('x-frame-options', 'SAMEORIGIN');
 
-    final PackageConfig packageConfig = await loadPackageConfigWithLogging(
-      globals.fs.file(buildInfo.packagesPath),
-      logger: globals.logger,
-    );
+    final PackageConfig packageConfig = buildInfo.packageConfig;
     final Map<String, String> digests = <String, String>{};
     final Map<String, String> modules = <String, String>{};
     final WebAssetServer server = WebAssetServer(
@@ -631,43 +628,35 @@ class WebAssetServer implements AssetReader {
     return webSdkFile;
   }
 
-  // TODO(yjbanov): https://github.com/flutter/flutter/issues/70121
   static const Map<WebRendererMode, Map<NullSafetyMode, Artifact>> _dartSdkJsArtifactMap =
     <WebRendererMode, Map<NullSafetyMode, Artifact>> {
       WebRendererMode.autoDetect: <NullSafetyMode, Artifact> {
         NullSafetyMode.sound: Artifact.webPrecompiledCanvaskitAndHtmlSoundSdk,
         NullSafetyMode.unsound: Artifact.webPrecompiledCanvaskitAndHtmlSdk,
-        NullSafetyMode.autodetect: Artifact.webPrecompiledCanvaskitAndHtmlSdk,
       },
       WebRendererMode.canvaskit: <NullSafetyMode, Artifact> {
         NullSafetyMode.sound: Artifact.webPrecompiledCanvaskitSoundSdk,
         NullSafetyMode.unsound: Artifact.webPrecompiledCanvaskitSdk,
-        NullSafetyMode.autodetect: Artifact.webPrecompiledCanvaskitSdk,
       },
       WebRendererMode.html: <NullSafetyMode, Artifact> {
         NullSafetyMode.sound: Artifact.webPrecompiledSoundSdk,
         NullSafetyMode.unsound: Artifact.webPrecompiledSdk,
-        NullSafetyMode.autodetect: Artifact.webPrecompiledSdk,
       },
     };
 
-  // TODO(yjbanov): https://github.com/flutter/flutter/issues/70121
   static const Map<WebRendererMode, Map<NullSafetyMode, Artifact>> _dartSdkJsMapArtifactMap =
     <WebRendererMode, Map<NullSafetyMode, Artifact>> {
       WebRendererMode.autoDetect: <NullSafetyMode, Artifact> {
         NullSafetyMode.sound: Artifact.webPrecompiledCanvaskitAndHtmlSoundSdkSourcemaps,
         NullSafetyMode.unsound: Artifact.webPrecompiledCanvaskitAndHtmlSdkSourcemaps,
-        NullSafetyMode.autodetect: Artifact.webPrecompiledCanvaskitAndHtmlSdkSourcemaps,
       },
       WebRendererMode.canvaskit: <NullSafetyMode, Artifact> {
         NullSafetyMode.sound: Artifact.webPrecompiledCanvaskitSoundSdkSourcemaps,
         NullSafetyMode.unsound: Artifact.webPrecompiledCanvaskitSdkSourcemaps,
-        NullSafetyMode.autodetect: Artifact.webPrecompiledCanvaskitSdkSourcemaps,
       },
       WebRendererMode.html: <NullSafetyMode, Artifact> {
         NullSafetyMode.sound: Artifact.webPrecompiledSoundSdkSourcemaps,
         NullSafetyMode.unsound: Artifact.webPrecompiledSdkSourcemaps,
-        NullSafetyMode.autodetect: Artifact.webPrecompiledSdkSourcemaps,
       },
     };
 
diff --git a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart
index 9df21c979edb0632b99fc6e4ba0cc40d0e829a68..54b9dff9bb20141fd5714f6e88446c212c93ea4d 100644
--- a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart
+++ b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart
@@ -508,7 +508,7 @@ class _ResidentWebRunner extends ResidentWebRunner {
           expressionCompiler: expressionCompiler,
           chromiumLauncher: _chromiumLauncher,
           nullAssertions: debuggingOptions.nullAssertions,
-          nullSafetyMode: device.nullSafetyMode,
+          nullSafetyMode: debuggingOptions.buildInfo.nullSafetyMode,
         );
         final Uri url = await device.devFS.create();
         if (debuggingOptions.buildInfo.isDebug) {
@@ -719,7 +719,8 @@ class _ResidentWebRunner extends ResidentWebRunner {
       lastCompiled: device.devFS.lastCompiled,
       urisToMonitor: device.devFS.sources,
       packagesPath: packagesFilePath,
-      packageConfig: device.devFS.lastPackageConfig,
+      packageConfig: device.devFS.lastPackageConfig
+        ?? debuggingOptions.buildInfo.packageConfig,
     );
     final Status devFSStatus = globals.logger.startProgress(
       'Syncing files to device ${device.device.name}...',
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 8897db38fcb9f69515b78a9c93ae6bc86e8fd5de..ad3074a2c3e5b241ad8f051fde8882265146f8b8 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -27,8 +27,6 @@ import 'build_system/targets/localizations.dart';
 import 'bundle.dart';
 import 'cache.dart';
 import 'compile.dart';
-import 'dart/language_version.dart';
-import 'dart/package_map.dart';
 import 'devfs.dart';
 import 'device.dart';
 import 'features.dart';
@@ -48,7 +46,6 @@ class FlutterDevice {
     TargetPlatform targetPlatform,
     ResidentCompiler generator,
     this.userIdentifier,
-    this.nullSafetyMode = NullSafetyMode.autodetect,
   }) : assert(buildInfo.trackWidgetCreation != null),
        generator = generator ?? ResidentCompiler(
          globals.artifacts.getArtifactPath(
@@ -84,7 +81,6 @@ class FlutterDevice {
     String userIdentifier,
   }) async {
     ResidentCompiler generator;
-    NullSafetyMode nullSafetyMode = buildInfo.nullSafetyMode;
     final TargetPlatform targetPlatform = await device.targetPlatform;
     if (device.platformType == PlatformType.fuchsia) {
       targetModel = TargetModel.flutterRunner;
@@ -96,39 +92,21 @@ class FlutterDevice {
     // 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) {
+      // TODO(jonahwilliams): consistently provide these flags across platforms.
       Artifact platformDillArtifact;
-      List<String> extraFrontEndOptions;
+      final List<String> extraFrontEndOptions = List<String>.of(buildInfo.extraFrontEndOptions ?? <String>[]);
       if (buildInfo.nullSafetyMode == NullSafetyMode.unsound) {
         platformDillArtifact = Artifact.webPlatformKernelDill;
-        extraFrontEndOptions = buildInfo.extraFrontEndOptions;
+        if (!extraFrontEndOptions.contains('--no-sound-null-safety')) {
+          extraFrontEndOptions.add('--no-sound-null-safety');
+        }
       } else if (buildInfo.nullSafetyMode == NullSafetyMode.sound) {
         platformDillArtifact = Artifact.webPlatformSoundKernelDill;
-        extraFrontEndOptions =  buildInfo.extraFrontEndOptions;
-      } else {
-        final PackageConfig packageConfig = await loadPackageConfigWithLogging(
-          globals.fs.file(buildInfo.packagesPath),
-          logger: globals.logger,
-        );
-        final File entrypointFile = globals.fs.file(target);
-        final LanguageVersion languageVersion = determineLanguageVersion(
-          entrypointFile,
-          packageConfig.packageOf(entrypointFile.absolute.uri),
-        );
-        if (languageVersion.major >= nullSafeVersion.major && languageVersion.minor >= nullSafeVersion.minor) {
-          platformDillArtifact = Artifact.webPlatformSoundKernelDill;
-          extraFrontEndOptions =  <String>[
-            ...?buildInfo.extraFrontEndOptions,
-            '--sound-null-safety',
-          ];
-          nullSafetyMode = NullSafetyMode.sound;
-        } else {
-          platformDillArtifact = Artifact.webPlatformKernelDill;
-          extraFrontEndOptions =  <String>[
-            ...?buildInfo.extraFrontEndOptions,
-            '--no-sound-null-safety',
-          ];
-          nullSafetyMode = NullSafetyMode.unsound;
+        if (!extraFrontEndOptions.contains('--sound-null-safety')) {
+          extraFrontEndOptions.add('--sound-null-safety');
         }
+      } else {
+        assert(false);
       }
 
       generator = ResidentCompiler(
@@ -202,7 +180,6 @@ class FlutterDevice {
       generator: generator,
       buildInfo: buildInfo,
       userIdentifier: userIdentifier,
-      nullSafetyMode: nullSafetyMode,
     );
   }
 
@@ -210,7 +187,6 @@ class FlutterDevice {
   final ResidentCompiler generator;
   final BuildInfo buildInfo;
   final String userIdentifier;
-  final NullSafetyMode nullSafetyMode;
 
   DevFSWriter devFSWriter;
   Stream<Uri> observatoryUris;
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index d24c6e85c56f948e9d01c8aacd83cd370c7842dd..2ed8b1524e199e6f87a48d5918069a6e3f50934f 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -307,10 +307,6 @@ class HotRunner extends ResidentRunner {
     firstBuildTime = DateTime.now();
 
     final List<Future<bool>> startupTasks = <Future<bool>>[];
-    final PackageConfig packageConfig = await loadPackageConfigWithLogging(
-      globals.fs.file(debuggingOptions.buildInfo.packagesPath),
-      logger: globals.logger,
-    );
     for (final FlutterDevice device in flutterDevices) {
       // Here we initialize the frontend_server concurrently with the platform
       // build, reducing overall initialization time. This is safe because the first
@@ -331,7 +327,7 @@ class HotRunner extends ResidentRunner {
               getDefaultApplicationKernelPath(
                 trackWidgetCreation: debuggingOptions.buildInfo.trackWidgetCreation,
               ),
-            packageConfig: packageConfig,
+            packageConfig: debuggingOptions.buildInfo.packageConfig,
           ).then((CompilerOutput output) => output?.errorCount == 0)
         );
       }
@@ -386,7 +382,8 @@ class HotRunner extends ResidentRunner {
       urisToMonitor: flutterDevices[0].devFS.sources,
       packagesPath: packagesFilePath,
       asyncScanning: hotRunnerConfig.asyncScanning,
-      packageConfig: flutterDevices[0].devFS.lastPackageConfig,
+      packageConfig: flutterDevices[0].devFS.lastPackageConfig
+          ?? debuggingOptions.buildInfo.packageConfig,
     );
     final File entrypointFile = globals.fs.file(mainPath);
     if (!entrypointFile.existsSync()) {
@@ -1211,7 +1208,7 @@ class ProjectFileInvalidator {
       // Initial load.
       assert(urisToMonitor.isEmpty);
       return InvalidationResult(
-        packageConfig: await _createPackageConfig(packagesPath),
+        packageConfig: packageConfig,
         uris: <Uri>[]
       );
     }
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index d761cded01095261bd6fd6f990e467f7435e12e7..36f510cae69ba4622ba5bc50698c4f04fe781797 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -6,6 +6,7 @@ import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:file/file.dart';
 import 'package:meta/meta.dart';
+import 'package:package_config/package_config_types.dart';
 
 import '../application_package.dart';
 import '../base/common.dart';
@@ -21,6 +22,8 @@ import '../build_system/targets/icon_tree_shaker.dart' show kIconTreeShakerEnabl
 import '../bundle.dart' as bundle;
 import '../cache.dart';
 import '../dart/generate_synthetic_packages.dart';
+import '../dart/language_version.dart';
+import '../dart/package_map.dart';
 import '../dart/pub.dart';
 import '../device.dart';
 import '../features.dart';
@@ -758,6 +761,11 @@ abstract class FlutterCommand extends Command<void> {
       ? stringArg('build-number')
       : null;
 
+    final File packagesFile = globals.fs.file(
+      globalResults['packages'] as String ?? globals.fs.path.absolute('.dart_tool', 'package_config.json'));
+    final PackageConfig packageConfig = await loadPackageConfigWithLogging(
+        packagesFile, logger: globals.logger, throwOnError: false);
+
     final List<String> experiments =
       argParser.options.containsKey(FlutterOptions.kEnableExperiment)
         ? stringsArg(FlutterOptions.kEnableExperiment).toList()
@@ -789,12 +797,28 @@ abstract class FlutterCommand extends Command<void> {
       codeSizeDirectory = directory.path;
     }
 
-    NullSafetyMode nullSafetyMode = NullSafetyMode.unsound;
+    NullSafetyMode nullSafetyMode = NullSafetyMode.sound;
     if (argParser.options.containsKey(FlutterOptions.kNullSafety)) {
       // Explicitly check for `true` and `false` so that `null` results in not
-      // passing a flag. This will use the automatically detected null-safety
-      // value based on the entrypoint
-      if (!argResults.wasParsed(FlutterOptions.kNullSafety)) {
+      // passing a flag. Examine the entrypoint file to determine if it
+      // is opted in or out.
+      final bool wasNullSafetyFlagParsed = argResults.wasParsed(FlutterOptions.kNullSafety);
+      if (!wasNullSafetyFlagParsed && argParser.options.containsKey('target')) {
+        final File entrypointFile = globals.fs.file(targetFile);
+        final LanguageVersion languageVersion = determineLanguageVersion(
+          entrypointFile,
+          packageConfig.packageOf(entrypointFile.absolute.uri),
+        );
+        // Extra frontend options are only provided if explicitly
+        // requested.
+        if (languageVersion.major >= nullSafeVersion.major && languageVersion.minor >= nullSafeVersion.minor) {
+          nullSafetyMode = NullSafetyMode.sound;
+        } else {
+          nullSafetyMode = NullSafetyMode.unsound;
+        }
+      } else if (!wasNullSafetyFlagParsed) {
+        // This mode is only used for commands which do not build a single target like
+        // 'flutter test'.
         nullSafetyMode = NullSafetyMode.autodetect;
       } else if (boolArg(FlutterOptions.kNullSafety)) {
         nullSafetyMode = NullSafetyMode.sound;
@@ -886,6 +910,7 @@ abstract class FlutterCommand extends Command<void> {
       nullSafetyMode: nullSafetyMode,
       codeSizeDirectory: codeSizeDirectory,
       androidGradleDaemon: androidGradleDaemon,
+      packageConfig: packageConfig,
     );
   }
 
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index 408ba646ce16c20d56f2fb7a5f0d0a8c27467998..7c6a3be3b3802fe21c356db08357bfa648083907 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -19,7 +19,6 @@ import '../build_info.dart';
 import '../compile.dart';
 import '../convert.dart';
 import '../dart/language_version.dart';
-import '../dart/package_map.dart';
 import '../globals.dart' as globals;
 import '../project.dart';
 import '../test/test_wrapper.dart';
@@ -374,10 +373,7 @@ class FlutterPlatform extends PlatformPlugin {
     StreamChannel<dynamic> controller,
     int ourTestCount,
   ) async {
-    _packageConfig ??= await loadPackageConfigWithLogging(
-      globals.fs.file(buildInfo.packagesPath),
-      logger: globals.logger,
-    );
+    _packageConfig ??= buildInfo.packageConfig;
     globals.printTrace('test $ourTestCount: starting test $testPath');
 
     _AsyncError outOfBandError; // error that we couldn't send to the harness that we need to send via our future
diff --git a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
index 4a6f60dcbf22ef857a10fa123e35b828dedfe0aa..642cc9356277946c90baffadf5b9a9184536e0af 100644
--- a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
@@ -42,6 +42,7 @@ class FlutterWebPlatform extends PlatformPlugin {
     FlutterProject flutterProject,
     String shellPath,
     this.updateGoldens,
+    @required BuildInfo buildInfo,
   }) {
     final shelf.Cascade cascade = shelf.Cascade()
         .add(_webSocketHandler.handler)
@@ -67,7 +68,7 @@ class FlutterWebPlatform extends PlatformPlugin {
 
     _testGoldenComparator = TestGoldenComparator(
       shellPath,
-      () => TestCompiler(BuildInfo.debug, flutterProject),
+      () => TestCompiler(buildInfo, flutterProject),
     );
   }
 
@@ -76,6 +77,7 @@ class FlutterWebPlatform extends PlatformPlugin {
     String shellPath,
     bool updateGoldens = false,
     bool pauseAfterLoad = false,
+    @required BuildInfo buildInfo,
   }) async {
     final shelf_io.IOServer server =
         shelf_io.IOServer(await HttpMultiServer.loopback(0));
@@ -86,6 +88,7 @@ class FlutterWebPlatform extends PlatformPlugin {
       flutterProject: flutterProject,
       shellPath: shellPath,
       updateGoldens: updateGoldens,
+      buildInfo: buildInfo,
     );
   }
 
diff --git a/packages/flutter_tools/lib/src/test/runner.dart b/packages/flutter_tools/lib/src/test/runner.dart
index dfc23252f43cd8636be74ec630d31785afec3e8b..05ac3765d0f9f0a2e1d47f2bb8bab62ab483460b 100644
--- a/packages/flutter_tools/lib/src/test/runner.dart
+++ b/packages/flutter_tools/lib/src/test/runner.dart
@@ -148,6 +148,7 @@ class _FlutterTestRunnerImpl implements FlutterTestRunner {
             shellPath: shellPath,
             flutterProject: flutterProject,
             pauseAfterLoad: startPaused,
+            buildInfo: buildInfo,
           );
         },
       );
diff --git a/packages/flutter_tools/lib/src/test/test_compiler.dart b/packages/flutter_tools/lib/src/test/test_compiler.dart
index fbb79ad9b5240193ecc75f336835e063b30d4a12..a9d39f66d25f188e41be4f31e655ce62dbd31cea 100644
--- a/packages/flutter_tools/lib/src/test/test_compiler.dart
+++ b/packages/flutter_tools/lib/src/test/test_compiler.dart
@@ -12,7 +12,6 @@ import '../base/file_system.dart';
 import '../build_info.dart';
 import '../bundle.dart';
 import '../compile.dart';
-import '../dart/package_map.dart';
 import '../globals.dart' as globals;
 import '../project.dart';
 
@@ -128,10 +127,7 @@ class TestCompiler {
       return;
     }
     if (_packageConfig == null) {
-      _packageConfig ??= await loadPackageConfigWithLogging(
-        globals.fs.file(buildInfo.packagesPath),
-        logger: globals.logger,
-      );
+      _packageConfig ??= buildInfo.packageConfig;
       // Compilation will fail if there is no flutter_test dependency, since
       // this library is imported by the generated entrypoint script.
       if (_packageConfig['test_api'] == null) {
diff --git a/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart b/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart
index 20fa4d5243266f03dc0ce8d414e135150e650095..cac35d40af69e10d26d81e929cdca8179e7ff61c 100644
--- a/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart
+++ b/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart
@@ -143,7 +143,8 @@ void main() {
         packageConfig: packageConfig,
       );
 
-      expect(invalidationResult.packageConfig, isNot(packageConfig));
+      // Initial package config is re-used.
+      expect(invalidationResult.packageConfig, packageConfig);
 
       fileSystem.file('.packages')
         .writeAsStringSync('foo:lib/\n');
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 eb5ffbee58acbfd7fcde755cb72f66bb385fea36..2b824dfdf09488d53e7fd024a86da38d01b1733a 100644
--- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -2501,7 +2501,7 @@ void main() {
     )).generator as DefaultResidentCompiler;
 
     expect(residentCompiler.initializeFromDill,
-      globals.fs.path.join(getBuildDirectory(), 'cache.dill'));
+      globals.fs.path.join(getBuildDirectory(), 'fbbe6a61fb7a1de317d381f8df4814e5.cache.dill'));
     expect(residentCompiler.librariesSpec,
       globals.fs.file(globals.artifacts.getArtifactPath(Artifact.flutterWebLibrariesJson))
         .uri.toString());
diff --git a/packages/flutter_tools/test/general.shard/test_compiler_test.dart b/packages/flutter_tools/test/general.shard/test_compiler_test.dart
index 1c6bc87062901d5c360de2d090c40d3854b20362..ed38d3f295a453dc7a8941d03ae6b6f4f870e0ec 100644
--- a/packages/flutter_tools/test/general.shard/test_compiler_test.dart
+++ b/packages/flutter_tools/test/general.shard/test_compiler_test.dart
@@ -12,6 +12,7 @@ import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/test/test_compiler.dart';
 import 'package:mockito/mockito.dart';
+import 'package:package_config/package_config_types.dart';
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -22,6 +23,15 @@ final Platform linuxPlatform = FakePlatform(
   environment: <String, String>{},
 );
 
+final BuildInfo debugBuild = BuildInfo(
+  BuildMode.debug,
+  '',
+  treeShakeIcons: false,
+  packageConfig: PackageConfig(<Package>[
+    Package('test_api', Uri.parse('file:///test_api/')),
+  ])
+);
+
 void main() {
   MockResidentCompiler residentCompiler;
   FileSystem fileSystem;
@@ -29,17 +39,13 @@ void main() {
   setUp(() {
     fileSystem = MemoryFileSystem.test();
     fileSystem.file('pubspec.yaml').createSync();
-    fileSystem.file('.packages').writeAsStringSync('flutter_test:flutter_test/');
     fileSystem.file('test/foo.dart').createSync(recursive: true);
-    fileSystem.file('.packages')
-      ..createSync()
-      ..writeAsStringSync('test_api:test_api/\n');
     residentCompiler = MockResidentCompiler();
   });
 
   testUsingContext('TestCompiler reports a dill file when compile is successful', () async {
     final FakeTestCompiler testCompiler = FakeTestCompiler(
-      BuildInfo.debug,
+      debugBuild,
       FlutterProject.current(),
       residentCompiler,
     );
@@ -64,7 +70,7 @@ void main() {
 
   testUsingContext('TestCompiler reports null when a compile fails', () async {
     final FakeTestCompiler testCompiler = FakeTestCompiler(
-      BuildInfo.debug,
+      debugBuild,
       FlutterProject.current(),
       residentCompiler,
     );
@@ -90,7 +96,7 @@ void main() {
 
   testUsingContext('TestCompiler disposing test compiler shuts down backing compiler', () async {
     final FakeTestCompiler testCompiler = FakeTestCompiler(
-      BuildInfo.debug,
+      debugBuild,
       FlutterProject.current(),
       residentCompiler,
     );
@@ -115,7 +121,6 @@ void main() {
       FlutterProject.current(),
       residentCompiler,
     );
-    fileSystem.file('.packages').writeAsStringSync('\n');
 
     expect(await testCompiler.compile(Uri.parse('test/foo.dart')), null);
     expect(testLogger.errorText, contains('Error: cannot run without a dependency on '
diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart
index bf3aa54401d521eff18d6c24fc03d20e8e5bc7ee..e1e82a732292bac77fbc54813f553a021920d43c 100644
--- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart
@@ -591,14 +591,12 @@ void main() {
   }));
 
   test('Can start web server with specified assets', () => testbed.run(() async {
-    globals.fs.file('.packages').writeAsStringSync('\n');
     final File outputFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
       ..createSync(recursive: true);
     outputFile.parent.childFile('a.sources').writeAsStringSync('');
     outputFile.parent.childFile('a.json').writeAsStringSync('{}');
     outputFile.parent.childFile('a.map').writeAsStringSync('{}');
     outputFile.parent.childFile('a.metadata').writeAsStringSync('{}');
-    outputFile.parent.childFile('.packages').writeAsStringSync('\n');
 
     final ResidentCompiler residentCompiler = MockResidentCompiler();
     when(residentCompiler.recompile(
@@ -708,14 +706,12 @@ void main() {
   }));
 
   test('Can start web server with specified assets in sound null safety mode', () => testbed.run(() async {
-    globals.fs.file('.packages').writeAsStringSync('\n');
     final File outputFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
       ..createSync(recursive: true);
     outputFile.parent.childFile('a.sources').writeAsStringSync('');
     outputFile.parent.childFile('a.json').writeAsStringSync('{}');
     outputFile.parent.childFile('a.map').writeAsStringSync('{}');
     outputFile.parent.childFile('a.metadata').writeAsStringSync('{}');
-    outputFile.parent.childFile('.packages').writeAsStringSync('\n');
 
     final ResidentCompiler residentCompiler = MockResidentCompiler();
     when(residentCompiler.recompile(
@@ -739,14 +735,14 @@ void main() {
         BuildMode.debug,
         '',
         treeShakeIcons: false,
-        nullSafetyMode: NullSafetyMode.autodetect,
+        nullSafetyMode: NullSafetyMode.sound,
       ),
       enableDwds: false,
       entrypoint: Uri.base,
       testMode: true,
       expressionCompiler: null,
       chromiumLauncher: null,
-      nullSafetyMode: NullSafetyMode.autodetect,
+      nullSafetyMode: NullSafetyMode.sound,
     );
     webDevFS.requireJS.createSync(recursive: true);
     webDevFS.stackTraceMapper.createSync(recursive: true);
@@ -759,13 +755,13 @@ void main() {
       ..createSync(recursive: true)
       ..writeAsStringSync('GENERATED');
     final String webPrecompiledSdk = globals.artifacts
-      .getArtifactPath(Artifact.webPrecompiledSdk);
+      .getArtifactPath(Artifact.webPrecompiledSoundSdk);
     final String webPrecompiledSdkSourcemaps = globals.artifacts
-      .getArtifactPath(Artifact.webPrecompiledSdkSourcemaps);
+      .getArtifactPath(Artifact.webPrecompiledSoundSdkSourcemaps);
     final String webPrecompiledCanvaskitSdk = globals.artifacts
-      .getArtifactPath(Artifact.webPrecompiledCanvaskitSdk);
+      .getArtifactPath(Artifact.webPrecompiledCanvaskitSoundSdk);
     final String webPrecompiledCanvaskitSdkSourcemaps = globals.artifacts
-      .getArtifactPath(Artifact.webPrecompiledCanvaskitSdkSourcemaps);
+      .getArtifactPath(Artifact.webPrecompiledCanvaskitSoundSdkSourcemaps);
     globals.fs.file(webPrecompiledSdk)
       ..createSync(recursive: true)
       ..writeAsStringSync('HELLO');
@@ -823,13 +819,11 @@ void main() {
   }));
 
   test('Can start web server with hostname any', () => testbed.run(() async {
-    globals.fs.file('.packages').writeAsStringSync('\n');
     final File outputFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
       ..createSync(recursive: true);
     outputFile.parent.childFile('a.sources').writeAsStringSync('');
     outputFile.parent.childFile('a.json').writeAsStringSync('{}');
     outputFile.parent.childFile('a.map').writeAsStringSync('{}');
-    outputFile.parent.childFile('.packages').writeAsStringSync('\n');
 
     final ResidentCompiler residentCompiler = MockResidentCompiler();
     when(residentCompiler.recompile(
@@ -867,13 +861,11 @@ void main() {
   }));
 
   test('Can start web server with canvaskit enabled', () => testbed.run(() async {
-    globals.fs.file('.packages').writeAsStringSync('\n');
     final File outputFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
       ..createSync(recursive: true);
     outputFile.parent.childFile('a.sources').writeAsStringSync('');
     outputFile.parent.childFile('a.json').writeAsStringSync('{}');
     outputFile.parent.childFile('a.map').writeAsStringSync('{}');
-    outputFile.parent.childFile('.packages').writeAsStringSync('\n');
 
     final ResidentCompiler residentCompiler = MockResidentCompiler();
     when(residentCompiler.recompile(
@@ -919,13 +911,11 @@ void main() {
   }));
 
   test('Can start web server with auto detect enabled', () => testbed.run(() async {
-    globals.fs.file('.packages').writeAsStringSync('\n');
     final File outputFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
       ..createSync(recursive: true);
     outputFile.parent.childFile('a.sources').writeAsStringSync('');
     outputFile.parent.childFile('a.json').writeAsStringSync('{}');
     outputFile.parent.childFile('a.map').writeAsStringSync('{}');
-    outputFile.parent.childFile('.packages').writeAsStringSync('\n');
 
     final ResidentCompiler residentCompiler = MockResidentCompiler();
     when(residentCompiler.recompile(