[flutter_tools] Ensure that global variables are easily identifiable (#47398)

diff --git a/packages/flutter_tools/BUILD.gn b/packages/flutter_tools/BUILD.gn
index 51b1a4f..cdfafe1 100644
--- a/packages/flutter_tools/BUILD.gn
+++ b/packages/flutter_tools/BUILD.gn
@@ -95,9 +95,7 @@
     "src/base/logger.dart",
     "src/base/net.dart",
     "src/base/os.dart",
-    "src/base/platform.dart",
     "src/base/process.dart",
-    "src/base/process_manager.dart",
     "src/base/terminal.dart",
     "src/base/utils.dart",
     "src/base/version.dart",
@@ -183,9 +181,7 @@
     "src/base/logger.dart",
     "src/base/net.dart",
     "src/base/os.dart",
-    "src/base/platform.dart",
     "src/base/process.dart",
-    "src/base/process_manager.dart",
     "src/base/terminal.dart",
     "src/base/utils.dart",
     "src/base/version.dart",
diff --git a/packages/flutter_tools/bin/fuchsia_asset_builder.dart b/packages/flutter_tools/bin/fuchsia_asset_builder.dart
index 5e75e0c..5e980aa 100644
--- a/packages/flutter_tools/bin/fuchsia_asset_builder.dart
+++ b/packages/flutter_tools/bin/fuchsia_asset_builder.dart
@@ -9,12 +9,11 @@
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart' as libfs;
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/context_runner.dart';
 import 'package:flutter_tools/src/devfs.dart';
 import 'package:flutter_tools/src/bundle.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/reporting/reporting.dart';
 
 const String _kOptionPackages = 'packages';
@@ -52,10 +51,10 @@
   final ArgResults argResults = parser.parse(args);
   if (_kRequiredOptions
       .any((String option) => !argResults.options.contains(option))) {
-    printError('Missing option! All options must be specified.');
+    globals.printError('Missing option! All options must be specified.');
     exit(1);
   }
-  Cache.flutterRoot = platform.environment['FLUTTER_ROOT'];
+  Cache.flutterRoot = globals.platform.environment['FLUTTER_ROOT'];
 
   final String assetDir = argResults[_kOptionAsset] as String;
   final AssetBundle assets = await buildAssets(
@@ -72,7 +71,7 @@
 
   final List<Future<void>> calls = <Future<void>>[];
   assets.entries.forEach((String fileName, DevFSContent content) {
-    final libfs.File outputFile = libfs.fs.file(libfs.fs.path.join(assetDir, fileName));
+    final libfs.File outputFile = globals.fs.file(globals.fs.path.join(assetDir, fileName));
     calls.add(writeFile(outputFile, content));
   });
   await Future.wait<void>(calls);
@@ -83,7 +82,7 @@
 
 Future<void> writeFuchsiaManifest(AssetBundle assets, String outputBase, String fileDest, String componentName) async {
 
-  final libfs.File destFile = libfs.fs.file(fileDest);
+  final libfs.File destFile = globals.fs.file(fileDest);
   await destFile.create(recursive: true);
   final libfs.IOSink outFile = destFile.openWrite();
 
diff --git a/packages/flutter_tools/bin/fuchsia_attach.dart b/packages/flutter_tools/bin/fuchsia_attach.dart
index ae2452a..5c94ef3 100644
--- a/packages/flutter_tools/bin/fuchsia_attach.dart
+++ b/packages/flutter_tools/bin/fuchsia_attach.dart
@@ -17,6 +17,7 @@
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/fuchsia/fuchsia_device.dart';
 import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/runner/flutter_command.dart';
 
@@ -40,20 +41,20 @@
   final List<String> targetParts = _extractPathAndName(target);
   final String path = targetParts[0];
   final String name = targetParts[1];
-  final File dartSdk = fs.file(argResults['dart-sdk']);
+  final File dartSdk = globals.fs.file(argResults['dart-sdk']);
   final String buildDirectory = argResults['build-dir'] as String;
-  final File frontendServer = fs.file('$buildDirectory/host_x64/gen/third_party/flutter/frontend_server/frontend_server_tool.snapshot');
-  final File sshConfig = fs.file('$buildDirectory/ssh-keys/ssh_config');
-  final File devFinder = fs.file(argResults['dev-finder']);
-  final File platformKernelDill = fs.file('$buildDirectory/flutter_runner_patched_sdk/platform_strong.dill');
-  final File flutterPatchedSdk = fs.file('$buildDirectory/flutter_runner_patched_sdk');
+  final File frontendServer = globals.fs.file('$buildDirectory/host_x64/gen/third_party/flutter/frontend_server/frontend_server_tool.snapshot');
+  final File sshConfig = globals.fs.file('$buildDirectory/ssh-keys/ssh_config');
+  final File devFinder = globals.fs.file(argResults['dev-finder']);
+  final File platformKernelDill = globals.fs.file('$buildDirectory/flutter_runner_patched_sdk/platform_strong.dill');
+  final File flutterPatchedSdk = globals.fs.file('$buildDirectory/flutter_runner_patched_sdk');
   final String packages = '$buildDirectory/dartlang/gen/$path/${name}_dart_library.packages';
   final String outputDill = '$buildDirectory/${name}_tmp.dill';
 
   // TODO(jonahwilliams): running from fuchsia root hangs hot reload for some reason.
   // switch to the project root directory and run from there.
-  originalWorkingDirectory = fs.currentDirectory.path;
-  fs.currentDirectory = path;
+  originalWorkingDirectory = globals.fs.currentDirectory.path;
+  globals.fs.currentDirectory = path;
 
   if (!devFinder.existsSync()) {
     print('Error: dev_finder not found at ${devFinder.path}.');
@@ -71,7 +72,7 @@
   // Check for a package with a lib directory.
   final String entrypoint = argResults['entrypoint'] as String;
   String targetFile = 'lib/$entrypoint';
-  if (!fs.file(targetFile).existsSync()) {
+  if (!globals.fs.file(targetFile).existsSync()) {
     // Otherwise assume the package is flat.
     targetFile = entrypoint;
   }
diff --git a/packages/flutter_tools/bin/fuchsia_tester.dart b/packages/flutter_tools/bin/fuchsia_tester.dart
index 04bf548..b23d980 100644
--- a/packages/flutter_tools/bin/fuchsia_tester.dart
+++ b/packages/flutter_tools/bin/fuchsia_tester.dart
@@ -11,13 +11,13 @@
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/context_runner.dart';
 import 'package:flutter_tools/src/dart/package_map.dart';
 import 'package:flutter_tools/src/artifacts.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/test/coverage_collector.dart';
@@ -73,46 +73,46 @@
     throwToolExit('Missing option! All options must be specified.');
   }
   final Directory tempDir =
-      fs.systemTempDirectory.createTempSync('flutter_fuchsia_tester.');
+      globals.fs.systemTempDirectory.createTempSync('flutter_fuchsia_tester.');
   try {
     Cache.flutterRoot = tempDir.path;
 
-    final String shellPath = fs.file(argResults[_kOptionShell]).resolveSymbolicLinksSync();
-    if (!fs.isFileSync(shellPath)) {
+    final String shellPath = globals.fs.file(argResults[_kOptionShell]).resolveSymbolicLinksSync();
+    if (!globals.fs.isFileSync(shellPath)) {
       throwToolExit('Cannot find Flutter shell at $shellPath');
     }
 
-    final Directory sdkRootSrc = fs.directory(argResults[_kOptionSdkRoot]);
-    if (!fs.isDirectorySync(sdkRootSrc.path)) {
+    final Directory sdkRootSrc = globals.fs.directory(argResults[_kOptionSdkRoot]);
+    if (!globals.fs.isDirectorySync(sdkRootSrc.path)) {
       throwToolExit('Cannot find SDK files at ${sdkRootSrc.path}');
     }
     Directory coverageDirectory;
     final String coverageDirectoryPath = argResults[_kOptionCoverageDirectory] as String;
     if (coverageDirectoryPath != null) {
-      if (!fs.isDirectorySync(coverageDirectoryPath)) {
+      if (!globals.fs.isDirectorySync(coverageDirectoryPath)) {
         throwToolExit('Cannot find coverage directory at $coverageDirectoryPath');
       }
-      coverageDirectory = fs.directory(coverageDirectoryPath);
+      coverageDirectory = globals.fs.directory(coverageDirectoryPath);
     }
 
     // Put the tester shell where runTests expects it.
     // TODO(garymm): Switch to a Fuchsia-specific Artifacts impl.
     final Link testerDestLink =
-        fs.link(artifacts.getArtifactPath(Artifact.flutterTester));
+        globals.fs.link(globals.artifacts.getArtifactPath(Artifact.flutterTester));
     testerDestLink.parent.createSync(recursive: true);
-    testerDestLink.createSync(fs.path.absolute(shellPath));
+    testerDestLink.createSync(globals.fs.path.absolute(shellPath));
 
     final Directory sdkRootDest =
-        fs.directory(artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath));
+        globals.fs.directory(globals.artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath));
     sdkRootDest.createSync(recursive: true);
     for (FileSystemEntity artifact in sdkRootSrc.listSync()) {
-      fs.link(sdkRootDest.childFile(artifact.basename).path).createSync(artifact.path);
+      globals.fs.link(sdkRootDest.childFile(artifact.basename).path).createSync(artifact.path);
     }
     // TODO(tvolkert): Remove once flutter_tester no longer looks for this.
-    fs.link(sdkRootDest.childFile('platform.dill').path).createSync('platform_strong.dill');
+    globals.fs.link(sdkRootDest.childFile('platform.dill').path).createSync('platform_strong.dill');
 
     PackageMap.globalPackagesPath =
-        fs.path.normalize(fs.path.absolute(argResults[_kOptionPackages] as String));
+        globals.fs.path.normalize(globals.fs.path.absolute(argResults[_kOptionPackages] as String));
 
     Directory testDirectory;
     CoverageCollector collector;
@@ -129,16 +129,16 @@
       if (!argResults.options.contains(_kOptionTestDirectory)) {
         throwToolExit('Use of --coverage requires setting --test-directory');
       }
-      testDirectory = fs.directory(argResults[_kOptionTestDirectory]);
+      testDirectory = globals.fs.directory(argResults[_kOptionTestDirectory]);
     }
 
 
     final Map<String, String> tests = <String, String>{};
     final List<Map<String, dynamic>> jsonList = List<Map<String, dynamic>>.from(
-      (json.decode(fs.file(argResults[_kOptionTests]).readAsStringSync()) as List<dynamic>).cast<Map<String, dynamic>>());
+      (json.decode(globals.fs.file(argResults[_kOptionTests]).readAsStringSync()) as List<dynamic>).cast<Map<String, dynamic>>());
     for (Map<String, dynamic> map in jsonList) {
-      final String source = fs.file(map['source']).resolveSymbolicLinksSync();
-      final String dill = fs.file(map['dill']).resolveSymbolicLinksSync();
+      final String source = globals.fs.file(map['source']).resolveSymbolicLinksSync();
+      final String dill = globals.fs.file(map['dill']).resolveSymbolicLinksSync();
       tests[source] = dill;
     }
 
@@ -151,8 +151,8 @@
       enableObservatory: collector != null,
       buildMode: BuildMode.debug,
       precompiledDillFiles: tests,
-      concurrency: math.max(1, platform.numberOfProcessors - 2),
-      icudtlPath: fs.path.absolute(argResults[_kOptionIcudtl] as String),
+      concurrency: math.max(1, globals.platform.numberOfProcessors - 2),
+      icudtlPath: globals.fs.path.absolute(argResults[_kOptionIcudtl] as String),
       coverageDirectory: coverageDirectory,
     );
 
@@ -161,9 +161,9 @@
       // package (i.e. contains lib/ and test/ sub-dirs). In some cases,
       // test files may appear to be in the root directory.
       if (coverageDirectory == null) {
-        fs.currentDirectory = testDirectory.parent;
+        globals.fs.currentDirectory = testDirectory.parent;
       } else {
-        fs.currentDirectory = testDirectory;
+        globals.fs.currentDirectory = testDirectory;
       }
       if (!await collector.collectCoverageData(argResults[_kOptionCoveragePath] as String, coverageDirectory: coverageDirectory)) {
         throwToolExit('Failed to collect coverage data');
diff --git a/packages/flutter_tools/lib/src/android/android_builder.dart b/packages/flutter_tools/lib/src/android/android_builder.dart
index ec21efa..17b5d5d 100644
--- a/packages/flutter_tools/lib/src/android/android_builder.dart
+++ b/packages/flutter_tools/lib/src/android/android_builder.dart
@@ -10,6 +10,7 @@
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../build_info.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import 'android_sdk.dart';
 import 'gradle.dart';
@@ -62,7 +63,7 @@
   }) async {
     try {
       Directory outputDirectory =
-        fs.directory(outputDirectoryPath ?? project.android.buildDirectory);
+        globals.fs.directory(outputDirectoryPath ?? project.android.buildDirectory);
       if (project.isModule) {
         // Module projects artifacts are located in `build/host`.
         outputDirectory = outputDirectory.childDirectory('host');
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index 5a523f6..3b8d6b5 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -14,13 +14,11 @@
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/logger.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../build_info.dart';
 import '../convert.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../protocol_discovery.dart';
 
@@ -49,7 +47,7 @@
   // In platform tools 29.0.0 adb.exe seems to be ending with this heap
   // corruption error code on seemingly successful termination.
   // So we ignore this error on Windows.
-  return exitCode == -1073740940 && platform.isWindows;
+  return exitCode == -1073740940 && globals.platform.isWindows;
 }
 
 class AndroidDevices extends PollingDeviceDiscovery {
@@ -94,12 +92,12 @@
       _properties = <String, String>{};
 
       final List<String> propCommand = adbCommandForDevice(<String>['shell', 'getprop']);
-      printTrace(propCommand.join(' '));
+      globals.printTrace(propCommand.join(' '));
 
       try {
         // We pass an encoding of latin1 so that we don't try and interpret the
         // `adb shell getprop` result as UTF8.
-        final ProcessResult result = await processManager.run(
+        final ProcessResult result = await globals.processManager.run(
           propCommand,
           stdoutEncoding: latin1,
           stderrEncoding: latin1,
@@ -107,11 +105,11 @@
         if (result.exitCode == 0 || allowHeapCorruptionOnWindows(result.exitCode)) {
           _properties = parseAdbDeviceProperties(result.stdout as String);
         } else {
-          printError('Error ${result.exitCode} retrieving device properties for $name:');
-          printError(result.stderr as String);
+          globals.printError('Error ${result.exitCode} retrieving device properties for $name:');
+          globals.printError(result.stderr as String);
         }
       } on ProcessException catch (error) {
-        printError('Error retrieving device properties for $name: $error');
+        globals.printError('Error retrieving device properties for $name: $error');
       }
     }
 
@@ -122,14 +120,14 @@
   Future<bool> get isLocalEmulator async {
     if (_isLocalEmulator == null) {
       final String hardware = await _getProperty('ro.hardware');
-      printTrace('ro.hardware = $hardware');
+      globals.printTrace('ro.hardware = $hardware');
       if (_kKnownHardware.containsKey(hardware)) {
         // Look for known hardware models.
         _isLocalEmulator = _kKnownHardware[hardware] == _HardwareType.emulator;
       } else {
         // Fall back to a best-effort heuristic-based approach.
         final String characteristics = await _getProperty('ro.build.characteristics');
-        printTrace('ro.build.characteristics = $characteristics');
+        globals.printTrace('ro.build.characteristics = $characteristics');
         _isLocalEmulator = characteristics != null && characteristics.contains('emulator');
       }
     }
@@ -159,7 +157,7 @@
 
     const String host = 'localhost';
     final int port = int.parse(portMatch.group(1));
-    printTrace('Fetching avd name for $name via Android console on $host:$port');
+    globals.printTrace('Fetching avd name for $name via Android console on $host:$port');
 
     try {
       final Socket socket = await androidConsoleSocketFactory(host, port);
@@ -179,7 +177,7 @@
         console.destroy();
       }
     } catch (e) {
-      printTrace('Failed to fetch avd name for emulator at $host:$port: $e');
+      globals.printTrace('Failed to fetch avd name for emulator at $host:$port: $e');
       // If we fail to connect to the device, we should not fail so just return
       // an empty name. This data is best-effort.
       return null;
@@ -281,7 +279,7 @@
       }
       return false;
     }
-    printError(
+    globals.printError(
         'Unrecognized adb version string $adbVersion. Skipping version check.');
     return true;
   }
@@ -299,9 +297,9 @@
       if (_isValidAdbVersion(adbVersion.stdout)) {
         return true;
       }
-      printError('The ADB at "${getAdbPath(androidSdk)}" is too old; please install version 1.0.39 or later.');
+      globals.printError('The ADB at "${getAdbPath(androidSdk)}" is too old; please install version 1.0.39 or later.');
     } catch (error, trace) {
-      printError('Error running ADB: $error', stackTrace: trace);
+      globals.printError('Error running ADB: $error', stackTrace: trace);
     }
 
     return false;
@@ -324,12 +322,12 @@
 
       final int sdkVersionParsed = int.tryParse(sdkVersion);
       if (sdkVersionParsed == null) {
-        printError('Unexpected response from getprop: "$sdkVersion"');
+        globals.printError('Unexpected response from getprop: "$sdkVersion"');
         return false;
       }
 
       if (sdkVersionParsed < minApiLevel) {
-        printError(
+        globals.printError(
           'The Android version ($sdkVersion) on the target device is too old. Please '
           'use a $minVersionName (version $minApiLevel / $minVersionText) device or later.');
         return false;
@@ -337,8 +335,8 @@
 
       return true;
     } catch (e, stacktrace) {
-      printError('Unexpected failure from adb: $e');
-      printError('Stacktrace: $stacktrace');
+      globals.printError('Unexpected failure from adb: $e');
+      globals.printError('Stacktrace: $stacktrace');
       return false;
     }
   }
@@ -354,7 +352,7 @@
   }
 
   String _getSourceSha1(AndroidApk apk) {
-    final File shaFile = fs.file('${apk.file.path}.sha1');
+    final File shaFile = globals.fs.file('${apk.file.path}.sha1');
     return shaFile.existsSync() ? shaFile.readAsStringSync() : '';
   }
 
@@ -368,7 +366,7 @@
       final RunResult listOut = await runAdbCheckedAsync(<String>['shell', 'pm', 'list', 'packages', app.id]);
       return LineSplitter.split(listOut.stdout).contains('package:${app.id}');
     } catch (error) {
-      printTrace('$error');
+      globals.printTrace('$error');
       return false;
     }
   }
@@ -382,7 +380,7 @@
   @override
   Future<bool> installApp(AndroidApk app) async {
     if (!app.file.existsSync()) {
-      printError('"${fs.path.relative(app.file.path)}" does not exist.');
+      globals.printError('"${globals.fs.path.relative(app.file.path)}" does not exist.');
       return false;
     }
 
@@ -391,7 +389,7 @@
       return false;
     }
 
-    final Status status = logger.startProgress('Installing ${fs.path.relative(app.file.path)}...', timeout: timeoutConfiguration.slowOperation);
+    final Status status = globals.logger.startProgress('Installing ${globals.fs.path.relative(app.file.path)}...', timeout: timeoutConfiguration.slowOperation);
     final RunResult installResult = await processUtils.run(
       adbCommandForDevice(<String>['install', '-t', '-r', app.file.path]));
     status.stop();
@@ -400,12 +398,12 @@
     final RegExp failureExp = RegExp(r'^Failure.*$', multiLine: true);
     final String failure = failureExp.stringMatch(installResult.stdout);
     if (failure != null) {
-      printError('Package install error: $failure');
+      globals.printError('Package install error: $failure');
       return false;
     }
     if (installResult.exitCode != 0) {
-      printError('Error: ADB exited with exit code ${installResult.exitCode}');
-      printError('$installResult');
+      globals.printError('Error: ADB exited with exit code ${installResult.exitCode}');
+      globals.printError('$installResult');
       return false;
     }
     try {
@@ -413,7 +411,7 @@
         'shell', 'echo', '-n', _getSourceSha1(app), '>', _getDeviceSha1Path(app),
       ]);
     } on ProcessException catch (error) {
-      printError('adb shell failed to write the SHA hash: $error.');
+      globals.printError('adb shell failed to write the SHA hash: $error.');
       return false;
     }
     return true;
@@ -434,13 +432,13 @@
       );
       uninstallOut = uninstallResult.stdout;
     } catch (error) {
-      printError('adb uninstall failed: $error');
+      globals.printError('adb uninstall failed: $error');
       return false;
     }
     final RegExp failureExp = RegExp(r'^Failure.*$', multiLine: true);
     final String failure = failureExp.stringMatch(uninstallOut);
     if (failure != null) {
-      printError('Package uninstall error: $failure');
+      globals.printError('Package uninstall error: $failure');
       return false;
     }
 
@@ -451,21 +449,21 @@
     final bool wasInstalled = await isAppInstalled(package);
     if (wasInstalled) {
       if (await isLatestBuildInstalled(package)) {
-        printTrace('Latest build already installed.');
+        globals.printTrace('Latest build already installed.');
         return true;
       }
     }
-    printTrace('Installing APK.');
+    globals.printTrace('Installing APK.');
     if (!await installApp(package)) {
-      printTrace('Warning: Failed to install APK.');
+      globals.printTrace('Warning: Failed to install APK.');
       if (wasInstalled) {
-        printStatus('Uninstalling old version...');
+        globals.printStatus('Uninstalling old version...');
         if (!await uninstallApp(package)) {
-          printError('Error: Uninstalling old version failed.');
+          globals.printError('Error: Uninstalling old version failed.');
           return false;
         }
         if (!await installApp(package)) {
-          printError('Error: Failed to install APK again.');
+          globals.printError('Error: Failed to install APK again.');
           return false;
         }
         return true;
@@ -495,7 +493,7 @@
     final TargetPlatform devicePlatform = await targetPlatform;
     if (devicePlatform == TargetPlatform.android_x86 &&
        !debuggingOptions.buildInfo.isDebug) {
-      printError('Profile and release builds are only supported on ARM/x64 targets.');
+      globals.printError('Profile and release builds are only supported on ARM/x64 targets.');
       return LaunchResult.failed();
     }
 
@@ -514,12 +512,12 @@
         androidArch = AndroidArch.x86;
         break;
       default:
-        printError('Android platforms are only supported.');
+        globals.printError('Android platforms are only supported.');
         return LaunchResult.failed();
     }
 
     if (!prebuiltApplication || androidSdk.licensesAvailable && androidSdk.latestVersion == null) {
-      printTrace('Building APK');
+      globals.printTrace('Building APK');
       final FlutterProject project = FlutterProject.current();
       await androidBuilder.buildApk(
           project: project,
@@ -539,7 +537,7 @@
       throwToolExit('Problem building Android application: see above error(s).');
     }
 
-    printTrace("Stopping app '${package.name}' on $name.");
+    globals.printTrace("Stopping app '${package.name}' on $name.");
     await stopApp(package);
 
     if (!await _installLatestApp(package)) {
@@ -547,7 +545,7 @@
     }
 
     final bool traceStartup = platformArgs['trace-startup'] as bool ?? false;
-    printTrace('$this startApp');
+    globals.printTrace('$this startApp');
 
     ProtocolDiscovery observatoryDiscovery;
 
@@ -608,7 +606,7 @@
     final String result = (await runAdbCheckedAsync(cmd)).stdout;
     // This invocation returns 0 even when it fails.
     if (result.contains('Error: ')) {
-      printError(result.trim(), wrap: false);
+      globals.printError(result.trim(), wrap: false);
       return LaunchResult.failed();
     }
 
@@ -619,7 +617,7 @@
 
     // Wait for the service protocol port here. This will complete once the
     // device has printed "Observatory is listening on...".
-    printTrace('Waiting for observatory port to be available...');
+    globals.printTrace('Waiting for observatory port to be available...');
 
     // TODO(danrubel): Waiting for observatory services can be made common across all devices.
     try {
@@ -631,7 +629,7 @@
 
       return LaunchResult.succeeded(observatoryUri: observatoryUri);
     } catch (error) {
-      printError('Error waiting for a debug connection: $error');
+      globals.printError('Error waiting for a debug connection: $error');
       return LaunchResult.failed();
     } finally {
       await observatoryDiscovery.cancel();
@@ -695,7 +693,7 @@
         'shell', '-x', 'logcat', '-v', 'time', '-t', '1'
       ]);
     } catch (error) {
-      printError('Failed to extract the most recent timestamp from the Android log: $error.');
+      globals.printError('Failed to extract the most recent timestamp from the Android log: $error.');
       return null;
     }
     final Match timeMatch = _timeRegExp.firstMatch(output);
@@ -1162,7 +1160,7 @@
         throwOnError: true,
       ).stdout.trim();
     } on ProcessException catch (error) {
-      printError('Failed to list forwarded ports: $error.');
+      globals.printError('Failed to list forwarded ports: $error.');
       return ports;
     }
 
diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart
index 659cd99..5a7a04e 100644
--- a/packages/flutter_tools/lib/src/android/android_emulator.dart
+++ b/packages/flutter_tools/lib/src/android/android_emulator.dart
@@ -12,6 +12,7 @@
 import '../base/process.dart';
 import '../device.dart';
 import '../emulator.dart';
+import '../globals.dart' as globals;
 import 'android_sdk.dart';
 
 class AndroidEmulators extends EmulatorDiscovery {
@@ -93,12 +94,12 @@
   id = id.trim();
   final String avdPath = getAvdPath();
   if (avdPath != null) {
-    final File iniFile = fs.file(fs.path.join(avdPath, '$id.ini'));
+    final File iniFile = globals.fs.file(globals.fs.path.join(avdPath, '$id.ini'));
     if (iniFile.existsSync()) {
       final Map<String, String> ini = parseIniLines(iniFile.readAsLinesSync());
       if (ini['path'] != null) {
         final File configFile =
-            fs.file(fs.path.join(ini['path'], 'config.ini'));
+            globals.fs.file(globals.fs.path.join(ini['path'], 'config.ini'));
         if (configFile.existsSync()) {
           final Map<String, String> properties =
               parseIniLines(configFile.readAsLinesSync());
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index 7adc6c7..7c4ab74 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -8,12 +8,10 @@
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../base/version.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'android_studio.dart' as android_studio;
 
 AndroidSdk get androidSdk => context.get<AndroidSdk>();
@@ -72,26 +70,26 @@
 String getAvdPath() {
 
   final List<String> searchPaths = <String>[
-    platform.environment['ANDROID_AVD_HOME'],
-    if (platform.environment['HOME'] != null)
-      fs.path.join(platform.environment['HOME'], '.android', 'avd'),
+    globals.platform.environment['ANDROID_AVD_HOME'],
+    if (globals.platform.environment['HOME'] != null)
+      globals.fs.path.join(globals.platform.environment['HOME'], '.android', 'avd'),
   ];
 
 
-  if (platform.isWindows) {
-    final String homeDrive = platform.environment['HOMEDRIVE'];
-    final String homePath = platform.environment['HOMEPATH'];
+  if (globals.platform.isWindows) {
+    final String homeDrive = globals.platform.environment['HOMEDRIVE'];
+    final String homePath = globals.platform.environment['HOMEPATH'];
 
     if (homeDrive != null && homePath != null) {
       // Can't use path.join for HOMEDRIVE/HOMEPATH
       // https://github.com/dart-lang/path/issues/37
       final String home = homeDrive + homePath;
-      searchPaths.add(fs.path.join(home, '.android', 'avd'));
+      searchPaths.add(globals.fs.path.join(home, '.android', 'avd'));
     }
   }
 
   return searchPaths.where((String p) => p != null).firstWhere(
-    (String p) => fs.directory(p).existsSync(),
+    (String p) => globals.fs.directory(p).existsSync(),
     orElse: () => null,
   );
 }
@@ -131,8 +129,8 @@
     }
 
     String findBundle(String androidHomeDir) {
-      final String ndkDirectory = fs.path.join(androidHomeDir, 'ndk-bundle');
-      if (!fs.isDirectorySync(ndkDirectory)) {
+      final String ndkDirectory = globals.fs.path.join(androidHomeDir, 'ndk-bundle');
+      if (!globals.fs.isDirectorySync(ndkDirectory)) {
         throw AndroidNdkSearchError('Can not locate ndk-bundle, tried: $ndkDirectory');
       }
       return ndkDirectory;
@@ -141,20 +139,20 @@
     // Returns list that contains toolchain bin folder and compiler binary name.
     List<String> findToolchainAndCompiler(String ndkDirectory) {
       String directory;
-      if (platform.isLinux) {
+      if (globals.platform.isLinux) {
         directory = 'linux-x86_64';
-      } else if (platform.isMacOS) {
+      } else if (globals.platform.isMacOS) {
         directory = 'darwin-x86_64';
       } else {
         throw AndroidNdkSearchError('Only Linux and macOS are supported');
       }
 
-      final String toolchainBin = fs.path.join(ndkDirectory,
+      final String toolchainBin = globals.fs.path.join(ndkDirectory,
           'toolchains', 'arm-linux-androideabi-4.9', 'prebuilt', directory,
           'bin');
-      final String ndkCompiler = fs.path.join(toolchainBin,
+      final String ndkCompiler = globals.fs.path.join(toolchainBin,
           'arm-linux-androideabi-gcc');
-      if (!fs.isFileSync(ndkCompiler)) {
+      if (!globals.fs.isFileSync(ndkCompiler)) {
         throw AndroidNdkSearchError('Can not locate GCC binary, tried $ndkCompiler');
       }
 
@@ -170,11 +168,11 @@
           return null;
         }
 
-        if (!fs.isDirectorySync(fs.path.join(entry.path, 'arch-arm'))) {
+        if (!globals.fs.isDirectorySync(globals.fs.path.join(entry.path, 'arch-arm'))) {
           return null;
         }
 
-        final String name = fs.path.basename(entry.path);
+        final String name = globals.fs.path.basename(entry.path);
 
         const String platformPrefix = 'android-';
         if (!name.startsWith(platformPrefix)) {
@@ -184,8 +182,8 @@
         return int.tryParse(name.substring(platformPrefix.length));
       }
 
-      final String platformsDir = fs.path.join(ndkDirectory, 'platforms');
-      final List<int> versions = fs
+      final String platformsDir = globals.fs.path.join(ndkDirectory, 'platforms');
+      final List<int> versions = globals.fs
           .directory(platformsDir)
           .listSync()
           .map(toPlatformVersion)
@@ -199,19 +197,19 @@
         throw AndroidNdkSearchError('Can not locate a suitable platform ARM sysroot (need android-9 or newer), tried to look in $platformsDir');
       }
 
-      final String armPlatform = fs.path.join(ndkDirectory, 'platforms',
+      final String armPlatform = globals.fs.path.join(ndkDirectory, 'platforms',
           'android-$suitableVersion', 'arch-arm');
       return <String>['--sysroot', armPlatform];
     }
 
     int findNdkMajorVersion(String ndkDirectory) {
-      final String propertiesFile = fs.path.join(ndkDirectory, 'source.properties');
-      if (!fs.isFileSync(propertiesFile)) {
+      final String propertiesFile = globals.fs.path.join(ndkDirectory, 'source.properties');
+      if (!globals.fs.isFileSync(propertiesFile)) {
         throw AndroidNdkSearchError('Can not establish ndk-bundle version: $propertiesFile not found');
       }
 
       // Parse source.properties: each line has Key = Value format.
-      final Iterable<String> propertiesFileLines = fs.file(propertiesFile)
+      final Iterable<String> propertiesFileLines = globals.fs.file(propertiesFile)
           .readAsStringSync()
           .split('\n')
           .map<String>((String line) => line.trim())
@@ -222,7 +220,7 @@
         if (parts.length == 2) {
           properties[parts[0]] = parts[1];
         } else {
-          printError('Malformed line in ndk source.properties: "$line".');
+          globals.printError('Malformed line in ndk source.properties: "$line".');
         }
       }
 
@@ -245,8 +243,8 @@
       // system linker instead of using toolchain linker. Force clang to
       // use appropriate linker by passing -fuse-ld=<path-to-ld> command line
       // flag.
-      final String ndkLinker = fs.path.join(ndkToolchain, 'arm-linux-androideabi-ld');
-      if (!fs.isFileSync(ndkLinker)) {
+      final String ndkLinker = globals.fs.path.join(ndkToolchain, 'arm-linux-androideabi-ld');
+      if (!globals.fs.isFileSync(ndkLinker)) {
         throw AndroidNdkSearchError('Can not locate linker binary, tried $ndkLinker');
       }
       ndkCompilerArgs.add('-fuse-ld=$ndkLinker');
@@ -289,7 +287,7 @@
   /// the expectation that it will be downloaded later, e.g. by gradle or the
   /// sdkmanager. The [licensesAvailable] property should be used to determine
   /// whether the licenses are at least possibly accepted.
-  bool get platformToolsAvailable => fs.directory(fs.path.join(directory, 'platform-tools')).existsSync();
+  bool get platformToolsAvailable => globals.fs.directory(globals.fs.path.join(directory, 'platform-tools')).existsSync();
 
   /// Whether the `licenses` directory exists in the Android SDK.
   ///
@@ -298,28 +296,28 @@
   /// from another workstation such as in CI scenarios. If these files are valid
   /// gradle or the sdkmanager will be able to download and use other parts of
   /// the SDK on demand.
-  bool get licensesAvailable => fs.directory(fs.path.join(directory, 'licenses')).existsSync();
+  bool get licensesAvailable => globals.fs.directory(globals.fs.path.join(directory, 'licenses')).existsSync();
 
   static AndroidSdk locateAndroidSdk() {
     String findAndroidHomeDir() {
       String androidHomeDir;
-      if (config.containsKey('android-sdk')) {
-        androidHomeDir = config.getValue('android-sdk') as String;
-      } else if (platform.environment.containsKey(kAndroidHome)) {
-        androidHomeDir = platform.environment[kAndroidHome];
-      } else if (platform.environment.containsKey(kAndroidSdkRoot)) {
-        androidHomeDir = platform.environment[kAndroidSdkRoot];
-      } else if (platform.isLinux) {
+      if (globals.config.containsKey('android-sdk')) {
+        androidHomeDir = globals.config.getValue('android-sdk') as String;
+      } else if (globals.platform.environment.containsKey(kAndroidHome)) {
+        androidHomeDir = globals.platform.environment[kAndroidHome];
+      } else if (globals.platform.environment.containsKey(kAndroidSdkRoot)) {
+        androidHomeDir = globals.platform.environment[kAndroidSdkRoot];
+      } else if (globals.platform.isLinux) {
         if (homeDirPath != null) {
-          androidHomeDir = fs.path.join(homeDirPath, 'Android', 'Sdk');
+          androidHomeDir = globals.fs.path.join(homeDirPath, 'Android', 'Sdk');
         }
-      } else if (platform.isMacOS) {
+      } else if (globals.platform.isMacOS) {
         if (homeDirPath != null) {
-          androidHomeDir = fs.path.join(homeDirPath, 'Library', 'Android', 'sdk');
+          androidHomeDir = globals.fs.path.join(homeDirPath, 'Library', 'Android', 'sdk');
         }
-      } else if (platform.isWindows) {
+      } else if (globals.platform.isWindows) {
         if (homeDirPath != null) {
-          androidHomeDir = fs.path.join(homeDirPath, 'AppData', 'Local', 'Android', 'sdk');
+          androidHomeDir = globals.fs.path.join(homeDirPath, 'AppData', 'Local', 'Android', 'sdk');
         }
       }
 
@@ -327,8 +325,8 @@
         if (validSdkDirectory(androidHomeDir)) {
           return androidHomeDir;
         }
-        if (validSdkDirectory(fs.path.join(androidHomeDir, 'sdk'))) {
-          return fs.path.join(androidHomeDir, 'sdk');
+        if (validSdkDirectory(globals.fs.path.join(androidHomeDir, 'sdk'))) {
+          return globals.fs.path.join(androidHomeDir, 'sdk');
         }
       }
 
@@ -336,7 +334,7 @@
       final List<File> aaptBins = os.whichAll('aapt');
       for (File aaptBin in aaptBins) {
         // Make sure we're using the aapt from the SDK.
-        aaptBin = fs.file(aaptBin.resolveSymbolicLinksSync());
+        aaptBin = globals.fs.file(aaptBin.resolveSymbolicLinksSync());
         final String dir = aaptBin.parent.parent.parent.path;
         if (validSdkDirectory(dir)) {
           return dir;
@@ -347,7 +345,7 @@
       final List<File> adbBins = os.whichAll('adb');
       for (File adbBin in adbBins) {
         // Make sure we're using the adb from the SDK.
-        adbBin = fs.file(adbBin.resolveSymbolicLinksSync());
+        adbBin = globals.fs.file(adbBin.resolveSymbolicLinksSync());
         final String dir = adbBin.parent.parent.path;
         if (validSdkDirectory(dir)) {
           return dir;
@@ -360,7 +358,7 @@
     final String androidHomeDir = findAndroidHomeDir();
     if (androidHomeDir == null) {
       // No dice.
-      printTrace('Unable to locate an Android SDK.');
+      globals.printTrace('Unable to locate an Android SDK.');
       return null;
     }
 
@@ -381,24 +379,24 @@
   }
 
   static bool sdkDirectoryHasPlatformTools(String dir) {
-    return fs.isDirectorySync(fs.path.join(dir, 'platform-tools'));
+    return globals.fs.isDirectorySync(globals.fs.path.join(dir, 'platform-tools'));
   }
 
   static bool sdkDirectoryHasLicenses(String dir) {
-    return fs.isDirectorySync(fs.path.join(dir, 'licenses'));
+    return globals.fs.isDirectorySync(globals.fs.path.join(dir, 'licenses'));
   }
 
   List<AndroidSdkVersion> get sdkVersions => _sdkVersions;
 
   AndroidSdkVersion get latestVersion => _latestVersion;
 
-  String get adbPath => getPlatformToolsPath(platform.isWindows ? 'adb.exe' : 'adb');
+  String get adbPath => getPlatformToolsPath(globals.platform.isWindows ? 'adb.exe' : 'adb');
 
   String get emulatorPath => getEmulatorPath();
 
   String get avdManagerPath => getAvdManagerPath();
 
-  Directory get _platformsDir => fs.directory(fs.path.join(directory, 'platforms'));
+  Directory get _platformsDir => globals.fs.directory(globals.fs.path.join(directory, 'platforms'));
 
   Iterable<Directory> get _platforms {
     Iterable<Directory> platforms = <Directory>[];
@@ -413,7 +411,7 @@
   /// Validate the Android SDK. This returns an empty list if there are no
   /// issues; otherwise, it returns a list of issues found.
   List<String> validateSdkWellFormed() {
-    if (adbPath == null || !processManager.canRun(adbPath)) {
+    if (adbPath == null || !globals.processManager.canRun(adbPath)) {
       return <String>['Android SDK file not found: ${adbPath ?? 'adb'}.'];
     }
 
@@ -434,21 +432,21 @@
   }
 
   String getPlatformToolsPath(String binaryName) {
-    final String path = fs.path.join(directory, 'platform-tools', binaryName);
-    if (fs.file(path).existsSync()) {
+    final String path = globals.fs.path.join(directory, 'platform-tools', binaryName);
+    if (globals.fs.file(path).existsSync()) {
       return path;
     }
     return null;
   }
 
   String getEmulatorPath() {
-    final String binaryName = platform.isWindows ? 'emulator.exe' : 'emulator';
+    final String binaryName = globals.platform.isWindows ? 'emulator.exe' : 'emulator';
     // Emulator now lives inside "emulator" but used to live inside "tools" so
     // try both.
     final List<String> searchFolders = <String>['emulator', 'tools'];
     for (final String folder in searchFolders) {
-      final String path = fs.path.join(directory, folder, binaryName);
-      if (fs.file(path).existsSync()) {
+      final String path = globals.fs.path.join(directory, folder, binaryName);
+      if (globals.fs.file(path).existsSync()) {
         return path;
       }
     }
@@ -456,9 +454,9 @@
   }
 
   String getAvdManagerPath() {
-    final String binaryName = platform.isWindows ? 'avdmanager.bat' : 'avdmanager';
-    final String path = fs.path.join(directory, 'tools', 'bin', binaryName);
-    if (fs.file(path).existsSync()) {
+    final String binaryName = globals.platform.isWindows ? 'avdmanager.bat' : 'avdmanager';
+    final String path = globals.fs.path.join(directory, 'tools', 'bin', binaryName);
+    if (globals.fs.file(path).existsSync()) {
       return path;
     }
     return null;
@@ -471,7 +469,7 @@
   void reinitialize() {
     List<Version> buildTools = <Version>[]; // 19.1.0, 22.0.1, ...
 
-    final Directory buildToolsDir = fs.directory(fs.path.join(directory, 'build-tools'));
+    final Directory buildToolsDir = globals.fs.directory(globals.fs.path.join(directory, 'build-tools'));
     if (buildToolsDir.existsSync()) {
       buildTools = buildToolsDir
         .listSync()
@@ -533,24 +531,24 @@
 
   /// Returns the filesystem path of the Android SDK manager tool or null if not found.
   String get sdkManagerPath {
-    return fs.path.join(directory, 'tools', 'bin', 'sdkmanager');
+    return globals.fs.path.join(directory, 'tools', 'bin', 'sdkmanager');
   }
 
   /// First try Java bundled with Android Studio, then sniff JAVA_HOME, then fallback to PATH.
   static String findJavaBinary() {
     if (android_studio.javaPath != null) {
-      return fs.path.join(android_studio.javaPath, 'bin', 'java');
+      return globals.fs.path.join(android_studio.javaPath, 'bin', 'java');
     }
 
-    final String javaHomeEnv = platform.environment[_javaHomeEnvironmentVariable];
+    final String javaHomeEnv = globals.platform.environment[_javaHomeEnvironmentVariable];
     if (javaHomeEnv != null) {
       // Trust JAVA_HOME.
-      return fs.path.join(javaHomeEnv, 'bin', 'java');
+      return globals.fs.path.join(javaHomeEnv, 'bin', 'java');
     }
 
     // MacOS specific logic to avoid popping up a dialog window.
     // See: http://stackoverflow.com/questions/14292698/how-do-i-check-if-the-java-jdk-is-installed-on-mac.
-    if (platform.isMacOS) {
+    if (globals.platform.isMacOS) {
       try {
         final String javaHomeOutput = processUtils.runSync(
           <String>['/usr/libexec/java_home'],
@@ -561,7 +559,7 @@
           final List<String> javaHomeOutputSplit = javaHomeOutput.split('\n');
           if ((javaHomeOutputSplit != null) && (javaHomeOutputSplit.isNotEmpty)) {
             final String javaHome = javaHomeOutputSplit[0].trim();
-            return fs.path.join(javaHome, 'bin', 'java');
+            return globals.fs.path.join(javaHome, 'bin', 'java');
           }
         }
       } catch (_) { /* ignore */ }
@@ -581,7 +579,7 @@
       final String javaBinary = findJavaBinary();
       if (javaBinary != null) {
         _sdkManagerEnv['PATH'] =
-            fs.path.dirname(javaBinary) + os.pathVarSeparator + platform.environment['PATH'];
+            globals.fs.path.dirname(javaBinary) + os.pathVarSeparator + globals.platform.environment['PATH'];
       }
     }
     return _sdkManagerEnv;
@@ -589,7 +587,7 @@
 
   /// Returns the version of the Android SDK manager tool or null if not found.
   String get sdkManagerVersion {
-    if (!processManager.canRun(sdkManagerPath)) {
+    if (!globals.processManager.canRun(sdkManagerPath)) {
       throwToolExit('Android sdkmanager not found. Update to the latest Android SDK to resolve this.');
     }
     final RunResult result = processUtils.runSync(
@@ -597,7 +595,7 @@
       environment: sdkManagerEnv,
     );
     if (result.exitCode != 0) {
-      printTrace('sdkmanager --version failed: exitCode: ${result.exitCode} stdout: ${result.stdout} stderr: ${result.stderr}');
+      globals.printTrace('sdkmanager --version failed: exitCode: ${result.exitCode} stdout: ${result.stdout} stderr: ${result.stderr}');
       return null;
     }
     return result.stdout.trim();
@@ -641,11 +639,11 @@
   }
 
   String getPlatformsPath(String itemName) {
-    return fs.path.join(sdk.directory, 'platforms', platformName, itemName);
+    return globals.fs.path.join(sdk.directory, 'platforms', platformName, itemName);
   }
 
   String getBuildToolsPath(String binaryName) {
-    return fs.path.join(sdk.directory, 'build-tools', buildToolsVersionName, binaryName);
+    return globals.fs.path.join(sdk.directory, 'build-tools', buildToolsVersionName, binaryName);
   }
 
   @override
@@ -655,14 +653,14 @@
   String toString() => '[${sdk.directory}, SDK version $sdkLevel, build-tools $buildToolsVersionName]';
 
   String _exists(String path) {
-    if (!fs.isFileSync(path)) {
+    if (!globals.fs.isFileSync(path)) {
       return 'Android SDK file not found: $path.';
     }
     return null;
   }
 
   String _canRun(String path) {
-    if (!processManager.canRun(path)) {
+    if (!globals.processManager.canRun(path)) {
       return 'Android SDK file not found: $path.';
     }
     return null;
diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart
index bbcad33..32014e2 100644
--- a/packages/flutter_tools/lib/src/android/android_studio.dart
+++ b/packages/flutter_tools/lib/src/android/android_studio.dart
@@ -5,12 +5,10 @@
 import '../base/common.dart';
 import '../base/context.dart';
 import '../base/file_system.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../base/utils.dart';
 import '../base/version.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../ios/plist_parser.dart';
 
 AndroidStudio get androidStudio => context.get<AndroidStudio>();
@@ -41,15 +39,15 @@
   }
 
   factory AndroidStudio.fromMacOSBundle(String bundlePath) {
-    String studioPath = fs.path.join(bundlePath, 'Contents');
-    String plistFile = fs.path.join(studioPath, 'Info.plist');
+    String studioPath = globals.fs.path.join(bundlePath, 'Contents');
+    String plistFile = globals.fs.path.join(studioPath, 'Info.plist');
     Map<String, dynamic> plistValues = PlistParser.instance.parseFile(plistFile);
     // As AndroidStudio managed by JetBrainsToolbox could have a wrapper pointing to the real Android Studio.
     // Check if we've found a JetBrainsToolbox wrapper and deal with it properly.
     final String jetBrainsToolboxAppBundlePath = plistValues['JetBrainsToolboxApp'] as String;
     if (jetBrainsToolboxAppBundlePath != null) {
-      studioPath = fs.path.join(jetBrainsToolboxAppBundlePath, 'Contents');
-      plistFile = fs.path.join(studioPath, 'Info.plist');
+      studioPath = globals.fs.path.join(jetBrainsToolboxAppBundlePath, 'Contents');
+      plistFile = globals.fs.path.join(studioPath, 'Info.plist');
       plistValues = PlistParser.instance.parseFile(plistFile);
     }
 
@@ -70,7 +68,7 @@
     }
     final String presetPluginsPath = pathsSelectorValue == null
         ? null
-        : fs.path.join(homeDirPath, 'Library', 'Application Support', '$pathsSelectorValue');
+        : globals.fs.path.join(homeDirPath, 'Library', 'Application Support', '$pathsSelectorValue');
     return AndroidStudio(studioPath, version: version, presetPluginsPath: presetPluginsPath);
   }
 
@@ -87,13 +85,13 @@
     }
     String installPath;
     try {
-      installPath = fs
-          .file(fs.path.join(homeDotDir.path, 'system', '.home'))
+      installPath = globals.fs
+          .file(globals.fs.path.join(homeDotDir.path, 'system', '.home'))
           .readAsStringSync();
     } catch (e) {
       // ignored, installPath will be null, which is handled below
     }
-    if (installPath != null && fs.isDirectorySync(installPath)) {
+    if (installPath != null && globals.fs.isDirectorySync(installPath)) {
       return AndroidStudio(
           installPath,
           version: version,
@@ -123,14 +121,14 @@
     }
     final int major = version?.major;
     final int minor = version?.minor;
-    if (platform.isMacOS) {
-      return fs.path.join(
+    if (globals.platform.isMacOS) {
+      return globals.fs.path.join(
           homeDirPath,
           'Library',
           'Application Support',
           'AndroidStudio$major.$minor');
     } else {
-      return fs.path.join(homeDirPath,
+      return globals.fs.path.join(homeDirPath,
           '.$studioAppName$major.$minor',
           'config',
           'plugins');
@@ -150,11 +148,11 @@
 
   /// Locates the newest, valid version of Android Studio.
   static AndroidStudio latestValid() {
-    final String configuredStudio = config.getValue('android-studio-dir') as String;
+    final String configuredStudio = globals.config.getValue('android-studio-dir') as String;
     if (configuredStudio != null) {
       String configuredStudioPath = configuredStudio;
-      if (platform.isMacOS && !configuredStudioPath.endsWith('Contents')) {
-        configuredStudioPath = fs.path.join(configuredStudioPath, 'Contents');
+      if (globals.platform.isMacOS && !configuredStudioPath.endsWith('Contents')) {
+        configuredStudioPath = globals.fs.path.join(configuredStudioPath, 'Contents');
       }
       return AndroidStudio(configuredStudioPath,
           configured: configuredStudio);
@@ -171,17 +169,17 @@
   }
 
   static List<AndroidStudio> allInstalled() =>
-      platform.isMacOS ? _allMacOS() : _allLinuxOrWindows();
+      globals.platform.isMacOS ? _allMacOS() : _allLinuxOrWindows();
 
   static List<AndroidStudio> _allMacOS() {
     final List<FileSystemEntity> candidatePaths = <FileSystemEntity>[];
 
     void _checkForStudio(String path) {
-      if (!fs.isDirectorySync(path)) {
+      if (!globals.fs.isDirectorySync(path)) {
         return;
       }
       try {
-        final Iterable<Directory> directories = fs
+        final Iterable<Directory> directories = globals.fs
             .directory(path)
             .listSync(followLinks: false)
             .whereType<Directory>();
@@ -195,16 +193,16 @@
           }
         }
       } catch (e) {
-        printTrace('Exception while looking for Android Studio: $e');
+        globals.printTrace('Exception while looking for Android Studio: $e');
       }
     }
 
     _checkForStudio('/Applications');
-    _checkForStudio(fs.path.join(homeDirPath, 'Applications'));
+    _checkForStudio(globals.fs.path.join(homeDirPath, 'Applications'));
 
-    final String configuredStudioDir = config.getValue('android-studio-dir') as String;
+    final String configuredStudioDir = globals.config.getValue('android-studio-dir') as String;
     if (configuredStudioDir != null) {
-      FileSystemEntity configuredStudio = fs.file(configuredStudioDir);
+      FileSystemEntity configuredStudio = globals.fs.file(configuredStudioDir);
       if (configuredStudio.basename == 'Contents') {
         configuredStudio = configuredStudio.parent;
       }
@@ -237,8 +235,8 @@
 
     // Read all $HOME/.AndroidStudio*/system/.home files. There may be several
     // pointing to the same installation, so we grab only the latest one.
-    if (homeDirPath != null && fs.directory(homeDirPath).existsSync()) {
-      for (FileSystemEntity entity in fs.directory(homeDirPath).listSync(followLinks: false)) {
+    if (homeDirPath != null && globals.fs.directory(homeDirPath).existsSync()) {
+      for (FileSystemEntity entity in globals.fs.directory(homeDirPath).listSync(followLinks: false)) {
         if (entity is Directory && entity.basename.startsWith('.AndroidStudio')) {
           final AndroidStudio studio = AndroidStudio.fromHomeDot(entity);
           if (studio != null && !_hasStudioAt(studio.directory, newerThan: studio.version)) {
@@ -249,15 +247,15 @@
       }
     }
 
-    final String configuredStudioDir = config.getValue('android-studio-dir') as String;
+    final String configuredStudioDir = globals.config.getValue('android-studio-dir') as String;
     if (configuredStudioDir != null && !_hasStudioAt(configuredStudioDir)) {
       studios.add(AndroidStudio(configuredStudioDir,
           configured: configuredStudioDir));
     }
 
-    if (platform.isLinux) {
+    if (globals.platform.isLinux) {
       void _checkWellKnownPath(String path) {
-        if (fs.isDirectorySync(path) && !_hasStudioAt(path)) {
+        if (globals.fs.isDirectorySync(path) && !_hasStudioAt(path)) {
           studios.add(AndroidStudio(path));
         }
       }
@@ -284,16 +282,16 @@
       _validationMessages.add('android-studio-dir = $configured');
     }
 
-    if (!fs.isDirectorySync(directory)) {
+    if (!globals.fs.isDirectorySync(directory)) {
       _validationMessages.add('Android Studio not found at $directory');
       return;
     }
 
-    final String javaPath = platform.isMacOS ?
-        fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home') :
-        fs.path.join(directory, 'jre');
-    final String javaExecutable = fs.path.join(javaPath, 'bin', 'java');
-    if (!processManager.canRun(javaExecutable)) {
+    final String javaPath = globals.platform.isMacOS ?
+        globals.fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home') :
+        globals.fs.path.join(directory, 'jre');
+    final String javaExecutable = globals.fs.path.join(javaPath, 'bin', 'java');
+    if (!globals.processManager.canRun(javaExecutable)) {
       _validationMessages.add('Unable to find bundled Java version.');
     } else {
       final RunResult result = processUtils.runSync(<String>[javaExecutable, '-version']);
diff --git a/packages/flutter_tools/lib/src/android/android_studio_validator.dart b/packages/flutter_tools/lib/src/android/android_studio_validator.dart
index d4c6ecc..3055870 100644
--- a/packages/flutter_tools/lib/src/android/android_studio_validator.dart
+++ b/packages/flutter_tools/lib/src/android/android_studio_validator.dart
@@ -7,7 +7,7 @@
 import '../base/user_messages.dart';
 import '../base/version.dart';
 import '../doctor.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../intellij/intellij.dart';
 import 'android_studio.dart';
 
@@ -71,7 +71,7 @@
   Future<ValidationResult> validate() async {
     final List<ValidationMessage> messages = <ValidationMessage>[];
 
-    final String cfgAndroidStudio = config.getValue('android-studio-dir') as String;
+    final String cfgAndroidStudio = globals.config.getValue('android-studio-dir') as String;
     if (cfgAndroidStudio != null) {
       messages.add(ValidationMessage.error(userMessages.androidStudioMissing(cfgAndroidStudio)));
     }
diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart
index c9c0a05..f8e437a 100644
--- a/packages/flutter_tools/lib/src/android/android_workflow.dart
+++ b/packages/flutter_tools/lib/src/android/android_workflow.dart
@@ -7,15 +7,13 @@
 import '../base/common.dart';
 import '../base/context.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../base/user_messages.dart';
 import '../base/utils.dart';
 import '../base/version.dart';
 import '../convert.dart';
 import '../doctor.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'android_sdk.dart';
 
 const int kAndroidSdkMinVersion = 28;
@@ -74,20 +72,20 @@
   Future<bool> _checkJavaVersion(String javaBinary, List<ValidationMessage> messages) async {
     _task = 'Checking Java status';
     try {
-      if (!processManager.canRun(javaBinary)) {
+      if (!globals.processManager.canRun(javaBinary)) {
         messages.add(ValidationMessage.error(userMessages.androidCantRunJavaBinary(javaBinary)));
         return false;
       }
       String javaVersionText;
       try {
-        printTrace('java -version');
-        final ProcessResult result = await processManager.run(<String>[javaBinary, '-version']);
+        globals.printTrace('java -version');
+        final ProcessResult result = await globals.processManager.run(<String>[javaBinary, '-version']);
         if (result.exitCode == 0) {
           final List<String> versionLines = (result.stderr as String).split('\n');
           javaVersionText = versionLines.length >= 2 ? versionLines[1] : versionLines[0];
         }
       } catch (error) {
-        printTrace(error.toString());
+        globals.printTrace(error.toString());
       }
       if (javaVersionText == null || javaVersionText.isEmpty) {
         // Could not determine the java version.
@@ -112,8 +110,8 @@
 
     if (androidSdk == null) {
       // No Android SDK found.
-      if (platform.environment.containsKey(kAndroidHome)) {
-        final String androidHomeDir = platform.environment[kAndroidHome];
+      if (globals.platform.environment.containsKey(kAndroidHome)) {
+        final String androidHomeDir = globals.platform.environment[kAndroidHome];
         messages.add(ValidationMessage.error(userMessages.androidBadSdkDir(kAndroidHome, androidHomeDir)));
       } else {
         messages.add(ValidationMessage.error(userMessages.androidMissingSdkInstructions(kAndroidHome)));
@@ -149,12 +147,12 @@
       messages.add(ValidationMessage.error(userMessages.androidMissingSdkInstructions(kAndroidHome)));
     }
 
-    if (platform.environment.containsKey(kAndroidHome)) {
-      final String androidHomeDir = platform.environment[kAndroidHome];
+    if (globals.platform.environment.containsKey(kAndroidHome)) {
+      final String androidHomeDir = globals.platform.environment[kAndroidHome];
       messages.add(ValidationMessage('$kAndroidHome = $androidHomeDir'));
     }
-    if (platform.environment.containsKey(kAndroidSdkRoot)) {
-      final String androidSdkRoot = platform.environment[kAndroidSdkRoot];
+    if (globals.platform.environment.containsKey(kAndroidSdkRoot)) {
+      final String androidSdkRoot = globals.platform.environment[kAndroidSdkRoot];
       messages.add(ValidationMessage('$kAndroidSdkRoot = $androidSdkRoot'));
     }
 
@@ -229,18 +227,18 @@
     if (javaBinary == null) {
       return false;
     }
-    if (!processManager.canRun(javaBinary)) {
+    if (!globals.processManager.canRun(javaBinary)) {
       return false;
     }
     String javaVersion;
     try {
-      final ProcessResult result = await processManager.run(<String>[javaBinary, '-version']);
+      final ProcessResult result = await globals.processManager.run(<String>[javaBinary, '-version']);
       if (result.exitCode == 0) {
         final List<String> versionLines = (result.stderr as String).split('\n');
         javaVersion = versionLines.length >= 2 ? versionLines[1] : versionLines[0];
       }
     } catch (error) {
-      printTrace(error.toString());
+      globals.printTrace(error.toString());
     }
     if (javaVersion == null) {
       // Could not determine the java version.
@@ -295,7 +293,7 @@
       await Future.wait<void>(<Future<void>>[output, errors]);
       return status ?? LicensesAccepted.unknown;
     } on ProcessException catch (e) {
-      printTrace('Failed to run Android sdk manager: $e');
+      globals.printTrace('Failed to run Android sdk manager: $e');
       return LicensesAccepted.unknown;
     }
   }
@@ -303,7 +301,7 @@
   /// Run the Android SDK manager tool in order to accept SDK licenses.
   static Future<bool> runLicenseManager() async {
     if (androidSdk == null) {
-      printStatus(userMessages.androidSdkShort);
+      globals.printStatus(userMessages.androidSdkShort);
       return false;
     }
 
@@ -345,6 +343,6 @@
   static bool _canRunSdkManager() {
     assert(androidSdk != null);
     final String sdkManagerPath = androidSdk.sdkManagerPath;
-    return processManager.canRun(sdkManagerPath);
+    return globals.processManager.canRun(sdkManagerPath);
   }
 }
diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart
index 23a1c47..676599a 100644
--- a/packages/flutter_tools/lib/src/android/gradle.dart
+++ b/packages/flutter_tools/lib/src/android/gradle.dart
@@ -20,7 +20,7 @@
 import '../build_info.dart';
 import '../cache.dart';
 import '../flutter_manifest.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import 'android_sdk.dart';
@@ -107,12 +107,12 @@
 /// Returns true if the current version of the Gradle plugin is supported.
 bool _isSupportedVersion(AndroidProject project) {
   final File plugin = project.hostAppGradleRoot.childFile(
-      fs.path.join('buildSrc', 'src', 'main', 'groovy', 'FlutterPlugin.groovy'));
+      globals.fs.path.join('buildSrc', 'src', 'main', 'groovy', 'FlutterPlugin.groovy'));
   if (plugin.existsSync()) {
     return false;
   }
   final File appGradle = project.hostAppGradleRoot.childFile(
-      fs.path.join('app', 'build.gradle'));
+      globals.fs.path.join('app', 'build.gradle'));
   if (!appGradle.existsSync()) {
     return false;
   }
@@ -136,7 +136,7 @@
 /// Runs `gradlew dependencies`, ensuring that dependencies are resolved and
 /// potentially downloaded.
 Future<void> checkGradleDependencies() async {
-  final Status progress = logger.startProgress(
+  final Status progress = globals.logger.startProgress(
     'Ensuring gradle dependencies are up to date...',
     timeout: timeoutConfiguration.slowOperation,
   );
@@ -168,15 +168,15 @@
   }
   final String currentFileContent = currentSettingsFile.readAsStringSync();
 
-  final String newSettingsRelativeFile = fs.path.relative(newSettingsFile.path);
-  final Status status = logger.startProgress('✏️  Creating `$newSettingsRelativeFile`...',
+  final String newSettingsRelativeFile = globals.fs.path.relative(newSettingsFile.path);
+  final Status status = globals.logger.startProgress('✏️  Creating `$newSettingsRelativeFile`...',
       timeout: timeoutConfiguration.fastOperation);
 
-  final String flutterRoot = fs.path.absolute(Cache.flutterRoot);
-  final File deprecatedFile = fs.file(fs.path.join(flutterRoot, 'packages','flutter_tools',
+  final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot);
+  final File deprecatedFile = globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools',
       'gradle', 'deprecated_settings.gradle'));
   assert(deprecatedFile.existsSync());
-  final String settingsAarContent = fs.file(fs.path.join(flutterRoot, 'packages','flutter_tools',
+  final String settingsAarContent = globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools',
       'gradle', 'settings_aar.gradle.tmpl')).readAsStringSync();
 
   // Get the `settings.gradle` content variants that should be patched.
@@ -192,16 +192,16 @@
   }
   if (!exactMatch) {
     status.cancel();
-    printStatus('$warningMark Flutter tried to create the file `$newSettingsRelativeFile`, but failed.');
+    globals.printStatus('$warningMark Flutter tried to create the file `$newSettingsRelativeFile`, but failed.');
     // Print how to manually update the file.
-    printStatus(fs.file(fs.path.join(flutterRoot, 'packages','flutter_tools',
+    globals.printStatus(globals.fs.file(globals.fs.path.join(flutterRoot, 'packages','flutter_tools',
         'gradle', 'manual_migration_settings.gradle.md')).readAsStringSync());
     throwToolExit('Please create the file and run this command again.');
   }
   // Copy the new file.
   newSettingsFile.writeAsStringSync(settingsAarContent);
   status.stop();
-  printStatus('$successMark `$newSettingsRelativeFile` created successfully.');
+  globals.printStatus('$successMark `$newSettingsRelativeFile` created successfully.');
 }
 
 /// Builds an app.
@@ -244,8 +244,8 @@
     BuildEvent('app-using-android-x').send();
   } else if (!usesAndroidX) {
     BuildEvent('app-not-using-android-x').send();
-    printStatus('$warningMark Your app isn\'t using AndroidX.', emphasis: true);
-    printStatus(
+    globals.printStatus('$warningMark Your app isn\'t using AndroidX.', emphasis: true);
+    globals.printStatus(
       'To avoid potential build failures, you can quickly migrate your app '
       'by following the steps on https://goo.gl/CP92wY.',
       indent: 4,
@@ -270,7 +270,7 @@
     ? getBundleTaskFor(buildInfo)
     : getAssembleTaskFor(buildInfo);
 
-  final Status status = logger.startProgress(
+  final Status status = globals.logger.startProgress(
     'Running Gradle task \'$assembleTask\'...',
     timeout: timeoutConfiguration.slowOperation,
     multilineOutput: true,
@@ -279,18 +279,18 @@
   final List<String> command = <String>[
     gradleUtils.getExecutable(project),
   ];
-  if (logger.isVerbose) {
+  if (globals.logger.isVerbose) {
     command.add('-Pverbose=true');
   } else {
     command.add('-q');
   }
-  if (artifacts is LocalEngineArtifacts) {
-    final LocalEngineArtifacts localEngineArtifacts = artifacts as LocalEngineArtifacts;
+  if (globals.artifacts is LocalEngineArtifacts) {
+    final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
     final Directory localEngineRepo = _getLocalEngineRepo(
       engineOutPath: localEngineArtifacts.engineOutPath,
       androidBuildInfo: androidBuildInfo,
     );
-    printTrace(
+    globals.printTrace(
       'Using local engine: ${localEngineArtifacts.engineOutPath}\n'
       'Local Maven repo: ${localEngineRepo.path}'
     );
@@ -448,8 +448,8 @@
       ? '' // Don't display the size when building a debug variant.
       : ' (${getSizeAsMB(bundleFile.lengthSync())})';
 
-    printStatus(
-      '$successMark Built ${fs.path.relative(bundleFile.path)}$appSize.',
+    globals.printStatus(
+      '$successMark Built ${globals.fs.path.relative(bundleFile.path)}$appSize.',
       color: TerminalColor.green,
     );
     return;
@@ -460,7 +460,7 @@
   // Copy the first APK to app.apk, so `flutter run` can find it.
   // TODO(egarciad): Handle multiple APKs.
   apkFiles.first.copySync(apkDirectory.childFile('app.apk').path);
-  printTrace('calculateSha: $apkDirectory/app.apk');
+  globals.printTrace('calculateSha: $apkDirectory/app.apk');
 
   final File apkShaFile = apkDirectory.childFile('app.apk.sha1');
   apkShaFile.writeAsStringSync(_calculateSha(apkFiles.first));
@@ -469,8 +469,8 @@
     final String appSize = (buildInfo.mode == BuildMode.debug)
       ? '' // Don't display the size when building a debug variant.
       : ' (${getSizeAsMB(apkFile.lengthSync())})';
-    printStatus(
-      '$successMark Built ${fs.path.relative(apkFile.path)}$appSize.',
+    globals.printStatus(
+      '$successMark Built ${globals.fs.path.relative(apkFile.path)}$appSize.',
       color: TerminalColor.green,
     );
   }
@@ -501,14 +501,14 @@
   }
 
   final String aarTask = getAarTaskFor(androidBuildInfo.buildInfo);
-  final Status status = logger.startProgress(
+  final Status status = globals.logger.startProgress(
     'Running Gradle task \'$aarTask\'...',
     timeout: timeoutConfiguration.slowOperation,
     multilineOutput: true,
   );
 
-  final String flutterRoot = fs.path.absolute(Cache.flutterRoot);
-  final String initScript = fs.path.join(
+  final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot);
+  final String initScript = globals.fs.path.join(
     flutterRoot,
     'packages',
     'flutter_tools',
@@ -533,13 +533,13 @@
         .map(getPlatformNameForAndroidArch).join(',');
     command.add('-Ptarget-platform=$targetPlatforms');
   }
-  if (artifacts is LocalEngineArtifacts) {
-    final LocalEngineArtifacts localEngineArtifacts = artifacts as LocalEngineArtifacts;
+  if (globals.artifacts is LocalEngineArtifacts) {
+    final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
     final Directory localEngineRepo = _getLocalEngineRepo(
       engineOutPath: localEngineArtifacts.engineOutPath,
       androidBuildInfo: androidBuildInfo,
     );
-    printTrace(
+    globals.printTrace(
       'Using local engine: ${localEngineArtifacts.engineOutPath}\n'
       'Local Maven repo: ${localEngineRepo.path}'
     );
@@ -565,8 +565,8 @@
   flutterUsage.sendTiming('build', 'gradle-aar', sw.elapsed);
 
   if (result.exitCode != 0) {
-    printStatus(result.stdout, wrap: false);
-    printError(result.stderr, wrap: false);
+    globals.printStatus(result.stdout, wrap: false);
+    globals.printError(result.stderr, wrap: false);
     throwToolExit(
       'Gradle task $aarTask failed with exit code $exitCode.',
       exitCode: exitCode,
@@ -574,15 +574,15 @@
   }
   final Directory repoDirectory = getRepoDirectory(outputDirectory);
   if (!repoDirectory.existsSync()) {
-    printStatus(result.stdout, wrap: false);
-    printError(result.stderr, wrap: false);
+    globals.printStatus(result.stdout, wrap: false);
+    globals.printError(result.stderr, wrap: false);
     throwToolExit(
       'Gradle task $aarTask failed to produce $repoDirectory.',
       exitCode: exitCode,
     );
   }
-  printStatus(
-    '$successMark Built ${fs.path.relative(repoDirectory.path)}.',
+  globals.printStatus(
+    '$successMark Built ${globals.fs.path.relative(repoDirectory.path)}.',
     color: TerminalColor.green,
   );
 }
@@ -599,10 +599,10 @@
   assert(repoDirectory != null);
   buildNumber ??= '1.0';
 
-  printStatus('''
+  globals.printStatus('''
 
-${terminal.bolden('Consuming the Module')}
-  1. Open ${fs.path.join('<host>', 'app', 'build.gradle')}
+${globals.terminal.bolden('Consuming the Module')}
+  1. Open ${globals.fs.path.join('<host>', 'app', 'build.gradle')}
   2. Ensure you have the repositories configured, otherwise add them:
 
       repositories {
@@ -619,16 +619,16 @@
     dependencies {''');
 
   for (String buildMode in buildModes) {
-    printStatus('''
+    globals.printStatus('''
       ${buildMode}Implementation '$androidPackage:flutter_$buildMode:$buildNumber''');
   }
 
-printStatus('''
+  globals.printStatus('''
     }
 ''');
 
   if (buildModes.contains('profile')) {
-    printStatus('''
+    globals.printStatus('''
 
   4. Add the `profile` build type:
 
@@ -642,7 +642,7 @@
 ''');
   }
 
-printStatus('To learn more, visit https://flutter.dev/go/build-aar''');
+  globals.printStatus('To learn more, visit https://flutter.dev/go/build-aar''');
 }
 
 String _hex(List<int> bytes) {
@@ -656,11 +656,11 @@
 String _calculateSha(File file) {
   final Stopwatch sw = Stopwatch()..start();
   final List<int> bytes = file.readAsBytesSync();
-  printTrace('calculateSha: reading file took ${sw.elapsedMilliseconds}us');
+  globals.printTrace('calculateSha: reading file took ${sw.elapsedMilliseconds}us');
   flutterUsage.sendTiming('build', 'apk-sha-read', sw.elapsed);
   sw.reset();
   final String sha = _hex(sha1.convert(bytes).bytes);
-  printTrace('calculateSha: computing sha took ${sw.elapsedMilliseconds}us');
+  globals.printTrace('calculateSha: computing sha took ${sw.elapsedMilliseconds}us');
   flutterUsage.sendTiming('build', 'apk-sha-calc', sw.elapsed);
   return sha;
 }
@@ -712,16 +712,16 @@
     if (pluginParts.length != 2) {
       continue;
     }
-    final Directory pluginDirectory = fs.directory(pluginParts.last);
+    final Directory pluginDirectory = globals.fs.directory(pluginParts.last);
     assert(pluginDirectory.existsSync());
 
     final String pluginName = pluginParts.first;
     final File buildGradleFile = pluginDirectory.childDirectory('android').childFile('build.gradle');
     if (!buildGradleFile.existsSync()) {
-      printTrace('Skipping plugin $pluginName since it doesn\'t have a android/build.gradle file');
+      globals.printTrace('Skipping plugin $pluginName since it doesn\'t have a android/build.gradle file');
       continue;
     }
-    logger.printStatus('Building plugin $pluginName...');
+    globals.logger.printStatus('Building plugin $pluginName...');
     try {
       await buildGradleAar(
         project: FlutterProject.fromDirectory(pluginDirectory),
@@ -848,11 +848,11 @@
 }
 
 void _createSymlink(String targetPath, String linkPath) {
-  final File targetFile = fs.file(targetPath);
+  final File targetFile = globals.fs.file(targetPath);
   if (!targetFile.existsSync()) {
     throwToolExit('The file $targetPath wasn\'t found in the local engine out directory.');
   }
-  final File linkFile = fs.file(linkPath);
+  final File linkFile = globals.fs.file(linkPath);
   final Link symlink = linkFile.parent.childLink(linkFile.basename);
   try {
     symlink.createSync(targetPath, recursive: true);
@@ -864,7 +864,7 @@
 }
 
 String _getLocalArtifactVersion(String pomPath) {
-  final File pomFile = fs.file(pomPath);
+  final File pomFile = globals.fs.file(pomPath);
   if (!pomFile.existsSync()) {
     throwToolExit('The file $pomPath wasn\'t found in the local engine out directory.');
   }
@@ -903,7 +903,7 @@
   assert(androidBuildInfo != null);
 
   final String abi = getEnumName(androidBuildInfo.targetArchs.first);
-  final Directory localEngineRepo = fs.systemTempDirectory
+  final Directory localEngineRepo = globals.fs.systemTempDirectory
     .createTempSync('flutter_tool_local_engine_repo.');
 
   // Remove the local engine repo before the tool exits.
@@ -914,7 +914,7 @@
 
   final String buildMode = androidBuildInfo.buildInfo.modeName;
   final String artifactVersion = _getLocalArtifactVersion(
-    fs.path.join(
+    globals.fs.path.join(
       engineOutPath,
       'flutter_embedding_$buildMode.pom',
     )
@@ -922,11 +922,11 @@
   for (String artifact in const <String>['pom', 'jar']) {
     // The Android embedding artifacts.
     _createSymlink(
-      fs.path.join(
+      globals.fs.path.join(
         engineOutPath,
         'flutter_embedding_$buildMode.$artifact',
       ),
-      fs.path.join(
+      globals.fs.path.join(
         localEngineRepo.path,
         'io',
         'flutter',
@@ -937,11 +937,11 @@
     );
     // The engine artifacts (libflutter.so).
     _createSymlink(
-      fs.path.join(
+      globals.fs.path.join(
         engineOutPath,
         '${abi}_$buildMode.$artifact',
       ),
-      fs.path.join(
+      globals.fs.path.join(
         localEngineRepo.path,
         'io',
         'flutter',
diff --git a/packages/flutter_tools/lib/src/android/gradle_errors.dart b/packages/flutter_tools/lib/src/android/gradle_errors.dart
index 4b8fc2c..be2c00a 100644
--- a/packages/flutter_tools/lib/src/android/gradle_errors.dart
+++ b/packages/flutter_tools/lib/src/android/gradle_errors.dart
@@ -6,7 +6,7 @@
 
 import '../base/process.dart';
 import '../base/terminal.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import 'gradle_utils.dart';
@@ -85,8 +85,8 @@
     bool usesAndroidX,
     bool shouldBuildPluginAsAar,
   }) async {
-    printStatus('$warningMark Gradle does not have execution permission.', emphasis: true);
-    printStatus(
+    globals.printStatus('$warningMark Gradle does not have execution permission.', emphasis: true);
+    globals.printStatus(
       'You should change the ownership of the project directory to your user, '
       'or move the project to a directory with execute permissions.',
       indent: 4
@@ -115,7 +115,7 @@
     bool usesAndroidX,
     bool shouldBuildPluginAsAar,
   }) async {
-    printError(
+    globals.printError(
       '$warningMark Gradle threw an error while trying to update itself. '
       'Retrying the update...'
     );
@@ -136,9 +136,9 @@
     bool usesAndroidX,
     bool shouldBuildPluginAsAar,
   }) async {
-    printStatus('$warningMark The shrinker may have failed to optimize the Java bytecode.', emphasis: true);
-    printStatus('To disable the shrinker, pass the `--no-shrink` flag to this command.', indent: 4);
-    printStatus('To learn more, see: https://developer.android.com/studio/build/shrink-code', indent: 4);
+    globals.printStatus('$warningMark The shrinker may have failed to optimize the Java bytecode.', emphasis: true);
+    globals.printStatus('To disable the shrinker, pass the `--no-shrink` flag to this command.', indent: 4);
+    globals.printStatus('To learn more, see: https://developer.android.com/studio/build/shrink-code', indent: 4);
     return GradleBuildStatus.exit;
   },
   eventLabel: 'r8',
@@ -187,7 +187,7 @@
     if (hasPlugins && !usesAndroidX) {
       // If the app isn't using AndroidX, then the app is likely using
       // a plugin already migrated to AndroidX.
-      printStatus(
+      globals.printStatus(
         'AndroidX incompatibilities may have caused this build to fail. '
         'Please migrate your app to AndroidX. See https://goo.gl/CP92wY.'
       );
@@ -206,7 +206,7 @@
       ).send();
     }
     if (hasPlugins && usesAndroidX && !shouldBuildPluginAsAar) {
-      printStatus(
+      globals.printStatus(
         'The built failed likely due to AndroidX incompatibilities in a plugin. '
         'The tool is about to try using Jetfier to solve the incompatibility.'
       );
@@ -242,7 +242,7 @@
     final RegExp licenseFailure = RegExp(licenseNotAcceptedMatcher, multiLine: true);
     assert(licenseFailure != null);
     final Match licenseMatch = licenseFailure.firstMatch(line);
-    printStatus(
+    globals.printStatus(
       '$warningMark Unable to download needed Android SDK components, as the '
       'following licenses have not been accepted:\n'
       '${licenseMatch.group(1)}\n\n'
@@ -303,18 +303,18 @@
         }
       }
     }
-    printStatus(
+    globals.printStatus(
       '\n$warningMark  Gradle project does not define a task suitable '
       'for the requested build.'
     );
     if (productFlavors.isEmpty) {
-      printStatus(
+      globals.printStatus(
         'The android/app/build.gradle file does not define '
         'any custom product flavors. '
         'You cannot use the --flavor option.'
       );
     } else {
-      printStatus(
+      globals.printStatus(
         'The android/app/build.gradle file defines product '
         'flavors: ${productFlavors.join(', ')} '
         'You must specify a --flavor option to select one of them.'
diff --git a/packages/flutter_tools/lib/src/android/gradle_utils.dart b/packages/flutter_tools/lib/src/android/gradle_utils.dart
index 7802358..8a97665 100644
--- a/packages/flutter_tools/lib/src/android/gradle_utils.dart
+++ b/packages/flutter_tools/lib/src/android/gradle_utils.dart
@@ -9,13 +9,12 @@
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/terminal.dart';
 import '../base/utils.dart';
 import '../base/version.dart';
 import '../build_info.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import 'android_sdk.dart';
@@ -23,7 +22,7 @@
 
 /// The environment variables needed to run Gradle.
 Map<String, String> get gradleEnvironment {
-  final Map<String, String> environment = Map<String, String>.from(platform.environment);
+  final Map<String, String> environment = Map<String, String>.from(globals.platform.environment);
   if (javaPath != null) {
     // Use java bundled with Android Studio.
     environment['JAVA_HOME'] = javaPath;
@@ -50,10 +49,10 @@
     gradleUtils.injectGradleWrapperIfNeeded(androidDir);
 
     final File gradle = androidDir.childFile(
-      platform.isWindows ? 'gradlew.bat' : 'gradlew',
+      globals.platform.isWindows ? 'gradlew.bat' : 'gradlew',
     );
     if (gradle.existsSync()) {
-      printTrace('Using gradle from ${gradle.absolute.path}.');
+      globals.printTrace('Using gradle from ${gradle.absolute.path}.');
       // If the Gradle executable doesn't have execute permission,
       // then attempt to set it.
       _giveExecutePermissionIfNeeded(gradle);
@@ -79,10 +78,10 @@
     }
     final String propertiesContent = gradleProperties.readAsStringSync();
     if (propertiesContent.contains('android.enableR8')) {
-      printTrace('gradle.properties already sets `android.enableR8`');
+      globals.printTrace('gradle.properties already sets `android.enableR8`');
       return;
     }
-    printTrace('set `android.enableR8=true` in gradle.properties');
+    globals.printTrace('set `android.enableR8=true` in gradle.properties');
     try {
       if (propertiesContent.isNotEmpty && !propertiesContent.endsWith('\n')) {
         // Add a new line if the file doesn't end with a new line.
@@ -100,7 +99,7 @@
   /// Injects the Gradle wrapper files if any of these files don't exist in [directory].
   void injectGradleWrapperIfNeeded(Directory directory) {
     copyDirectorySync(
-      cache.getArtifactDirectory('gradle_wrapper'),
+      globals.cache.getArtifactDirectory('gradle_wrapper'),
       directory,
       shouldCopyFile: (File sourceFile, File destinationFile) {
         // Don't override the existing files in the project.
@@ -114,7 +113,7 @@
     );
     // Add the `gradle-wrapper.properties` file if it doesn't exist.
     final File propertiesFile = directory.childFile(
-        fs.path.join('gradle', 'wrapper', 'gradle-wrapper.properties'));
+        globals.fs.path.join('gradle', 'wrapper', 'gradle-wrapper.properties'));
     if (!propertiesFile.existsSync()) {
       final String gradleVersion = getGradleVersionForAndroidPlugin(directory);
       propertiesFile.writeAsStringSync('''
@@ -157,7 +156,7 @@
 bool _hasAllExecutableFlagSet(File executable) {
   final FileStat stat = executable.statSync();
   assert(stat.type != FileSystemEntityType.notFound);
-  printTrace('${executable.path} mode: ${stat.mode} ${stat.modeString()}.');
+  globals.printTrace('${executable.path} mode: ${stat.mode} ${stat.modeString()}.');
   return stat.mode & _kExecPermissionMask == _kExecPermissionMask;
 }
 
@@ -165,14 +164,14 @@
 bool _hasAnyExecutableFlagSet(File executable) {
   final FileStat stat = executable.statSync();
   assert(stat.type != FileSystemEntityType.notFound);
-  printTrace('${executable.path} mode: ${stat.mode} ${stat.modeString()}.');
+  globals.printTrace('${executable.path} mode: ${stat.mode} ${stat.modeString()}.');
   return stat.mode & _kExecPermissionMask != 0;
 }
 
 /// Gives execute permission to [executable] if it doesn't have it already.
 void _giveExecutePermissionIfNeeded(File executable) {
   if (!_hasAllExecutableFlagSet(executable)) {
-    printTrace('Trying to give execute permission to ${executable.path}.');
+    globals.printTrace('Trying to give execute permission to ${executable.path}.');
     os.makeExecutable(executable);
   }
 }
diff --git a/packages/flutter_tools/lib/src/aot.dart b/packages/flutter_tools/lib/src/aot.dart
index 6803581..bbf4c0e 100644
--- a/packages/flutter_tools/lib/src/aot.dart
+++ b/packages/flutter_tools/lib/src/aot.dart
@@ -8,7 +8,6 @@
 
 import 'base/build.dart';
 import 'base/common.dart';
-import 'base/file_system.dart';
 import 'base/io.dart';
 import 'base/logger.dart';
 import 'base/process.dart';
@@ -16,7 +15,7 @@
 import 'build_system/build_system.dart';
 import 'build_system/targets/dart.dart';
 import 'dart/package_map.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'ios/bitcode.dart';
 import 'project.dart';
 
@@ -61,8 +60,8 @@
 
     Status status;
     if (!quiet) {
-      final String typeName = artifacts.getEngineType(platform, buildMode);
-      status = logger.startProgress(
+      final String typeName = globals.artifacts.getEngineType(platform, buildMode);
+      status = globals.logger.startProgress(
         'Building AOT snapshot in ${getFriendlyModeName(buildMode)} mode ($typeName)...',
         timeout: timeoutConfiguration.slowOperation,
       );
@@ -91,7 +90,7 @@
         // Determine which iOS architectures to build for.
         final Map<DarwinArch, String> iosBuilds = <DarwinArch, String>{};
         for (DarwinArch arch in iosBuildArchs) {
-          iosBuilds[arch] = fs.path.join(outputPath, getNameForDarwinArch(arch));
+          iosBuilds[arch] = globals.fs.path.join(outputPath, getNameForDarwinArch(arch));
         }
 
         // Generate AOT snapshot and compile to arch-specific App.framework.
@@ -115,14 +114,14 @@
         // Merge arch-specific App.frameworks into a multi-arch App.framework.
         if ((await Future.wait<int>(exitCodes.values)).every((int buildExitCode) => buildExitCode == 0)) {
           final Iterable<String> dylibs = iosBuilds.values.map<String>(
-              (String outputDir) => fs.path.join(outputDir, 'App.framework', 'App'));
-          fs.directory(fs.path.join(outputPath, 'App.framework'))..createSync();
+              (String outputDir) => globals.fs.path.join(outputDir, 'App.framework', 'App'));
+          globals.fs.directory(globals.fs.path.join(outputPath, 'App.framework'))..createSync();
           await processUtils.run(
             <String>[
               'lipo',
               ...dylibs,
               '-create',
-              '-output', fs.path.join(outputPath, 'App.framework', 'App'),
+              '-output', globals.fs.path.join(outputPath, 'App.framework', 'App'),
             ],
             throwOnError: true,
           );
@@ -130,7 +129,7 @@
           status?.cancel();
           exitCodes.forEach((DarwinArch iosArch, Future<int> exitCodeFuture) async {
             final int buildExitCode = await exitCodeFuture;
-            printError('Snapshotting ($iosArch) exited with non-zero exit code: $buildExitCode');
+            globals.printError('Snapshotting ($iosArch) exited with non-zero exit code: $buildExitCode');
           });
         }
       } else {
@@ -152,7 +151,7 @@
     } on ProcessException catch (error) {
       // Catch the String exceptions thrown from the `runSync` methods below.
       status?.cancel();
-      printError(error.toString());
+      globals.printError(error.toString());
       return;
     }
     status?.stop();
@@ -161,11 +160,11 @@
       throwToolExit(null);
     }
 
-    final String builtMessage = 'Built to $outputPath${fs.path.separator}.';
+    final String builtMessage = 'Built to $outputPath${globals.fs.path.separator}.';
     if (quiet) {
-      printTrace(builtMessage);
+      globals.printTrace(builtMessage);
     } else {
-      printStatus(builtMessage);
+      globals.printStatus(builtMessage);
     }
     return;
   }
@@ -199,8 +198,8 @@
   }) async {
     Status status;
     if (!quiet) {
-      final String typeName = artifacts.getEngineType(targetPlatform, buildMode);
-      status = logger.startProgress(
+      final String typeName = globals.artifacts.getEngineType(targetPlatform, buildMode);
+      status = globals.logger.startProgress(
         'Building AOT snapshot in ${getFriendlyModeName(buildMode)} mode ($typeName)...',
         timeout: timeoutConfiguration.slowOperation,
       );
@@ -213,7 +212,7 @@
 
     final BuildResult result = await buildSystem.build(target, Environment(
       projectDir: flutterProject.directory,
-      outputDir: fs.directory(outputDir),
+      outputDir: globals.fs.directory(outputDir),
       buildDir: flutterProject.directory
         .childDirectory('.dart_tool')
         .childDirectory('flutter_build'),
@@ -226,7 +225,7 @@
     status?.stop();
     if (!result.success) {
       for (ExceptionMeasurement measurement in result.exceptions.values) {
-        printError('Target ${measurement.target} failed: ${measurement.exception}',
+        globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
             : null,
@@ -234,11 +233,11 @@
       }
       throwToolExit('Failed to build aot.');
     }
-    final String builtMessage = 'Built to $outputDir${fs.path.separator}.';
+    final String builtMessage = 'Built to $outputDir${globals.fs.path.separator}.';
     if (quiet) {
-      printTrace(builtMessage);
+      globals.printTrace(builtMessage);
     } else {
-      printStatus(builtMessage);
+      globals.printStatus(builtMessage);
     }
   }
 }
diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart
index 51af55d..27625a3 100644
--- a/packages/flutter_tools/lib/src/application_package.dart
+++ b/packages/flutter_tools/lib/src/application_package.dart
@@ -19,7 +19,7 @@
 import 'base/user_messages.dart';
 import 'build_info.dart';
 import 'fuchsia/application_package.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'ios/plist_parser.dart';
 import 'linux/application_package.dart';
 import 'macos/application_package.dart';
@@ -112,7 +112,7 @@
   factory AndroidApk.fromApk(File apk) {
     final String aaptPath = androidSdk?.latestVersion?.aaptPath;
     if (aaptPath == null) {
-      printError(userMessages.aaptNotFound);
+      globals.printError(userMessages.aaptNotFound);
       return null;
     }
 
@@ -129,19 +129,19 @@
         throwOnError: true,
       ).stdout.trim();
     } on ProcessException catch (error) {
-      printError('Failed to extract manifest from APK: $error.');
+      globals.printError('Failed to extract manifest from APK: $error.');
       return null;
     }
 
     final ApkManifestData data = ApkManifestData.parseFromXmlDump(apptStdout);
 
     if (data == null) {
-      printError('Unable to read manifest info from ${apk.path}.');
+      globals.printError('Unable to read manifest info from ${apk.path}.');
       return null;
     }
 
     if (data.packageName == null || data.launchableActivityName == null) {
-      printError('Unable to read manifest info from ${apk.path}.');
+      globals.printError('Unable to read manifest info from ${apk.path}.');
       return null;
     }
 
@@ -177,14 +177,14 @@
       // command will grab a new AndroidApk after building, to get the updated
       // IDs.
     } else {
-      apkFile = fs.file(fs.path.join(getAndroidBuildDirectory(), 'app.apk'));
+      apkFile = globals.fs.file(globals.fs.path.join(getAndroidBuildDirectory(), 'app.apk'));
     }
 
     final File manifest = androidProject.appManifestFile;
 
     if (!manifest.existsSync()) {
-      printError('AndroidManifest.xml could not be found.');
-      printError('Please check ${manifest.path} for errors.');
+      globals.printError('AndroidManifest.xml could not be found.');
+      globals.printError('Please check ${manifest.path} for errors.');
       return null;
     }
 
@@ -195,19 +195,19 @@
     } on xml.XmlParserException catch (exception) {
       String manifestLocation;
       if (androidProject.isUsingGradle) {
-        manifestLocation = fs.path.join(androidProject.hostAppGradleRoot.path, 'app', 'src', 'main', 'AndroidManifest.xml');
+        manifestLocation = globals.fs.path.join(androidProject.hostAppGradleRoot.path, 'app', 'src', 'main', 'AndroidManifest.xml');
       } else {
-        manifestLocation = fs.path.join(androidProject.hostAppGradleRoot.path, 'AndroidManifest.xml');
+        manifestLocation = globals.fs.path.join(androidProject.hostAppGradleRoot.path, 'AndroidManifest.xml');
       }
-      printError('AndroidManifest.xml is not a valid XML document.');
-      printError('Please check $manifestLocation for errors.');
+      globals.printError('AndroidManifest.xml is not a valid XML document.');
+      globals.printError('Please check $manifestLocation for errors.');
       throwToolExit('XML Parser error message: ${exception.toString()}');
     }
 
     final Iterable<xml.XmlElement> manifests = document.findElements('manifest');
     if (manifests.isEmpty) {
-      printError('AndroidManifest.xml has no manifest element.');
-      printError('Please check ${manifest.path} for errors.');
+      globals.printError('AndroidManifest.xml has no manifest element.');
+      globals.printError('Please check ${manifest.path} for errors.');
       return null;
     }
     final String packageId = manifests.first.getAttribute('package');
@@ -243,8 +243,8 @@
     }
 
     if (packageId == null || launchActivity == null) {
-      printError('package identifier or launch activity not found.');
-      printError('Please check ${manifest.path} for errors.');
+      globals.printError('package identifier or launch activity not found.');
+      globals.printError('Please check ${manifest.path} for errors.');
       return null;
     }
 
@@ -271,46 +271,46 @@
 
   /// Creates a new IOSApp from an existing app bundle or IPA.
   factory IOSApp.fromPrebuiltApp(FileSystemEntity applicationBinary) {
-    final FileSystemEntityType entityType = fs.typeSync(applicationBinary.path);
+    final FileSystemEntityType entityType = globals.fs.typeSync(applicationBinary.path);
     if (entityType == FileSystemEntityType.notFound) {
-      printError(
+      globals.printError(
           'File "${applicationBinary.path}" does not exist. Use an app bundle or an ipa.');
       return null;
     }
     Directory bundleDir;
     if (entityType == FileSystemEntityType.directory) {
-      final Directory directory = fs.directory(applicationBinary);
+      final Directory directory = globals.fs.directory(applicationBinary);
       if (!_isBundleDirectory(directory)) {
-        printError('Folder "${applicationBinary.path}" is not an app bundle.');
+        globals.printError('Folder "${applicationBinary.path}" is not an app bundle.');
         return null;
       }
-      bundleDir = fs.directory(applicationBinary);
+      bundleDir = globals.fs.directory(applicationBinary);
     } else {
       // Try to unpack as an ipa.
-      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_app.');
+      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_app.');
       addShutdownHook(() async {
         await tempDir.delete(recursive: true);
       }, ShutdownStage.STILL_RECORDING);
-      os.unzip(fs.file(applicationBinary), tempDir);
-      final Directory payloadDir = fs.directory(
-        fs.path.join(tempDir.path, 'Payload'),
+      os.unzip(globals.fs.file(applicationBinary), tempDir);
+      final Directory payloadDir = globals.fs.directory(
+        globals.fs.path.join(tempDir.path, 'Payload'),
       );
       if (!payloadDir.existsSync()) {
-        printError(
+        globals.printError(
             'Invalid prebuilt iOS ipa. Does not contain a "Payload" directory.');
         return null;
       }
       try {
         bundleDir = payloadDir.listSync().whereType<Directory>().singleWhere(_isBundleDirectory);
       } on StateError {
-        printError(
+        globals.printError(
             'Invalid prebuilt iOS ipa. Does not contain a single app bundle.');
         return null;
       }
     }
-    final String plistPath = fs.path.join(bundleDir.path, 'Info.plist');
-    if (!fs.file(plistPath).existsSync()) {
-      printError('Invalid prebuilt iOS app. Does not contain Info.plist.');
+    final String plistPath = globals.fs.path.join(bundleDir.path, 'Info.plist');
+    if (!globals.fs.file(plistPath).existsSync()) {
+      globals.printError('Invalid prebuilt iOS app. Does not contain Info.plist.');
       return null;
     }
     final String id = PlistParser.instance.getValueFromFile(
@@ -318,13 +318,13 @@
       PlistParser.kCFBundleIdentifierKey,
     );
     if (id == null) {
-      printError('Invalid prebuilt iOS app. Info.plist does not contain bundle identifier');
+      globals.printError('Invalid prebuilt iOS app. Info.plist does not contain bundle identifier');
       return null;
     }
 
     return PrebuiltIOSApp(
       bundleDir: bundleDir,
-      bundleName: fs.path.basename(bundleDir.path),
+      bundleName: globals.fs.path.basename(bundleDir.path),
       projectBundleId: id,
     );
   }
@@ -339,11 +339,11 @@
       return null;
     }
     if (!project.xcodeProject.existsSync()) {
-      printError('Expected ios/Runner.xcodeproj but this file is missing.');
+      globals.printError('Expected ios/Runner.xcodeproj but this file is missing.');
       return null;
     }
     if (!project.xcodeProjectInfoFile.existsSync()) {
-      printError('Expected ios/Runner.xcodeproj/project.pbxproj but this file is missing.');
+      globals.printError('Expected ios/Runner.xcodeproj/project.pbxproj but this file is missing.');
       return null;
     }
     return BuildableIOSApp.fromProject(project);
@@ -378,7 +378,7 @@
   String get deviceBundlePath => _buildAppPath('iphoneos');
 
   String _buildAppPath(String type) {
-    return fs.path.join(getIosBuildDirectory(), type, name);
+    return globals.fs.path.join(getIosBuildDirectory(), type, name);
   }
 }
 
@@ -598,7 +598,7 @@
     final String packageName = package.value.substring(1, package.value.indexOf('" '));
 
     if (launchActivity == null) {
-      printError('Error running $packageName. Default activity not found');
+      globals.printError('Error running $packageName. Default activity not found');
       return null;
     }
 
@@ -610,16 +610,16 @@
     // Example format: (type 0x10)0x1
     final _Attribute versionCodeAttr = manifest.firstAttribute('android:versionCode');
     if (versionCodeAttr == null) {
-      printError('Error running $packageName. Manifest versionCode not found');
+      globals.printError('Error running $packageName. Manifest versionCode not found');
       return null;
     }
     if (!versionCodeAttr.value.startsWith('(type 0x10)')) {
-      printError('Error running $packageName. Manifest versionCode invalid');
+      globals.printError('Error running $packageName. Manifest versionCode invalid');
       return null;
     }
     final int versionCode = int.tryParse(versionCodeAttr.value.substring(11));
     if (versionCode == null) {
-      printError('Error running $packageName. Manifest versionCode invalid');
+      globals.printError('Error running $packageName. Manifest versionCode invalid');
       return null;
     }
 
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart
index 5f11a8c..60f6ef6 100644
--- a/packages/flutter_tools/lib/src/artifacts.dart
+++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -4,14 +4,11 @@
 
 import 'package:meta/meta.dart';
 
-import 'base/context.dart';
 import 'base/file_system.dart';
-import 'base/platform.dart';
-import 'base/process_manager.dart';
 import 'base/utils.dart';
 import 'build_info.dart';
 import 'dart/sdk.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 
 enum Artifact {
   /// The tool which compiles a dart kernel file into native code.
@@ -158,8 +155,6 @@
 
 // Manages the engine artifacts of Flutter.
 abstract class Artifacts {
-  static Artifacts get instance => context.get<Artifacts>();
-
   static LocalEngineArtifacts getLocalEngine(String engineSrcPath, EngineBuildPaths engineBuildPaths) {
     return LocalEngineArtifacts(engineSrcPath, engineBuildPaths.targetEngine, engineBuildPaths.hostEngine);
   }
@@ -173,13 +168,13 @@
 }
 
 TargetPlatform get _currentHostPlatform {
-  if (platform.isMacOS) {
+  if (globals.platform.isMacOS) {
     return TargetPlatform.darwin_x64;
   }
-  if (platform.isLinux) {
+  if (globals.platform.isLinux) {
     return TargetPlatform.linux_x64;
   }
-  if (platform.isWindows) {
+  if (globals.platform.isWindows) {
     return TargetPlatform.windows_x64;
   }
   throw UnimplementedError('Host OS not supported.');
@@ -214,7 +209,7 @@
 
   @override
   String getEngineType(TargetPlatform platform, [ BuildMode mode ]) {
-    return fs.path.basename(_getEngineArtifactsPath(platform, mode));
+    return globals.fs.path.basename(_getEngineArtifactsPath(platform, mode));
   }
 
   String _getDarwinArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) {
@@ -222,7 +217,7 @@
     // and not the gen_snapshot for darwin as a target platform.
     if (platform != null && artifact == Artifact.genSnapshot) {
       final String engineDir = _getEngineArtifactsPath(platform, mode);
-      return fs.path.join(engineDir, _artifactToFileName(artifact));
+      return globals.fs.path.join(engineDir, _artifactToFileName(artifact));
     }
     return _getHostArtifactPath(artifact, platform ?? _currentHostPlatform, mode);
   }
@@ -232,11 +227,11 @@
     switch (artifact) {
       case Artifact.frontendServerSnapshotForEngineDartSdk:
         assert(mode != BuildMode.debug, 'Artifact $artifact only available in non-debug mode.');
-        return fs.path.join(engineDir, _artifactToFileName(artifact));
+        return globals.fs.path.join(engineDir, _artifactToFileName(artifact));
       case Artifact.genSnapshot:
         assert(mode != BuildMode.debug, 'Artifact $artifact only available in non-debug mode.');
         final String hostPlatform = getNameForHostPlatform(getCurrentHostPlatform());
-        return fs.path.join(engineDir, hostPlatform, _artifactToFileName(artifact));
+        return globals.fs.path.join(engineDir, hostPlatform, _artifactToFileName(artifact));
       default:
         return _getHostArtifactPath(artifact, platform, mode);
     }
@@ -250,31 +245,31 @@
       case Artifact.frontendServerSnapshotForEngineDartSdk:
         final String artifactFileName = _artifactToFileName(artifact);
         final String engineDir = _getEngineArtifactsPath(platform, mode);
-        return fs.path.join(engineDir, artifactFileName);
+        return globals.fs.path.join(engineDir, artifactFileName);
       case Artifact.ideviceId:
       case Artifact.ideviceinfo:
       case Artifact.idevicescreenshot:
       case Artifact.idevicesyslog:
       case Artifact.idevicename:
         final String artifactFileName = _artifactToFileName(artifact);
-        return cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path;
       case Artifact.iosDeploy:
         final String artifactFileName = _artifactToFileName(artifact);
-        return cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path;
       case Artifact.ideviceinstaller:
         final String artifactFileName = _artifactToFileName(artifact);
-        return cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path;
       case Artifact.iproxy:
         final String artifactFileName = _artifactToFileName(artifact);
-        return cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path;
       default:
         return _getHostArtifactPath(artifact, platform, mode);
     }
   }
 
   String _getFuchsiaArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) {
-    final String root = fs.path.join(
-      cache.getArtifactDirectory('flutter_runner').path,
+    final String root = globals.fs.path.join(
+      globals.cache.getArtifactDirectory('flutter_runner').path,
       'flutter',
       fuchsiaArchForTargetPlatform(platform),
       mode.isRelease ? 'release' : mode.toString(),
@@ -283,32 +278,32 @@
     switch (artifact) {
       case Artifact.genSnapshot:
         final String genSnapshot = mode.isRelease ? 'gen_snapshot_product' : 'gen_snapshot';
-        return fs.path.join(root, runtime, 'dart_binaries', genSnapshot);
+        return globals.fs.path.join(root, runtime, 'dart_binaries', genSnapshot);
       case Artifact.flutterPatchedSdkPath:
         const String artifactFileName = 'flutter_runner_patched_sdk';
-        return fs.path.join(root, runtime, artifactFileName);
+        return globals.fs.path.join(root, runtime, artifactFileName);
       case Artifact.platformKernelDill:
         final String artifactFileName = _artifactToFileName(artifact, platform, mode);
-        return fs.path.join(root, runtime, 'flutter_runner_patched_sdk', artifactFileName);
+        return globals.fs.path.join(root, runtime, 'flutter_runner_patched_sdk', artifactFileName);
       case Artifact.fuchsiaKernelCompiler:
         final String artifactFileName = _artifactToFileName(artifact, platform, mode);
-        return fs.path.join(root, runtime, 'dart_binaries', artifactFileName);
+        return globals.fs.path.join(root, runtime, 'dart_binaries', artifactFileName);
       case Artifact.fuchsiaFlutterRunner:
         final String artifactFileName = _artifactToFileName(artifact, platform, mode);
-        return fs.path.join(root, runtime, artifactFileName);
+        return globals.fs.path.join(root, runtime, artifactFileName);
       default:
         return _getHostArtifactPath(artifact, platform, mode);
     }
   }
 
   String _getFlutterPatchedSdkPath(BuildMode mode) {
-    final String engineArtifactsPath = cache.getArtifactDirectory('engine').path;
-    return fs.path.join(engineArtifactsPath, 'common',
+    final String engineArtifactsPath = globals.cache.getArtifactDirectory('engine').path;
+    return globals.fs.path.join(engineArtifactsPath, 'common',
         mode == BuildMode.release ? 'flutter_patched_sdk_product' : 'flutter_patched_sdk');
   }
 
   String _getFlutterWebSdkPath() {
-    return cache.getWebSdkDirectory().path;
+    return globals.cache.getWebSdkDirectory().path;
   }
 
   String _getHostArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) {
@@ -322,29 +317,29 @@
       case Artifact.vmSnapshotData:
       case Artifact.isolateSnapshotData:
       case Artifact.frontendServerSnapshotForEngineDartSdk:
-        final String engineArtifactsPath = cache.getArtifactDirectory('engine').path;
+        final String engineArtifactsPath = globals.cache.getArtifactDirectory('engine').path;
         final String platformDirName = getNameForTargetPlatform(platform);
-        return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode));
+        return globals.fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode));
       case Artifact.engineDartSdkPath:
         return dartSdkPath;
       case Artifact.engineDartBinary:
-        return fs.path.join(dartSdkPath, 'bin', _artifactToFileName(artifact, platform));
+        return globals.fs.path.join(dartSdkPath, 'bin', _artifactToFileName(artifact, platform));
       case Artifact.platformKernelDill:
-        return fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact));
+        return globals.fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact));
       case Artifact.platformLibrariesJson:
-        return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact));
+        return globals.fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact));
       case Artifact.flutterPatchedSdkPath:
         return _getFlutterPatchedSdkPath(mode);
       case Artifact.flutterWebSdk:
         return _getFlutterWebSdkPath();
       case Artifact.webPlatformKernelDill:
-        return fs.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact));
+        return globals.fs.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact));
       case Artifact.dart2jsSnapshot:
-        return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
+        return globals.fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
       case Artifact.dartdevcSnapshot:
-        return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
+        return globals.fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
       case Artifact.kernelWorkerSnapshot:
-        return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
+        return globals.fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
       case Artifact.flutterMacOSFramework:
       case Artifact.linuxDesktopPath:
       case Artifact.windowsDesktopPath:
@@ -356,11 +351,11 @@
         if (mode == BuildMode.profile || mode == BuildMode.release) {
           platformDirName = '$platformDirName-${getNameForBuildMode(mode)}';
         }
-        final String engineArtifactsPath = cache.getArtifactDirectory('engine').path;
-        return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode));
+        final String engineArtifactsPath = globals.cache.getArtifactDirectory('engine').path;
+        return globals.fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode));
       case Artifact.skyEnginePath:
-        final Directory dartPackageDirectory = cache.getCacheDir('pkg');
-        return fs.path.join(dartPackageDirectory.path,  _artifactToFileName(artifact));
+        final Directory dartPackageDirectory = globals.cache.getCacheDir('pkg');
+        return globals.fs.path.join(dartPackageDirectory.path,  _artifactToFileName(artifact));
       default:
         assert(false, 'Artifact $artifact not available for platform $platform.');
         return null;
@@ -368,7 +363,7 @@
   }
 
   String _getEngineArtifactsPath(TargetPlatform platform, [ BuildMode mode ]) {
-    final String engineDir = cache.getArtifactDirectory('engine').path;
+    final String engineDir = globals.cache.getArtifactDirectory('engine').path;
     final String platformName = getNameForTargetPlatform(platform);
     switch (platform) {
       case TargetPlatform.linux_x64:
@@ -378,16 +373,16 @@
         // under a separate directory from the host artifacts.
         // https://github.com/flutter/flutter/issues/38935
         if (mode == BuildMode.debug || mode == null) {
-          return fs.path.join(engineDir, platformName);
+          return globals.fs.path.join(engineDir, platformName);
         }
         final String suffix = mode != BuildMode.debug ? '-${snakeCase(getModeName(mode), '-')}' : '';
-        return fs.path.join(engineDir, platformName + suffix);
+        return globals.fs.path.join(engineDir, platformName + suffix);
       case TargetPlatform.fuchsia_arm64:
       case TargetPlatform.fuchsia_x64:
       case TargetPlatform.tester:
       case TargetPlatform.web_javascript:
         assert(mode == null, 'Platform $platform does not support different build modes.');
-        return fs.path.join(engineDir, platformName);
+        return globals.fs.path.join(engineDir, platformName);
       case TargetPlatform.ios:
       case TargetPlatform.android_arm:
       case TargetPlatform.android_arm64:
@@ -395,7 +390,7 @@
       case TargetPlatform.android_x86:
         assert(mode != null, 'Need to specify a build mode for platform $platform.');
         final String suffix = mode != BuildMode.debug ? '-${snakeCase(getModeName(mode), '-')}' : '';
-        return fs.path.join(engineDir, platformName + suffix);
+        return globals.fs.path.join(engineDir, platformName + suffix);
       case TargetPlatform.android:
         assert(false, 'cannot use TargetPlatform.android to look up artifacts');
         return null;
@@ -419,79 +414,79 @@
     final String artifactFileName = _artifactToFileName(artifact, platform, mode);
     switch (artifact) {
       case Artifact.snapshotDart:
-        return fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', artifactFileName);
+        return globals.fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', artifactFileName);
       case Artifact.genSnapshot:
         return _genSnapshotPath();
       case Artifact.flutterTester:
         return _flutterTesterPath(platform);
       case Artifact.isolateSnapshotData:
       case Artifact.vmSnapshotData:
-        return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', artifactFileName);
+        return globals.fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', artifactFileName);
       case Artifact.platformKernelDill:
         if (platform == TargetPlatform.fuchsia_x64 || platform == TargetPlatform.fuchsia_arm64) {
-          return fs.path.join(engineOutPath, 'flutter_runner_patched_sdk', artifactFileName);
+          return globals.fs.path.join(engineOutPath, 'flutter_runner_patched_sdk', artifactFileName);
         }
-        return fs.path.join(_getFlutterPatchedSdkPath(mode), artifactFileName);
+        return globals.fs.path.join(_getFlutterPatchedSdkPath(mode), artifactFileName);
       case Artifact.platformLibrariesJson:
-        return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', artifactFileName);
+        return globals.fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', artifactFileName);
       case Artifact.flutterFramework:
-        return fs.path.join(engineOutPath, artifactFileName);
+        return globals.fs.path.join(engineOutPath, artifactFileName);
       case Artifact.flutterMacOSFramework:
-        return fs.path.join(engineOutPath, artifactFileName);
+        return globals.fs.path.join(engineOutPath, artifactFileName);
       case Artifact.flutterPatchedSdkPath:
         // When using local engine always use [BuildMode.debug] regardless of
         // what was specified in [mode] argument because local engine will
         // have only one flutter_patched_sdk in standard location, that
         // is happen to be what debug(non-release) mode is using.
         if (platform == TargetPlatform.fuchsia_x64 || platform == TargetPlatform.fuchsia_arm64) {
-          return fs.path.join(engineOutPath, 'flutter_runner_patched_sdk');
+          return globals.fs.path.join(engineOutPath, 'flutter_runner_patched_sdk');
         }
         return _getFlutterPatchedSdkPath(BuildMode.debug);
       case Artifact.flutterWebSdk:
         return _getFlutterWebSdkPath();
       case Artifact.frontendServerSnapshotForEngineDartSdk:
-        return fs.path.join(_hostEngineOutPath, 'gen', artifactFileName);
+        return globals.fs.path.join(_hostEngineOutPath, 'gen', artifactFileName);
       case Artifact.engineDartSdkPath:
-        return fs.path.join(_hostEngineOutPath, 'dart-sdk');
+        return globals.fs.path.join(_hostEngineOutPath, 'dart-sdk');
       case Artifact.engineDartBinary:
-        return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', artifactFileName);
+        return globals.fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', artifactFileName);
       case Artifact.dart2jsSnapshot:
-        return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
+        return globals.fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
       case Artifact.dartdevcSnapshot:
-        return fs.path.join(dartSdkPath, 'bin', 'snapshots', artifactFileName);
+        return globals.fs.path.join(dartSdkPath, 'bin', 'snapshots', artifactFileName);
       case Artifact.kernelWorkerSnapshot:
-        return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
+        return globals.fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
       case Artifact.ideviceId:
       case Artifact.ideviceinfo:
       case Artifact.idevicename:
       case Artifact.idevicescreenshot:
       case Artifact.idevicesyslog:
-        return cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName).path;
       case Artifact.ideviceinstaller:
-        return cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('ideviceinstaller').childFile(artifactFileName).path;
       case Artifact.iosDeploy:
-        return cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName).path;
       case Artifact.iproxy:
-        return cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path;
+        return globals.cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName).path;
       case Artifact.linuxDesktopPath:
-        return fs.path.join(_hostEngineOutPath, artifactFileName);
+        return globals.fs.path.join(_hostEngineOutPath, artifactFileName);
       case Artifact.windowsDesktopPath:
-        return fs.path.join(_hostEngineOutPath, artifactFileName);
+        return globals.fs.path.join(_hostEngineOutPath, artifactFileName);
       case Artifact.skyEnginePath:
-        return fs.path.join(_hostEngineOutPath, 'gen', 'dart-pkg', artifactFileName);
+        return globals.fs.path.join(_hostEngineOutPath, 'gen', 'dart-pkg', artifactFileName);
       case Artifact.flutterMacOSPodspec:
-        return fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact));
+        return globals.fs.path.join(_hostEngineOutPath, _artifactToFileName(artifact));
       case Artifact.webPlatformKernelDill:
-        return fs.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact));
+        return globals.fs.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact));
       case Artifact.fuchsiaKernelCompiler:
         final String hostPlatform = getNameForHostPlatform(getCurrentHostPlatform());
         final String modeName = mode.isRelease ? 'release' : mode.toString();
         final String dartBinaries = 'dart_binaries-$modeName-$hostPlatform';
-        return fs.path.join(engineOutPath, 'host_bundle', dartBinaries, 'kernel_compiler.dart.snapshot');
+        return globals.fs.path.join(engineOutPath, 'host_bundle', dartBinaries, 'kernel_compiler.dart.snapshot');
       case Artifact.fuchsiaFlutterRunner:
         final String jitOrAot = mode.isJit ? '_jit' : '_aot';
         final String productOrNo = mode.isRelease ? '_product' : '';
-        return fs.path.join(engineOutPath, 'flutter$jitOrAot${productOrNo}_runner-0.far');
+        return globals.fs.path.join(engineOutPath, 'flutter$jitOrAot${productOrNo}_runner-0.far');
     }
     assert(false, 'Invalid artifact $artifact.');
     return null;
@@ -499,24 +494,24 @@
 
   @override
   String getEngineType(TargetPlatform platform, [ BuildMode mode ]) {
-    return fs.path.basename(engineOutPath);
+    return globals.fs.path.basename(engineOutPath);
   }
 
   String _getFlutterPatchedSdkPath(BuildMode buildMode) {
-    return fs.path.join(engineOutPath,
+    return globals.fs.path.join(engineOutPath,
         buildMode == BuildMode.release ? 'flutter_patched_sdk_product' : 'flutter_patched_sdk');
   }
 
   String _getFlutterWebSdkPath() {
-    return fs.path.join(engineOutPath, 'flutter_web_sdk');
+    return globals.fs.path.join(engineOutPath, 'flutter_web_sdk');
   }
 
   String _genSnapshotPath() {
     const List<String> clangDirs = <String>['.', 'clang_x64', 'clang_x86', 'clang_i386'];
     final String genSnapshotName = _artifactToFileName(Artifact.genSnapshot);
     for (String clangDir in clangDirs) {
-      final String genSnapshotPath = fs.path.join(engineOutPath, clangDir, genSnapshotName);
-      if (processManager.canRun(genSnapshotPath)) {
+      final String genSnapshotPath = globals.fs.path.join(engineOutPath, clangDir, genSnapshotName);
+      if (globals.processManager.canRun(genSnapshotPath)) {
         return genSnapshotPath;
       }
     }
@@ -525,11 +520,11 @@
 
   String _flutterTesterPath(TargetPlatform platform) {
     if (getCurrentHostPlatform() == HostPlatform.linux_x64) {
-      return fs.path.join(engineOutPath, _artifactToFileName(Artifact.flutterTester));
+      return globals.fs.path.join(engineOutPath, _artifactToFileName(Artifact.flutterTester));
     } else if (getCurrentHostPlatform() == HostPlatform.darwin_x64) {
-      return fs.path.join(engineOutPath, 'flutter_tester');
+      return globals.fs.path.join(engineOutPath, 'flutter_tester');
     } else if (getCurrentHostPlatform() == HostPlatform.windows_x64) {
-      return fs.path.join(engineOutPath, 'flutter_tester.exe');
+      return globals.fs.path.join(engineOutPath, 'flutter_tester.exe');
     }
     throw Exception('Unsupported platform $platform.');
   }
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index d00a3de..3c151c9 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -8,7 +8,6 @@
 
 import 'base/context.dart';
 import 'base/file_system.dart';
-import 'base/platform.dart';
 import 'base/utils.dart';
 import 'build_info.dart';
 import 'cache.dart';
@@ -16,7 +15,7 @@
 import 'dart/package_map.dart';
 import 'devfs.dart';
 import 'flutter_manifest.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 
 const AssetBundleFactory _kManifestFactory = _ManifestAssetBundleFactory();
 
@@ -85,7 +84,7 @@
       return true;
     }
 
-    final FileStat stat = fs.file(manifestPath).statSync();
+    final FileStat stat = globals.fs.file(manifestPath).statSync();
     if (stat.type == FileSystemEntityType.notFound) {
       return true;
     }
@@ -117,13 +116,13 @@
     bool reportLicensedPackages = false,
   }) async {
     assetDirPath ??= getAssetBuildDirectory();
-    packagesPath ??= fs.path.absolute(PackageMap.globalPackagesPath);
+    packagesPath ??= globals.fs.path.absolute(PackageMap.globalPackagesPath);
     FlutterManifest flutterManifest;
     try {
       flutterManifest = FlutterManifest.createFromPath(manifestPath);
     } catch (e) {
-      printStatus('Error detected in pubspec.yaml:', emphasis: true);
-      printError('$e');
+      globals.printStatus('Error detected in pubspec.yaml:', emphasis: true);
+      globals.printError('$e');
       return 1;
     }
     if (flutterManifest == null) {
@@ -139,7 +138,7 @@
       return 0;
     }
 
-    final String assetBasePath = fs.path.dirname(fs.path.absolute(manifestPath));
+    final String assetBasePath = globals.fs.path.dirname(globals.fs.path.absolute(manifestPath));
 
     final PackageMap packageMap = PackageMap(packagesPath);
     final List<Uri> wildcardDirectories = <Uri>[];
@@ -170,7 +169,7 @@
     for (String packageName in packageMap.map.keys) {
       final Uri package = packageMap.map[packageName];
       if (package != null && package.scheme == 'file') {
-        final String packageManifestPath = fs.path.fromUri(package.resolve('../pubspec.yaml'));
+        final String packageManifestPath = globals.fs.path.fromUri(package.resolve('../pubspec.yaml'));
         final FlutterManifest packageFlutterManifest = FlutterManifest.createFromPath(packageManifestPath);
         if (packageFlutterManifest == null) {
           continue;
@@ -179,7 +178,7 @@
         if (packageFlutterManifest.appName == flutterManifest.appName) {
           continue;
         }
-        final String packageBasePath = fs.path.dirname(packageManifestPath);
+        final String packageBasePath = globals.fs.path.dirname(packageManifestPath);
 
         final Map<_Asset, List<_Asset>> packageAssets = _parseAssets(
           packageMap,
@@ -207,8 +206,8 @@
     // asset in entries.
     for (_Asset asset in assetVariants.keys) {
       if (!asset.assetFileExists && assetVariants[asset].isEmpty) {
-        printStatus('Error detected in pubspec.yaml:', emphasis: true);
-        printError('No file or variants found for $asset.\n');
+        globals.printStatus('Error detected in pubspec.yaml:', emphasis: true);
+        globals.printError('No file or variants found for $asset.\n');
         return 1;
       }
       // The file name for an asset's "main" entry is whatever appears in
@@ -238,7 +237,7 @@
 
     // Update wildcard directories we we can detect changes in them.
     for (Uri uri in wildcardDirectories) {
-      _wildcardDirectories[uri] ??= fs.directory(uri);
+      _wildcardDirectories[uri] ??= globals.fs.directory(uri);
     }
 
     entries[_assetManifestJson] = _createAssetManifest(assetVariants);
@@ -265,7 +264,7 @@
   final Uri entryUri;
 
   File get assetFile {
-    return fs.file(fs.path.join(baseDir, fs.path.fromUri(relativeUri)));
+    return globals.fs.file(globals.fs.path.join(baseDir, globals.fs.path.fromUri(relativeUri)));
   }
 
   bool get assetFileExists => assetFile.existsSync();
@@ -306,10 +305,10 @@
 }
 
 Map<String, dynamic> _readMaterialFontsManifest() {
-  final String fontsPath = fs.path.join(fs.path.absolute(Cache.flutterRoot),
+  final String fontsPath = globals.fs.path.join(globals.fs.path.absolute(Cache.flutterRoot),
       'packages', 'flutter_tools', 'schema', 'material_fonts.yaml');
 
-  return castStringKeyedMap(loadYaml(fs.file(fontsPath).readAsStringSync()));
+  return castStringKeyedMap(loadYaml(globals.fs.file(fontsPath).readAsStringSync()));
 }
 
 final Map<String, dynamic> _materialFontsManifest = _readMaterialFontsManifest();
@@ -324,9 +323,9 @@
 
   for (Map<String, dynamic> family in _getMaterialFonts(fontSet)) {
     for (Map<dynamic, dynamic> font in family['fonts']) {
-      final Uri entryUri = fs.path.toUri(font['asset'] as String);
+      final Uri entryUri = globals.fs.path.toUri(font['asset'] as String);
       result.add(_Asset(
-        baseDir: fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'artifacts', 'material_fonts'),
+        baseDir: globals.fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'artifacts', 'material_fonts'),
         relativeUri: Uri(path: entryUri.pathSegments.last),
         entryUri: entryUri,
       ));
@@ -364,7 +363,7 @@
     if (package == null || package.scheme != 'file') {
       continue;
     }
-    final File file = fs.file(package.resolve('../LICENSE'));
+    final File file = globals.fs.file(package.resolve('../LICENSE'));
     if (!file.existsSync()) {
       continue;
     }
@@ -392,8 +391,8 @@
 
   if (reportPackages) {
     final List<String> allPackagesList = allPackages.toList()..sort();
-    printStatus('Licenses were found for the following packages:');
-    printStatus(allPackagesList.join(', '));
+    globals.printStatus('Licenses were found for the following packages:');
+    globals.printStatus(allPackagesList.join(', '));
   }
 
   final List<String> combinedLicensesList = packageLicenses.keys.map<String>(
@@ -464,7 +463,7 @@
     for (FontAsset fontAsset in font.fontAssets) {
       final Uri assetUri = fontAsset.assetUri;
       if (assetUri.pathSegments.first == 'packages' &&
-          !fs.isFileSync(fs.path.fromUri(packageMap.map[packageName].resolve('../${assetUri.path}')))) {
+          !globals.fs.isFileSync(globals.fs.path.fromUri(packageMap.map[packageName].resolve('../${assetUri.path}')))) {
         packageFontAssets.add(FontAsset(
           fontAsset.assetUri,
           weight: fontAsset.weight,
@@ -498,33 +497,33 @@
 // variantsFor('assets/bar') => []
 class _AssetDirectoryCache {
   _AssetDirectoryCache(Iterable<String> excluded) {
-    _excluded = excluded.map<String>((String path) => fs.path.absolute(path) + fs.path.separator);
+    _excluded = excluded.map<String>((String path) => globals.fs.path.absolute(path) + globals.fs.path.separator);
   }
 
   Iterable<String> _excluded;
   final Map<String, Map<String, List<String>>> _cache = <String, Map<String, List<String>>>{};
 
   List<String> variantsFor(String assetPath) {
-    final String assetName = fs.path.basename(assetPath);
-    final String directory = fs.path.dirname(assetPath);
+    final String assetName = globals.fs.path.basename(assetPath);
+    final String directory = globals.fs.path.dirname(assetPath);
 
-    if (!fs.directory(directory).existsSync()) {
+    if (!globals.fs.directory(directory).existsSync()) {
       return const <String>[];
     }
 
     if (_cache[directory] == null) {
       final List<String> paths = <String>[];
-      for (FileSystemEntity entity in fs.directory(directory).listSync(recursive: true)) {
+      for (FileSystemEntity entity in globals.fs.directory(directory).listSync(recursive: true)) {
         final String path = entity.path;
-        if (fs.isFileSync(path) && !_excluded.any((String exclude) => path.startsWith(exclude))) {
+        if (globals.fs.isFileSync(path) && !_excluded.any((String exclude) => path.startsWith(exclude))) {
           paths.add(path);
         }
       }
 
       final Map<String, List<String>> variants = <String, List<String>>{};
       for (String path in paths) {
-        final String variantName = fs.path.basename(path);
-        if (directory == fs.path.dirname(path)) {
+        final String variantName = globals.fs.path.basename(path);
+        if (directory == globals.fs.path.dirname(path)) {
           continue;
         }
         variants[variantName] ??= <String>[];
@@ -596,7 +595,7 @@
         packageName,
       );
       if (!baseAsset.assetFileExists) {
-        printError('Error: unable to locate asset entry in pubspec.yaml: "${fontAsset.assetUri}".');
+        globals.printError('Error: unable to locate asset entry in pubspec.yaml: "${fontAsset.assetUri}".');
         return null;
       }
 
@@ -617,21 +616,21 @@
   List<String> excludeDirs = const <String>[],
   String packageName,
 }) {
-  final String directoryPath = fs.path.join(
-      assetBase, assetUri.toFilePath(windows: platform.isWindows));
+  final String directoryPath = globals.fs.path.join(
+      assetBase, assetUri.toFilePath(windows: globals.platform.isWindows));
 
-  if (!fs.directory(directoryPath).existsSync()) {
-    printError('Error: unable to find directory entry in pubspec.yaml: $directoryPath');
+  if (!globals.fs.directory(directoryPath).existsSync()) {
+    globals.printError('Error: unable to find directory entry in pubspec.yaml: $directoryPath');
     return;
   }
 
-  final List<FileSystemEntity> lister = fs.directory(directoryPath).listSync();
+  final List<FileSystemEntity> lister = globals.fs.directory(directoryPath).listSync();
 
   for (FileSystemEntity entity in lister) {
     if (entity is File) {
-      final String relativePath = fs.path.relative(entity.path, from: assetBase);
+      final String relativePath = globals.fs.path.relative(entity.path, from: assetBase);
 
-      final Uri uri = Uri.file(relativePath, windows: platform.isWindows);
+      final Uri uri = Uri.file(relativePath, windows: globals.platform.isWindows);
 
       _parseAssetFromFile(packageMap, flutterManifest, assetBase, cache, result,
           uri, packageName: packageName);
@@ -657,8 +656,8 @@
   );
   final List<_Asset> variants = <_Asset>[];
   for (String path in cache.variantsFor(asset.assetFile.path)) {
-    final String relativePath = fs.path.relative(path, from: asset.baseDir);
-    final Uri relativeUri = fs.path.toUri(relativePath);
+    final String relativePath = globals.fs.path.relative(path, from: asset.baseDir);
+    final Uri relativeUri = globals.fs.path.toUri(relativePath);
     final Uri entryUri = asset.symbolicPrefixUri == null
         ? relativeUri
         : asset.symbolicPrefixUri.resolveUri(relativeUri);
@@ -681,8 +680,8 @@
   Uri assetUri,
   String packageName,
 ) {
-  final String assetPath = fs.path.fromUri(assetUri);
-  if (assetUri.pathSegments.first == 'packages' && !fs.isFileSync(fs.path.join(assetsBaseDir, assetPath))) {
+  final String assetPath = globals.fs.path.fromUri(assetUri);
+  if (assetUri.pathSegments.first == 'packages' && !globals.fs.isFileSync(globals.fs.path.join(assetsBaseDir, assetPath))) {
     // The asset is referenced in the pubspec.yaml as
     // 'packages/PACKAGE_NAME/PATH/TO/ASSET .
     final _Asset packageAsset = _resolvePackageAsset(assetUri, packageMap);
@@ -707,13 +706,13 @@
     final Uri packageUri = packageMap.map[packageName];
     if (packageUri != null && packageUri.scheme == 'file') {
       return _Asset(
-        baseDir: fs.path.fromUri(packageUri),
+        baseDir: globals.fs.path.fromUri(packageUri),
         entryUri: assetUri,
         relativeUri: Uri(pathSegments: assetUri.pathSegments.sublist(2)),
       );
     }
   }
-  printStatus('Error detected in pubspec.yaml:', emphasis: true);
-  printError('Could not resolve package for asset $assetUri.\n');
+  globals.printStatus('Error detected in pubspec.yaml:', emphasis: true);
+  globals.printError('Could not resolve package for asset $assetUri.\n');
   return null;
 }
diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart
index 32aa189..9d5c8fc 100644
--- a/packages/flutter_tools/lib/src/base/build.dart
+++ b/packages/flutter_tools/lib/src/base/build.dart
@@ -11,7 +11,7 @@
 import '../bundle.dart';
 import '../compile.dart';
 import '../dart/package_map.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../macos/xcode.dart';
 import '../project.dart';
 import '../reporting/reporting.dart';
@@ -39,7 +39,7 @@
   const GenSnapshot();
 
   static String getSnapshotterPath(SnapshotType snapshotType) {
-    return artifacts.getArtifactPath(
+    return globals.artifacts.getArtifactPath(
         Artifact.genSnapshot, platform: snapshotType.platform, mode: snapshotType.mode);
   }
 
@@ -97,12 +97,12 @@
     bool quiet = false,
   }) async {
     if (bitcode && platform != TargetPlatform.ios) {
-      printError('Bitcode is only supported for iOS.');
+      globals.printError('Bitcode is only supported for iOS.');
       return 1;
     }
 
     if (!_isValidAotPlatform(platform, buildMode)) {
-      printError('${getNameForTargetPlatform(platform)} does not support AOT compilation.');
+      globals.printError('${getNameForTargetPlatform(platform)} does not support AOT compilation.');
       return 1;
     }
     // TODO(cbracken): replace IOSArch with TargetPlatform.ios_{armv7,arm64}.
@@ -111,16 +111,16 @@
     final PackageMap packageMap = PackageMap(packagesPath);
     final String packageMapError = packageMap.checkValid();
     if (packageMapError != null) {
-      printError(packageMapError);
+      globals.printError(packageMapError);
       return 1;
     }
 
-    final Directory outputDir = fs.directory(outputPath);
+    final Directory outputDir = globals.fs.directory(outputPath);
     outputDir.createSync(recursive: true);
 
     final String skyEnginePkg = _getPackagePath(packageMap, 'sky_engine');
-    final String uiPath = fs.path.join(skyEnginePkg, 'lib', 'ui', 'ui.dart');
-    final String vmServicePath = fs.path.join(skyEnginePkg, 'sdk_ext', 'vmservice_io.dart');
+    final String uiPath = globals.fs.path.join(skyEnginePkg, 'lib', 'ui', 'ui.dart');
+    final String vmServicePath = globals.fs.path.join(skyEnginePkg, 'sdk_ext', 'vmservice_io.dart');
 
     final List<String> inputPaths = <String>[uiPath, vmServicePath, mainPath];
     final Set<String> outputPaths = <String>{};
@@ -128,18 +128,18 @@
       '--deterministic',
     ];
     if (extraGenSnapshotOptions != null && extraGenSnapshotOptions.isNotEmpty) {
-      printTrace('Extra gen_snapshot options: $extraGenSnapshotOptions');
+      globals.printTrace('Extra gen_snapshot options: $extraGenSnapshotOptions');
       genSnapshotArgs.addAll(extraGenSnapshotOptions);
     }
 
-    final String assembly = fs.path.join(outputDir.path, 'snapshot_assembly.S');
+    final String assembly = globals.fs.path.join(outputDir.path, 'snapshot_assembly.S');
     if (platform == TargetPlatform.ios || platform == TargetPlatform.darwin_x64) {
       // Assembly AOT snapshot.
       outputPaths.add(assembly);
       genSnapshotArgs.add('--snapshot_kind=app-aot-assembly');
       genSnapshotArgs.add('--assembly=$assembly');
     } else {
-      final String aotSharedLibrary = fs.path.join(outputDir.path, 'app.so');
+      final String aotSharedLibrary = globals.fs.path.join(outputDir.path, 'app.so');
       outputPaths.add(aotSharedLibrary);
       genSnapshotArgs.add('--snapshot_kind=app-aot-elf');
       genSnapshotArgs.add('--elf=$aotSharedLibrary');
@@ -160,9 +160,9 @@
 
     // TODO(jonahwilliams): fully remove input checks once all callers are
     // using assemble.
-    final Iterable<String> missingInputs = inputPaths.where((String p) => !fs.isFileSync(p));
+    final Iterable<String> missingInputs = inputPaths.where((String p) => !globals.fs.isFileSync(p));
     if (missingInputs.isNotEmpty) {
-      printTrace('Missing input files: $missingInputs from $inputPaths');
+      globals.printTrace('Missing input files: $missingInputs from $inputPaths');
     }
 
     final SnapshotType snapshotType = SnapshotType(platform, buildMode);
@@ -174,7 +174,7 @@
       darwinArch: darwinArch,
     ));
     if (genSnapshotExitCode != 0) {
-      printError('Dart snapshot generator failed with exit code $genSnapshotExitCode');
+      globals.printError('Dart snapshot generator failed with exit code $genSnapshotExitCode');
       return genSnapshotExitCode;
     }
 
@@ -184,8 +184,8 @@
     // gen_snapshot would provide an argument to do this automatically.
     final bool stripSymbols = platform == TargetPlatform.ios && buildMode == BuildMode.release && bitcode;
     if (stripSymbols) {
-      final IOSink sink = fs.file('$assembly.stripped.S').openWrite();
-      for (String line in fs.file(assembly).readAsLinesSync()) {
+      final IOSink sink = globals.fs.file('$assembly.stripped.S').openWrite();
+      for (String line in globals.fs.file(assembly).readAsLinesSync()) {
         if (line.startsWith('.section __DWARF')) {
           break;
         }
@@ -231,7 +231,7 @@
   }) async {
     final String targetArch = getNameForDarwinArch(appleArch);
     if (!quiet) {
-      printStatus('Building App.framework for $targetArch...');
+      globals.printStatus('Building App.framework for $targetArch...');
     }
 
     final List<String> commonBuildOptions = <String>[
@@ -241,7 +241,7 @@
     ];
 
     const String embedBitcodeArg = '-fembed-bitcode';
-    final String assemblyO = fs.path.join(outputPath, 'snapshot_assembly.o');
+    final String assemblyO = globals.fs.path.join(outputPath, 'snapshot_assembly.o');
     List<String> isysrootArgs;
     if (isIOS) {
       final String iPhoneSDKLocation = await xcode.sdkLocation(SdkType.iPhone);
@@ -259,13 +259,13 @@
       assemblyO,
     ]);
     if (compileResult.exitCode != 0) {
-      printError('Failed to compile AOT snapshot. Compiler terminated with exit code ${compileResult.exitCode}');
+      globals.printError('Failed to compile AOT snapshot. Compiler terminated with exit code ${compileResult.exitCode}');
       return compileResult;
     }
 
-    final String frameworkDir = fs.path.join(outputPath, 'App.framework');
-    fs.directory(frameworkDir).createSync(recursive: true);
-    final String appLib = fs.path.join(frameworkDir, 'App');
+    final String frameworkDir = globals.fs.path.join(outputPath, 'App.framework');
+    globals.fs.directory(frameworkDir).createSync(recursive: true);
+    final String appLib = globals.fs.path.join(frameworkDir, 'App');
     final List<String> linkArgs = <String>[
       ...commonBuildOptions,
       '-dynamiclib',
@@ -279,7 +279,7 @@
     ];
     final RunResult linkResult = await xcode.clang(linkArgs);
     if (linkResult.exitCode != 0) {
-      printError('Failed to link AOT snapshot. Linker terminated with exit code ${compileResult.exitCode}');
+      globals.printError('Failed to link AOT snapshot. Linker terminated with exit code ${compileResult.exitCode}');
     }
     return linkResult;
   }
@@ -298,25 +298,25 @@
     List<String> extraFrontEndOptions = const <String>[],
   }) async {
     final FlutterProject flutterProject = FlutterProject.current();
-    final Directory outputDir = fs.directory(outputPath);
+    final Directory outputDir = globals.fs.directory(outputPath);
     outputDir.createSync(recursive: true);
 
-    printTrace('Compiling Dart to kernel: $mainPath');
+    globals.printTrace('Compiling Dart to kernel: $mainPath');
 
     if ((extraFrontEndOptions != null) && extraFrontEndOptions.isNotEmpty) {
-      printTrace('Extra front-end options: $extraFrontEndOptions');
+      globals.printTrace('Extra front-end options: $extraFrontEndOptions');
     }
 
-    final String depfilePath = fs.path.join(outputPath, 'kernel_compile.d');
+    final String depfilePath = globals.fs.path.join(outputPath, 'kernel_compile.d');
     final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(flutterProject);
     final CompilerOutput compilerOutput =
       await _timedStep('frontend(CompileTime)', 'aot-kernel',
         () => kernelCompiler.compile(
-      sdkRoot: artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath, mode: buildMode),
+      sdkRoot: globals.artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath, mode: buildMode),
       mainPath: mainPath,
       packagesPath: packagesPath,
       outputFilePath: getKernelPathForTransformerOptions(
-        fs.path.join(outputPath, 'app.dill'),
+        globals.fs.path.join(outputPath, 'app.dill'),
         trackWidgetCreation: trackWidgetCreation,
       ),
       depFilePath: depfilePath,
@@ -329,8 +329,8 @@
     ));
 
     // Write path to frontend_server, since things need to be re-generated when that changes.
-    final String frontendPath = artifacts.getArtifactPath(Artifact.frontendServerSnapshotForEngineDartSdk);
-    fs.directory(outputPath).childFile('frontend_server.d').writeAsStringSync('frontend_server.d: $frontendPath\n');
+    final String frontendPath = globals.artifacts.getArtifactPath(Artifact.frontendServerSnapshotForEngineDartSdk);
+    globals.fs.directory(outputPath).childFile('frontend_server.d').writeAsStringSync('frontend_server.d: $frontendPath\n');
 
     return compilerOutput?.outputFilename;
   }
@@ -349,7 +349,7 @@
   }
 
   String _getPackagePath(PackageMap packageMap, String package) {
-    return fs.path.dirname(fs.path.fromUri(packageMap.map[package]));
+    return globals.fs.path.dirname(globals.fs.path.fromUri(packageMap.map[package]));
   }
 
   /// This method is used to measure duration of an action and emit it into
@@ -361,7 +361,7 @@
     final Stopwatch sw = Stopwatch()..start();
     final T value = await action();
     if (reportTimings) {
-      printStatus('$marker: ${sw.elapsedMilliseconds} ms.');
+      globals.printStatus('$marker: ${sw.elapsedMilliseconds} ms.');
     }
     flutterUsage.sendTiming('build', analyticsVar, Duration(milliseconds: sw.elapsedMilliseconds));
     return value;
diff --git a/packages/flutter_tools/lib/src/base/common.dart b/packages/flutter_tools/lib/src/base/common.dart
index 75d7d7e..965e46c 100644
--- a/packages/flutter_tools/lib/src/base/common.dart
+++ b/packages/flutter_tools/lib/src/base/common.dart
@@ -2,8 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'file_system.dart';
-import 'platform.dart';
+import '../globals.dart' as globals;
 
 /// Whether the tool started from the daemon, as opposed to the command line.
 // TODO(jonahwilliams): remove once IDE updates have rolled.
@@ -11,11 +10,11 @@
 
 /// Return the absolute path of the user's home directory
 String get homeDirPath {
-  String path = platform.isWindows
-      ? platform.environment['USERPROFILE']
-      : platform.environment['HOME'];
+  String path = globals.platform.isWindows
+      ? globals.platform.environment['USERPROFILE']
+      : globals.platform.environment['HOME'];
   if (path != null) {
-    path = fs.path.absolute(path);
+    path = globals.fs.path.absolute(path);
   }
   return path;
 }
diff --git a/packages/flutter_tools/lib/src/base/config.dart b/packages/flutter_tools/lib/src/base/config.dart
index a872b64..619116a 100644
--- a/packages/flutter_tools/lib/src/base/config.dart
+++ b/packages/flutter_tools/lib/src/base/config.dart
@@ -3,16 +3,15 @@
 // found in the LICENSE file.
 
 import '../convert.dart';
-import '../globals.dart';
-import 'context.dart';
+import '../globals.dart' as globals;
 import 'file_system.dart';
 import 'logger.dart';
 import 'utils.dart';
 
 class Config {
   Config([File configFile, Logger localLogger]) {
-    final Logger loggerInstance = localLogger ?? logger;
-    _configFile = configFile ?? fs.file(fs.path.join(userHomePath(), '.flutter_settings'));
+    final Logger loggerInstance = localLogger ?? globals.logger;
+    _configFile = configFile ?? globals.fs.file(globals.fs.path.join(userHomePath(), '.flutter_settings'));
     if (_configFile.existsSync()) {
       try {
         _values = castStringKeyedMap(json.decode(_configFile.readAsStringSync()));
@@ -28,8 +27,6 @@
     }
   }
 
-  static Config get instance => context.get<Config>();
-
   File _configFile;
   String get configPath => _configFile.path;
 
diff --git a/packages/flutter_tools/lib/src/base/error_handling_file_system.dart b/packages/flutter_tools/lib/src/base/error_handling_file_system.dart
index 325cbf6..308266c 100644
--- a/packages/flutter_tools/lib/src/base/error_handling_file_system.dart
+++ b/packages/flutter_tools/lib/src/base/error_handling_file_system.dart
@@ -8,8 +8,8 @@
 import 'package:file/file.dart';
 import 'package:meta/meta.dart';
 
+import '../globals.dart' as globals;
 import 'common.dart' show throwToolExit;
-import 'platform.dart';
 
 // The Flutter tool hits file system errors that only the end-user can address.
 // We would like these errors to not hit crash logging. In these cases, we
@@ -129,7 +129,7 @@
     try {
       return await op();
     } on FileSystemException catch (e) {
-      if (platform.isWindows) {
+      if (globals.platform.isWindows) {
         _handleWindowsException(e, failureMessage);
       }
       rethrow;
@@ -140,7 +140,7 @@
     try {
       return op();
     } on FileSystemException catch (e) {
-      if (platform.isWindows) {
+      if (globals.platform.isWindows) {
         _handleWindowsException(e, failureMessage);
       }
       rethrow;
diff --git a/packages/flutter_tools/lib/src/base/file_system.dart b/packages/flutter_tools/lib/src/base/file_system.dart
index b9e927a..4100d77 100644
--- a/packages/flutter_tools/lib/src/base/file_system.dart
+++ b/packages/flutter_tools/lib/src/base/file_system.dart
@@ -3,36 +3,22 @@
 // found in the LICENSE file.
 
 import 'package:file/file.dart';
-import 'package:file/local.dart';
-import 'package:file/memory.dart';
 import 'package:meta/meta.dart';
 
+import '../globals.dart' as globals;
 import 'common.dart' show throwToolExit;
-import 'context.dart';
-import 'error_handling_file_system.dart';
-import 'platform.dart';
 
 export 'package:file/file.dart';
 export 'package:file/local.dart';
 
-const FileSystem _kLocalFs = LocalFileSystem();
-
-/// Currently active implementation of the file system.
-///
-/// By default it uses local disk-based implementation. Override this in tests
-/// with [MemoryFileSystem].
-FileSystem get fs => ErrorHandlingFileSystem(
-  context.get<FileSystem>() ?? _kLocalFs,
-);
-
 /// Create the ancestor directories of a file path if they do not already exist.
 void ensureDirectoryExists(String filePath) {
-  final String dirPath = fs.path.dirname(filePath);
-  if (fs.isDirectorySync(dirPath)) {
+  final String dirPath = globals.fs.path.dirname(filePath);
+  if (globals.fs.isDirectorySync(dirPath)) {
     return;
   }
   try {
-    fs.directory(dirPath).createSync(recursive: true);
+    globals.fs.directory(dirPath).createSync(recursive: true);
   } on FileSystemException catch (e) {
     throwToolExit('Failed to create directory "$dirPath": ${e.osError.message}');
   }
@@ -84,13 +70,13 @@
 /// `package:path`. However, unlike the original, it does not change the ASCII
 /// case of the path. Changing the case can break hot reload in some situations,
 /// for an example see: https://github.com/flutter/flutter/issues/9539.
-String canonicalizePath(String path) => fs.path.normalize(fs.path.absolute(path));
+String canonicalizePath(String path) => globals.fs.path.normalize(globals.fs.path.absolute(path));
 
 /// Escapes [path].
 ///
 /// On Windows it replaces all '\' with '\\'. On other platforms, it returns the
 /// path unchanged.
-String escapePath(String path) => platform.isWindows ? path.replaceAll('\\', '\\\\') : path;
+String escapePath(String path) => globals.platform.isWindows ? path.replaceAll('\\', '\\\\') : path;
 
 /// Returns true if the file system [entity] has not been modified since the
 /// latest modification to [referenceFile].
@@ -120,6 +106,6 @@
 ///
 /// If the searched environment variables are not set, '.' is returned instead.
 String userHomePath() {
-  final String envKey = platform.operatingSystem == 'windows' ? 'APPDATA' : 'HOME';
-  return platform.environment[envKey] ?? '.';
+  final String envKey = globals.platform.operatingSystem == 'windows' ? 'APPDATA' : 'HOME';
+  return globals.platform.environment[envKey] ?? '.';
 }
diff --git a/packages/flutter_tools/lib/src/base/fingerprint.dart b/packages/flutter_tools/lib/src/base/fingerprint.dart
index 38c9004..5fc0b2f 100644
--- a/packages/flutter_tools/lib/src/base/fingerprint.dart
+++ b/packages/flutter_tools/lib/src/base/fingerprint.dart
@@ -7,7 +7,7 @@
 import 'package:quiver/core.dart' show hash2;
 
 import '../convert.dart' show json;
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../version.dart';
 import 'file_system.dart';
 import 'utils.dart';
@@ -50,17 +50,17 @@
 
   bool doesFingerprintMatch() {
     try {
-      final File fingerprintFile = fs.file(fingerprintPath);
+      final File fingerprintFile = globals.fs.file(fingerprintPath);
       if (!fingerprintFile.existsSync()) {
         return false;
       }
 
-      if (!_depfilePaths.every(fs.isFileSync)) {
+      if (!_depfilePaths.every(globals.fs.isFileSync)) {
         return false;
       }
 
       final List<String> paths = _getPaths();
-      if (!paths.every(fs.isFileSync)) {
+      if (!paths.every(globals.fs.isFileSync)) {
         return false;
       }
 
@@ -69,7 +69,7 @@
       return oldFingerprint == newFingerprint;
     } catch (e) {
       // Log exception and continue, fingerprinting is only a performance improvement.
-      printTrace('Fingerprint check error: $e');
+      globals.printTrace('Fingerprint check error: $e');
     }
     return false;
   }
@@ -77,10 +77,10 @@
   void writeFingerprint() {
     try {
       final Fingerprint fingerprint = buildFingerprint();
-      fs.file(fingerprintPath).writeAsStringSync(fingerprint.toJson());
+      globals.fs.file(fingerprintPath).writeAsStringSync(fingerprint.toJson());
     } catch (e) {
       // Log exception and continue, fingerprinting is only a performance improvement.
-      printTrace('Fingerprint write error: $e');
+      globals.printTrace('Fingerprint write error: $e');
     }
   }
 
@@ -101,7 +101,7 @@
 /// See [Fingerprinter].
 class Fingerprint {
   Fingerprint.fromBuildInputs(Map<String, String> properties, Iterable<String> inputPaths) {
-    final Iterable<File> files = inputPaths.map<File>(fs.file);
+    final Iterable<File> files = inputPaths.map<File>(globals.fs.file);
     final Iterable<File> missingInputs = files.where((File file) => !file.existsSync());
     if (missingInputs.isNotEmpty) {
       throw ArgumentError('Missing input files:\n' + missingInputs.join('\n'));
@@ -181,7 +181,7 @@
 Set<String> readDepfile(String depfilePath) {
   // Depfile format:
   // outfile1 outfile2 : file1.dart file2.dart file3.dart
-  final String contents = fs.file(depfilePath).readAsStringSync();
+  final String contents = globals.fs.file(depfilePath).readAsStringSync();
 
   final String dependencies = contents.split(': ')[1];
   return dependencies
diff --git a/packages/flutter_tools/lib/src/base/io.dart b/packages/flutter_tools/lib/src/base/io.dart
index 158d2f7..4748512 100644
--- a/packages/flutter_tools/lib/src/base/io.dart
+++ b/packages/flutter_tools/lib/src/base/io.dart
@@ -45,8 +45,8 @@
 
 import 'package:meta/meta.dart';
 
+import '../globals.dart' as globals;
 import 'context.dart';
-import 'platform.dart';
 import 'process.dart';
 
 export 'dart:io'
@@ -180,7 +180,7 @@
   ///
   /// This is implemented by sending the signal using [Process.killPid].
   bool send(int pid) {
-    assert(!platform.isWindows || this == ProcessSignal.SIGTERM);
+    assert(!globals.platform.isWindows || this == ProcessSignal.SIGTERM);
     return io.Process.killPid(pid, _delegate);
   }
 
@@ -197,7 +197,7 @@
 
   @override
   Stream<ProcessSignal> watch() {
-    if (platform.isWindows) {
+    if (globals.platform.isWindows) {
       return const Stream<ProcessSignal>.empty();
     }
     return super.watch();
diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart
index 71bf003..0291f5a 100644
--- a/packages/flutter_tools/lib/src/base/logger.dart
+++ b/packages/flutter_tools/lib/src/base/logger.dart
@@ -7,8 +7,8 @@
 import 'package:meta/meta.dart';
 
 import '../base/context.dart';
+import '../globals.dart' as globals;
 import 'io.dart';
-import 'platform.dart';
 import 'terminal.dart';
 import 'utils.dart';
 
@@ -44,7 +44,7 @@
 
   bool quiet = false;
 
-  bool get supportsColor => terminal.supportsColor;
+  bool get supportsColor => globals.terminal.supportsColor;
 
   bool get hasTerminal => stdio.hasTerminal;
 
@@ -174,9 +174,9 @@
     message ??= '';
     message = wrapText(message, indent: indent, hangingIndent: hangingIndent, shouldWrap: wrap);
     if (emphasis == true) {
-      message = terminal.bolden(message);
+      message = globals.terminal.bolden(message);
     }
-    message = terminal.color(message, color ?? TerminalColor.red);
+    message = globals.terminal.color(message, color ?? TerminalColor.red);
     stderr.writeln(message);
     if (stackTrace != null) {
       stderr.writeln(stackTrace.toString());
@@ -198,10 +198,10 @@
     message ??= '';
     message = wrapText(message, indent: indent, hangingIndent: hangingIndent, shouldWrap: wrap);
     if (emphasis == true) {
-      message = terminal.bolden(message);
+      message = globals.terminal.bolden(message);
     }
     if (color != null) {
-      message = terminal.color(message, color);
+      message = globals.terminal.color(message, color);
     }
     if (newline != false) {
       message = '$message\n';
@@ -234,7 +234,7 @@
         onFinish: _clearStatus,
       )..start();
     }
-    if (terminal.supportsColor) {
+    if (globals.terminal.supportsColor) {
       _status = AnsiStatus(
         message: message,
         timeout: timeout,
@@ -305,7 +305,7 @@
     int hangingIndent,
     bool wrap,
   }) {
-    _error.writeln(terminal.color(
+    _error.writeln(globals.terminal.color(
       wrapText(message, indent: indent, hangingIndent: hangingIndent, shouldWrap: wrap),
       color ?? TerminalColor.red,
     ));
@@ -356,7 +356,7 @@
 }
 
 class VerboseLogger extends Logger {
-  VerboseLogger(this.parent) : assert(terminal != null) {
+  VerboseLogger(this.parent) : assert(globals.terminal != null) {
     _stopwatch.start();
   }
 
@@ -446,7 +446,7 @@
     } else {
       prefix = '+$millis ms'.padLeft(prefixWidth);
       if (millis >= 100) {
-        prefix = terminal.bolden(prefix);
+        prefix = globals.terminal.bolden(prefix);
       }
     }
     prefix = '[$prefix] ';
@@ -455,12 +455,12 @@
     final String indentMessage = message.replaceAll('\n', '\n$indent');
 
     if (type == _LogType.error) {
-      parent.printError(prefix + terminal.bolden(indentMessage));
+      parent.printError(prefix + globals.terminal.bolden(indentMessage));
       if (stackTrace != null) {
         parent.printError(indent + stackTrace.toString().replaceAll('\n', '\n$indent'));
       }
     } else if (type == _LogType.status) {
-      parent.printStatus(prefix + terminal.bolden(indentMessage));
+      parent.printStatus(prefix + globals.terminal.bolden(indentMessage));
     } else {
       parent.printStatus(prefix + indentMessage);
     }
@@ -504,7 +504,7 @@
     VoidCallback onFinish,
     SlowWarningCallback slowWarningCallback,
   }) {
-    if (terminal.supportsColor) {
+    if (globals.terminal.supportsColor) {
       return AnsiSpinner(
         timeout: timeout,
         onFinish: onFinish,
@@ -663,7 +663,7 @@
   Timer timer;
 
   // Windows console font has a limited set of Unicode characters.
-  List<String> get _animation => platform.isWindows
+  List<String> get _animation => globals.platform.isWindows
       ? <String>[r'-', r'\', r'|', r'/']
       : <String>['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'];
 
diff --git a/packages/flutter_tools/lib/src/base/net.dart b/packages/flutter_tools/lib/src/base/net.dart
index c52ffbd..150e1a1 100644
--- a/packages/flutter_tools/lib/src/base/net.dart
+++ b/packages/flutter_tools/lib/src/base/net.dart
@@ -6,11 +6,10 @@
 
 import '../base/context.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'common.dart';
 import 'file_system.dart';
 import 'io.dart';
-import 'platform.dart';
 
 const int kNetworkProblemExitCode = 50;
 
@@ -52,10 +51,10 @@
     }
 
     if (maxAttempts != null && attempts >= maxAttempts) {
-      printStatus('Download failed -- retry $attempts');
+      globals.printStatus('Download failed -- retry $attempts');
       return null;
     }
-    printStatus('Download failed -- attempting retry $attempts in '
+    globals.printStatus('Download failed -- attempting retry $attempts in '
         '$durationSeconds second${ durationSeconds == 1 ? "" : "s"}...');
     await Future<void>.delayed(Duration(seconds: durationSeconds));
     if (durationSeconds < 64) {
@@ -73,7 +72,7 @@
   bool onlyHeaders = false,
 }) async {
   assert(onlyHeaders || destSink != null);
-  printTrace('Downloading: $url');
+  globals.printTrace('Downloading: $url');
   HttpClient httpClient;
   if (context.get<HttpClientFactory>() != null) {
     httpClient = context.get<HttpClientFactory>()();
@@ -90,9 +89,9 @@
     }
     response = await request.close();
   } on ArgumentError catch (error) {
-    final String overrideUrl = platform.environment['FLUTTER_STORAGE_BASE_URL'];
+    final String overrideUrl = globals.platform.environment['FLUTTER_STORAGE_BASE_URL'];
     if (overrideUrl != null && url.toString().contains(overrideUrl)) {
-      printError(error.toString());
+      globals.printError(error.toString());
       throwToolExit(
         'The value of FLUTTER_STORAGE_BASE_URL ($overrideUrl) could not be '
         'parsed as a valid url. Please see https://flutter.dev/community/china '
@@ -100,10 +99,10 @@
         'Full URL: $url',
         exitCode: kNetworkProblemExitCode,);
     }
-    printError(error.toString());
+    globals.printError(error.toString());
     rethrow;
   } on HandshakeException catch (error) {
-    printTrace(error.toString());
+    globals.printTrace(error.toString());
     throwToolExit(
       'Could not authenticate download server. You may be experiencing a man-in-the-middle attack,\n'
       'your network may be compromised, or you may have malware installed on your computer.\n'
@@ -111,10 +110,10 @@
       exitCode: kNetworkProblemExitCode,
     );
   } on SocketException catch (error) {
-    printTrace('Download error: $error');
+    globals.printTrace('Download error: $error');
     return false;
   } on HttpException catch (error) {
-    printTrace('Download error: $error');
+    globals.printTrace('Download error: $error');
     return false;
   }
   assert(response != null);
@@ -134,16 +133,16 @@
       );
     }
     // 5xx errors are server errors and we can try again
-    printTrace('Download error: ${response.statusCode} ${response.reasonPhrase}');
+    globals.printTrace('Download error: ${response.statusCode} ${response.reasonPhrase}');
     return false;
   }
-  printTrace('Received response from server, collecting bytes...');
+  globals.printTrace('Received response from server, collecting bytes...');
   try {
     assert(destSink != null);
     await response.forEach(destSink.add);
     return true;
   } on IOException catch (error) {
-    printTrace('Download error: $error');
+    globals.printTrace('Download error: $error');
     return false;
   } finally {
     await destSink?.flush();
diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart
index 698a955..f07c758 100644
--- a/packages/flutter_tools/lib/src/base/os.dart
+++ b/packages/flutter_tools/lib/src/base/os.dart
@@ -4,20 +4,18 @@
 
 import 'package:archive/archive.dart';
 
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'context.dart';
 import 'file_system.dart';
 import 'io.dart';
-import 'platform.dart';
 import 'process.dart';
-import 'process_manager.dart';
 
 /// Returns [OperatingSystemUtils] active in the current app context (i.e. zone).
 OperatingSystemUtils get os => context.get<OperatingSystemUtils>();
 
 abstract class OperatingSystemUtils {
   factory OperatingSystemUtils() {
-    if (platform.isWindows) {
+    if (globals.platform.isWindows) {
       return _WindowsUtils();
     } else {
       return _PosixUtils();
@@ -75,7 +73,7 @@
       'linux': 'Linux',
       'windows': 'Windows',
     };
-    final String osName = platform.operatingSystem;
+    final String osName = globals.platform.operatingSystem;
     return osNames.containsKey(osName) ? osNames[osName] : osName;
   }
 
@@ -103,10 +101,10 @@
       if (!ipv6) {
         return findFreePort(ipv6: true);
       }
-      printTrace('findFreePort failed: $e');
+      globals.printTrace('findFreePort failed: $e');
     } catch (e) {
       // Failures are signaled by a return value of 0 from this function.
-      printTrace('findFreePort failed: $e');
+      globals.printTrace('findFreePort failed: $e');
     } finally {
       if (serverSocket != null) {
         await serverSocket.close();
@@ -127,16 +125,16 @@
   @override
   void chmod(FileSystemEntity entity, String mode) {
     try {
-      final ProcessResult result = processManager.runSync(<String>['chmod', mode, entity.path]);
+      final ProcessResult result = globals.processManager.runSync(<String>['chmod', mode, entity.path]);
       if (result.exitCode != 0) {
-        printTrace(
+        globals.printTrace(
           'Error trying to run chmod on ${entity.absolute.path}'
           '\nstdout: ${result.stdout}'
           '\nstderr: ${result.stderr}',
         );
       }
     } on ProcessException catch (error) {
-      printTrace('Error trying to run chmod on ${entity.absolute.path}: $error');
+      globals.printTrace('Error trying to run chmod on ${entity.absolute.path}: $error');
     }
   }
 
@@ -147,12 +145,12 @@
       if (all) '-a',
       execName,
     ];
-    final ProcessResult result = processManager.runSync(command);
+    final ProcessResult result = globals.processManager.runSync(command);
     if (result.exitCode != 0) {
       return const <File>[];
     }
     final String stdout = result.stdout as String;
-    return stdout.trim().split('\n').map<File>((String path) => fs.file(path.trim())).toList();
+    return stdout.trim().split('\n').map<File>((String path) => globals.fs.file(path.trim())).toList();
   }
 
   @override
@@ -196,7 +194,7 @@
       <String>['mkfifo', path],
       throwOnError: true,
     );
-    return fs.file(path);
+    return globals.fs.file(path);
   }
 
   String _name;
@@ -204,7 +202,7 @@
   @override
   String get name {
     if (_name == null) {
-      if (platform.isMacOS) {
+      if (globals.platform.isMacOS) {
         final List<RunResult> results = <RunResult>[
           processUtils.runSync(<String>['sw_vers', '-productName']),
           processUtils.runSync(<String>['sw_vers', '-productVersion']),
@@ -236,15 +234,15 @@
   @override
   List<File> _which(String execName, { bool all = false }) {
     // `where` always returns all matches, not just the first one.
-    final ProcessResult result = processManager.runSync(<String>['where', execName]);
+    final ProcessResult result = globals.processManager.runSync(<String>['where', execName]);
     if (result.exitCode != 0) {
       return const <File>[];
     }
     final List<String> lines = (result.stdout as String).trim().split('\n');
     if (all) {
-      return lines.map<File>((String path) => fs.file(path.trim())).toList();
+      return lines.map<File>((String path) => globals.fs.file(path.trim())).toList();
     }
-    return <File>[fs.file(lines.first.trim())];
+    return <File>[globals.fs.file(lines.first.trim())];
   }
 
   @override
@@ -307,7 +305,7 @@
         continue;
       }
 
-      final File destFile = fs.file(fs.path.join(targetDirectory.path, archiveFile.name));
+      final File destFile = globals.fs.file(globals.fs.path.join(targetDirectory.path, archiveFile.name));
       if (!destFile.parent.existsSync()) {
         destFile.parent.createSync(recursive: true);
       }
@@ -325,7 +323,7 @@
   @override
   String get name {
     if (_name == null) {
-      final ProcessResult result = processManager.runSync(
+      final ProcessResult result = globals.processManager.runSync(
           <String>['ver'], runInShell: true);
       if (result.exitCode == 0) {
         _name = (result.stdout as String).trim();
@@ -346,12 +344,12 @@
 /// or if the project root is the flutter repository root.
 String findProjectRoot([ String directory ]) {
   const String kProjectRootSentinel = 'pubspec.yaml';
-  directory ??= fs.currentDirectory.path;
+  directory ??= globals.fs.currentDirectory.path;
   while (true) {
-    if (fs.isFileSync(fs.path.join(directory, kProjectRootSentinel))) {
+    if (globals.fs.isFileSync(globals.fs.path.join(directory, kProjectRootSentinel))) {
       return directory;
     }
-    final String parent = fs.path.dirname(directory);
+    final String parent = globals.fs.path.dirname(directory);
     if (directory == parent) {
       return null;
     }
diff --git a/packages/flutter_tools/lib/src/base/platform.dart b/packages/flutter_tools/lib/src/base/platform.dart
deleted file mode 100644
index 9cea8c9..0000000
--- a/packages/flutter_tools/lib/src/base/platform.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:platform/platform.dart';
-
-import 'context.dart';
-
-export 'package:platform/platform.dart';
-
-const Platform _kLocalPlatform = LocalPlatform();
-
-Platform get platform => context.get<Platform>() ?? _kLocalPlatform;
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index 35cd92b..e2e6128 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -5,12 +5,10 @@
 import 'dart:async';
 
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'common.dart';
 import 'context.dart';
-import 'file_system.dart';
 import 'io.dart';
-import 'process_manager.dart';
 import 'utils.dart';
 
 typedef StringConverter = String Function(String string);
@@ -77,11 +75,11 @@
 /// guaranteed to run to completion before shutdown hooks in the next stage are
 /// started.
 Future<void> runShutdownHooks() async {
-  printTrace('Running shutdown hooks');
+  globals.printTrace('Running shutdown hooks');
   _shutdownHooksRunning = true;
   try {
     for (ShutdownStage stage in _shutdownHooks.keys.toList()..sort()) {
-      printTrace('Shutdown hook priority ${stage.priority}');
+      globals.printTrace('Shutdown hook priority ${stage.priority}');
       final List<ShutdownHook> hooks = _shutdownHooks.remove(stage);
       final List<Future<dynamic>> futures = <Future<dynamic>>[];
       for (ShutdownHook shutdownHook in hooks) {
@@ -96,7 +94,7 @@
     _shutdownHooksRunning = false;
   }
   assert(_shutdownHooks.isEmpty);
-  printTrace('Shutdown hooks complete');
+  globals.printTrace('Shutdown hooks complete');
 }
 
 class ProcessExit implements Exception {
@@ -261,15 +259,15 @@
     _traceCommand(cmd, workingDirectory: workingDirectory);
 
     // When there is no timeout, there's no need to kill a running process, so
-    // we can just use processManager.run().
+    // we can just use globals.processManager.run().
     if (timeout == null) {
-      final ProcessResult results = await processManager.run(
+      final ProcessResult results = await globals.processManager.run(
         cmd,
         workingDirectory: workingDirectory,
         environment: _environment(allowReentrantFlutter, environment),
       );
       final RunResult runResult = RunResult(results, cmd);
-      printTrace(runResult.toString());
+      globals.printTrace(runResult.toString());
       if (throwOnError && runResult.exitCode != 0 &&
           (whiteListFailures == null || !whiteListFailures(runResult.exitCode))) {
         runResult.throwException('Process exited abnormally:\n$runResult');
@@ -278,7 +276,7 @@
     }
 
     // When there is a timeout, we have to kill the running process, so we have
-    // to use processManager.start() through _runCommand() above.
+    // to use globals.processManager.start() through _runCommand() above.
     while (true) {
       assert(timeoutRetries >= 0);
       timeoutRetries = timeoutRetries - 1;
@@ -304,7 +302,7 @@
       int exitCode;
       exitCode = await process.exitCode.timeout(timeout, onTimeout: () {
         // The process timed out. Kill it.
-        processManager.killPid(process.pid);
+        globals.processManager.killPid(process.pid);
         return null;
       });
 
@@ -333,7 +331,7 @@
 
       // If the process did not timeout. We are done.
       if (exitCode != null) {
-        printTrace(runResult.toString());
+        globals.printTrace(runResult.toString());
         if (throwOnError && runResult.exitCode != 0 &&
             (whiteListFailures == null || !whiteListFailures(exitCode))) {
           runResult.throwException('Process exited abnormally:\n$runResult');
@@ -347,7 +345,7 @@
       }
 
       // Log the timeout with a trace message in verbose mode.
-      printTrace('Process "${cmd[0]}" timed out. $timeoutRetries attempts left:\n'
+      globals.printTrace('Process "${cmd[0]}" timed out. $timeoutRetries attempts left:\n'
                  '$runResult');
     }
 
@@ -365,14 +363,14 @@
     bool allowReentrantFlutter = false,
   }) {
     _traceCommand(cmd, workingDirectory: workingDirectory);
-    final ProcessResult results = processManager.runSync(
+    final ProcessResult results = globals.processManager.runSync(
       cmd,
       workingDirectory: workingDirectory,
       environment: _environment(allowReentrantFlutter, environment),
     );
     final RunResult runResult = RunResult(results, cmd);
 
-    printTrace('Exit code ${runResult.exitCode} from: ${cmd.join(' ')}');
+    globals.printTrace('Exit code ${runResult.exitCode} from: ${cmd.join(' ')}');
 
     bool failedExitCode = runResult.exitCode != 0;
     if (whiteListFailures != null && failedExitCode) {
@@ -381,17 +379,17 @@
 
     if (runResult.stdout.isNotEmpty && !hideStdout) {
       if (failedExitCode && throwOnError) {
-        printStatus(runResult.stdout.trim());
+        globals.printStatus(runResult.stdout.trim());
       } else {
-        printTrace(runResult.stdout.trim());
+        globals.printTrace(runResult.stdout.trim());
       }
     }
 
     if (runResult.stderr.isNotEmpty) {
       if (failedExitCode && throwOnError) {
-        printError(runResult.stderr.trim());
+        globals.printError(runResult.stderr.trim());
       } else {
-        printTrace(runResult.stderr.trim());
+        globals.printTrace(runResult.stderr.trim());
       }
     }
 
@@ -410,7 +408,7 @@
     Map<String, String> environment,
   }) {
     _traceCommand(cmd, workingDirectory: workingDirectory);
-    return processManager.start(
+    return globals.processManager.start(
       cmd,
       workingDirectory: workingDirectory,
       environment: _environment(allowReentrantFlutter, environment),
@@ -445,9 +443,9 @@
         if (line != null) {
           final String message = '$prefix$line';
           if (trace) {
-            printTrace(message);
+            globals.printTrace(message);
           } else {
-            printStatus(message, wrap: false);
+            globals.printStatus(message, wrap: false);
           }
         }
       });
@@ -460,7 +458,7 @@
           line = mapFunction(line);
         }
         if (line != null) {
-          printError('$prefix$line', wrap: false);
+          globals.printError('$prefix$line', wrap: false);
         }
       });
 
@@ -489,9 +487,9 @@
   }) {
     _traceCommand(cli);
     try {
-      return processManager.runSync(cli, environment: environment).exitCode == 0;
+      return globals.processManager.runSync(cli, environment: environment).exitCode == 0;
     } catch (error) {
-      printTrace('$cli failed with $error');
+      globals.printTrace('$cli failed with $error');
       return false;
     }
   }
@@ -503,9 +501,9 @@
   }) async {
     _traceCommand(cli);
     try {
-      return (await processManager.run(cli, environment: environment)).exitCode == 0;
+      return (await globals.processManager.run(cli, environment: environment)).exitCode == 0;
     } catch (error) {
-      printTrace('$cli failed with $error');
+      globals.printTrace('$cli failed with $error');
       return false;
     }
   }
@@ -527,9 +525,9 @@
   void _traceCommand(List<String> args, { String workingDirectory }) {
     final String argsText = args.join(' ');
     if (workingDirectory == null) {
-      printTrace('executing: $argsText');
+      globals.printTrace('executing: $argsText');
     } else {
-      printTrace('executing: [$workingDirectory${fs.path.separator}] $argsText');
+      globals.printTrace('executing: [$workingDirectory${globals.fs.path.separator}] $argsText');
     }
   }
 }
diff --git a/packages/flutter_tools/lib/src/base/process_manager.dart b/packages/flutter_tools/lib/src/base/process_manager.dart
deleted file mode 100644
index 4aa69a7..0000000
--- a/packages/flutter_tools/lib/src/base/process_manager.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:process/process.dart';
-
-import 'context.dart';
-
-const ProcessManager _kLocalProcessManager = LocalProcessManager();
-
-/// The active process manager.
-ProcessManager get processManager => context.get<ProcessManager>() ?? _kLocalProcessManager;
diff --git a/packages/flutter_tools/lib/src/base/terminal.dart b/packages/flutter_tools/lib/src/base/terminal.dart
index 83192c7..e017556 100644
--- a/packages/flutter_tools/lib/src/base/terminal.dart
+++ b/packages/flutter_tools/lib/src/base/terminal.dart
@@ -5,10 +5,9 @@
 import 'dart:async';
 
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'context.dart';
 import 'io.dart' as io;
-import 'platform.dart';
 
 enum TerminalColor {
   red,
@@ -20,22 +19,16 @@
   grey,
 }
 
-AnsiTerminal get terminal {
-  return context?.get<AnsiTerminal>() ?? _defaultAnsiTerminal;
-}
-
 /// Warning mark to use in stdout or stderr.
 String get warningMark {
-  return terminal.bolden(terminal.color('[!]', TerminalColor.red));
+  return globals.terminal.bolden(globals.terminal.color('[!]', TerminalColor.red));
 }
 
 /// Success mark to use in stdout.
 String get successMark {
-  return terminal.bolden(terminal.color('✓', TerminalColor.green));
+  return globals.terminal.bolden(globals.terminal.color('✓', TerminalColor.green));
 }
 
-final AnsiTerminal _defaultAnsiTerminal = AnsiTerminal();
-
 OutputPreferences get outputPreferences {
   return context?.get<OutputPreferences>() ?? _defaultOutputPreferences;
 }
@@ -50,7 +43,7 @@
     bool showColor,
   }) : wrapText = wrapText ?? io.stdio.hasTerminal,
        _overrideWrapColumn = wrapColumn,
-       showColor = showColor ?? platform.stdoutSupportsAnsi ?? false;
+       showColor = showColor ?? globals.platform.stdoutSupportsAnsi ?? false;
 
   /// A version of this class for use in tests.
   OutputPreferences.test() : wrapText = false, _overrideWrapColumn = null, showColor = false;
@@ -114,7 +107,7 @@
 
   static String colorCode(TerminalColor color) => _colorMap[color];
 
-  bool get supportsColor => platform.stdoutSupportsAnsi ?? false;
+  bool get supportsColor => globals.platform.stdoutSupportsAnsi ?? false;
   final RegExp _boldControls = RegExp('(${RegExp.escape(resetBold)}|${RegExp.escape(bold)})');
 
   /// Whether we are interacting with the flutter tool via the terminal.
@@ -227,14 +220,14 @@
     singleCharMode = true;
     while (choice == null || choice.length > 1 || !acceptedCharacters.contains(choice)) {
       if (prompt != null) {
-        printStatus(prompt, emphasis: true, newline: false);
+        globals.printStatus(prompt, emphasis: true, newline: false);
         if (displayAcceptedCharacters) {
-          printStatus(' [${charactersToDisplay.join("|")}]', newline: false);
+          globals.printStatus(' [${charactersToDisplay.join("|")}]', newline: false);
         }
-        printStatus(': ', emphasis: true, newline: false);
+        globals.printStatus(': ', emphasis: true, newline: false);
       }
       choice = await keystrokes.first;
-      printStatus(choice);
+      globals.printStatus(choice);
     }
     singleCharMode = false;
     if (defaultChoiceIndex != null && choice == '\n') {
diff --git a/packages/flutter_tools/lib/src/base/utils.dart b/packages/flutter_tools/lib/src/base/utils.dart
index 4e2618a..0cfcc72 100644
--- a/packages/flutter_tools/lib/src/base/utils.dart
+++ b/packages/flutter_tools/lib/src/base/utils.dart
@@ -8,10 +8,10 @@
 import 'package:intl/intl.dart';
 
 import '../convert.dart';
+import '../globals.dart' as globals;
 import 'context.dart';
 import 'file_system.dart';
 import 'io.dart' as io;
-import 'platform.dart';
 import 'terminal.dart';
 
 const BotDetector _kBotDetector = BotDetector();
@@ -22,40 +22,40 @@
   bool get isRunningOnBot {
     if (
         // Explicitly stated to not be a bot.
-        platform.environment['BOT'] == 'false'
+        globals.platform.environment['BOT'] == 'false'
 
         // Set by the IDEs to the IDE name, so a strong signal that this is not a bot.
-        || platform.environment.containsKey('FLUTTER_HOST')
+        || globals.platform.environment.containsKey('FLUTTER_HOST')
         // When set, GA logs to a local file (normally for tests) so we don't need to filter.
-        || platform.environment.containsKey('FLUTTER_ANALYTICS_LOG_FILE')
+        || globals.platform.environment.containsKey('FLUTTER_ANALYTICS_LOG_FILE')
     ) {
       return false;
     }
 
-    return platform.environment['BOT'] == 'true'
+    return globals.platform.environment['BOT'] == 'true'
 
         // https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables
-        || platform.environment['TRAVIS'] == 'true'
-        || platform.environment['CONTINUOUS_INTEGRATION'] == 'true'
-        || platform.environment.containsKey('CI') // Travis and AppVeyor
+        || globals.platform.environment['TRAVIS'] == 'true'
+        || globals.platform.environment['CONTINUOUS_INTEGRATION'] == 'true'
+        || globals.platform.environment.containsKey('CI') // Travis and AppVeyor
 
         // https://www.appveyor.com/docs/environment-variables/
-        || platform.environment.containsKey('APPVEYOR')
+        || globals.platform.environment.containsKey('APPVEYOR')
 
         // https://cirrus-ci.org/guide/writing-tasks/#environment-variables
-        || platform.environment.containsKey('CIRRUS_CI')
+        || globals.platform.environment.containsKey('CIRRUS_CI')
 
         // https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html
-        || (platform.environment.containsKey('AWS_REGION') &&
-            platform.environment.containsKey('CODEBUILD_INITIATOR'))
+        || (globals.platform.environment.containsKey('AWS_REGION') &&
+            globals.platform.environment.containsKey('CODEBUILD_INITIATOR'))
 
         // https://wiki.jenkins.io/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-belowJenkinsSetEnvironmentVariables
-        || platform.environment.containsKey('JENKINS_URL')
+        || globals.platform.environment.containsKey('JENKINS_URL')
 
         // Properties on Flutter's Chrome Infra bots.
-        || platform.environment['CHROME_HEADLESS'] == '1'
-        || platform.environment.containsKey('BUILDBOT_BUILDERNAME')
-        || platform.environment.containsKey('SWARMING_TASK_ID');
+        || globals.platform.environment['CHROME_HEADLESS'] == '1'
+        || globals.platform.environment.containsKey('BUILDBOT_BUILDERNAME')
+        || globals.platform.environment.containsKey('SWARMING_TASK_ID');
   }
 }
 
@@ -107,7 +107,7 @@
 
   while (true) {
     final String name = '${baseName}_${i.toString().padLeft(2, '0')}.$ext';
-    final File file = fs.file(fs.path.join(dir.path, name));
+    final File file = fs.file(globals.fs.path.join(dir.path, name));
     if (!file.existsSync()) {
       return file;
     }
@@ -139,7 +139,7 @@
 /// Return a relative path if [fullPath] is contained by the cwd, else return an
 /// absolute path.
 String getDisplayPath(String fullPath) {
-  final String cwd = fs.currentDirectory.path + fs.path.separator;
+  final String cwd = globals.fs.currentDirectory.path + globals.fs.path.separator;
   return fullPath.startsWith(cwd) ? fullPath.substring(cwd.length) : fullPath;
 }
 
@@ -368,7 +368,7 @@
 void writePidFile(String pidFile) {
   if (pidFile != null) {
     // Write our pid to the file.
-    fs.file(pidFile).writeAsStringSync(io.pid.toString());
+    globals.fs.file(pidFile).writeAsStringSync(io.pid.toString());
   }
 }
 
diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index 2f51d60..3821ea1 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -3,10 +3,8 @@
 // found in the LICENSE file.
 
 import 'base/context.dart';
-import 'base/file_system.dart';
-import 'base/platform.dart';
 import 'base/utils.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 
 /// Information about a build to be performed or used.
 class BuildInfo {
@@ -221,7 +219,7 @@
     }
     tmpBuildNumber = segments.join('.');
     if (tmpBuildNumber != buildNumber) {
-      printTrace('Invalid build-number: $buildNumber for iOS/macOS, overridden by $tmpBuildNumber.\n'
+      globals.printTrace('Invalid build-number: $buildNumber for iOS/macOS, overridden by $tmpBuildNumber.\n'
           'See CFBundleVersion at https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html');
     }
     return tmpBuildNumber;
@@ -239,7 +237,7 @@
     }
     tmpBuildNumberStr = tmpBuildNumberInt.toString();
     if (tmpBuildNumberStr != buildNumber) {
-      printTrace('Invalid build-number: $buildNumber for Android, overridden by $tmpBuildNumberStr.\n'
+      globals.printTrace('Invalid build-number: $buildNumber for Android, overridden by $tmpBuildNumberStr.\n'
           'See versionCode at https://developer.android.com/studio/publish/versioning');
     }
     return tmpBuildNumberStr;
@@ -268,7 +266,7 @@
     }
     tmpBuildName = segments.join('.');
     if (tmpBuildName != buildName) {
-      printTrace('Invalid build-name: $buildName for iOS/macOS, overridden by $tmpBuildName.\n'
+      globals.printTrace('Invalid build-name: $buildName for iOS/macOS, overridden by $tmpBuildName.\n'
           'See CFBundleShortVersionString at https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html');
     }
     return tmpBuildName;
@@ -507,17 +505,17 @@
 }
 
 HostPlatform getCurrentHostPlatform() {
-  if (platform.isMacOS) {
+  if (globals.platform.isMacOS) {
     return HostPlatform.darwin_x64;
   }
-  if (platform.isLinux) {
+  if (globals.platform.isLinux) {
     return HostPlatform.linux_x64;
   }
-  if (platform.isWindows) {
+  if (globals.platform.isWindows) {
     return HostPlatform.windows_x64;
   }
 
-  printError('Unsupported host platform, defaulting to Linux');
+  globals.printError('Unsupported host platform, defaulting to Linux');
 
   return HostPlatform.linux_x64;
 }
@@ -526,14 +524,14 @@
 String getBuildDirectory() {
   // TODO(johnmccutchan): Stop calling this function as part of setting
   // up command line argument processing.
-  if (context == null || config == null) {
+  if (context == null || globals.config == null) {
     return 'build';
   }
 
-  final String buildDir = config.getValue('build-dir') as String ?? 'build';
-  if (fs.path.isAbsolute(buildDir)) {
+  final String buildDir = globals.config.getValue('build-dir') as String ?? 'build';
+  if (globals.fs.path.isAbsolute(buildDir)) {
     throw Exception(
-        'build-dir config setting in ${config.configPath} must be relative');
+        'build-dir config setting in ${globals.config.configPath} must be relative');
   }
   return buildDir;
 }
@@ -546,40 +544,40 @@
 
 /// Returns the AOT build output directory.
 String getAotBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'aot');
+  return globals.fs.path.join(getBuildDirectory(), 'aot');
 }
 
 /// Returns the asset build output directory.
 String getAssetBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'flutter_assets');
+  return globals.fs.path.join(getBuildDirectory(), 'flutter_assets');
 }
 
 /// Returns the iOS build output directory.
 String getIosBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'ios');
+  return globals.fs.path.join(getBuildDirectory(), 'ios');
 }
 
 /// Returns the macOS build output directory.
 String getMacOSBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'macos');
+  return globals.fs.path.join(getBuildDirectory(), 'macos');
 }
 
 /// Returns the web build output directory.
 String getWebBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'web');
+  return globals.fs.path.join(getBuildDirectory(), 'web');
 }
 
 /// Returns the Linux build output directory.
 String getLinuxBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'linux');
+  return globals.fs.path.join(getBuildDirectory(), 'linux');
 }
 
 /// Returns the Windows build output directory.
 String getWindowsBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'windows');
+  return globals.fs.path.join(getBuildDirectory(), 'windows');
 }
 
 /// Returns the Fuchsia build output directory.
 String getFuchsiaBuildDirectory() {
-  return fs.path.join(getBuildDirectory(), 'fuchsia');
+  return globals.fs.path.join(getBuildDirectory(), 'fuchsia');
 }
diff --git a/packages/flutter_tools/lib/src/build_runner/build_runner.dart b/packages/flutter_tools/lib/src/build_runner/build_runner.dart
index 98df72e..082605f 100644
--- a/packages/flutter_tools/lib/src/build_runner/build_runner.dart
+++ b/packages/flutter_tools/lib/src/build_runner/build_runner.dart
@@ -17,12 +17,10 @@
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/logger.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
 import '../codegen.dart';
 import '../dart/pub.dart';
 import '../dart/sdk.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 
 /// The minimum version of build_runner we can support in the flutter tool.
@@ -39,8 +37,8 @@
 
   @override
   Future<void> generateBuildScript(FlutterProject flutterProject) async {
-    final Directory entrypointDirectory = fs.directory(fs.path.join(flutterProject.dartTool.path, 'build', 'entrypoint'));
-    final Directory generatedDirectory = fs.directory(fs.path.join(flutterProject.dartTool.path, 'flutter_tool'));
+    final Directory entrypointDirectory = globals.fs.directory(globals.fs.path.join(flutterProject.dartTool.path, 'build', 'entrypoint'));
+    final Directory generatedDirectory = globals.fs.directory(globals.fs.path.join(flutterProject.dartTool.path, 'flutter_tool'));
     final File buildSnapshot = entrypointDirectory.childFile('build.dart.snapshot');
     final File scriptIdFile = entrypointDirectory.childFile('id');
     final File syntheticPubspec = generatedDirectory.childFile('pubspec.yaml');
@@ -69,7 +67,7 @@
     if (flutterProject.dartTool.existsSync()) {
       flutterProject.dartTool.deleteSync(recursive: true);
     }
-    final Status status = logger.startProgress('generating build script...', timeout: null);
+    final Status status = globals.logger.startProgress('generating build script...', timeout: null);
     try {
       generatedDirectory.createSync(recursive: true);
       entrypointDirectory.createSync(recursive: true);
@@ -86,8 +84,8 @@
           // parent directories.
           if (node is YamlMap && node['path'] != null) {
             final String path = node['path'] as String;
-            if (fs.path.isRelative(path)) {
-              final String convertedPath = fs.path.join('..', '..', path);
+            if (globals.fs.path.isRelative(path)) {
+              final String convertedPath = globals.fs.path.join('..', '..', path);
               stringBuffer.writeln('  $name:');
               stringBuffer.writeln('    path: $convertedPath');
             } else {
@@ -112,18 +110,18 @@
         scriptIdFile.createSync(recursive: true);
       }
       scriptIdFile.writeAsBytesSync(appliedBuilderDigest);
-      final ProcessResult generateResult = await processManager.run(<String>[
+      final ProcessResult generateResult = await globals.processManager.run(<String>[
         sdkBinaryName('pub'), 'run', 'build_runner', 'generate-build-script',
       ], workingDirectory: syntheticPubspec.parent.path);
       if (generateResult.exitCode != 0) {
         throwToolExit('Error generating build_script snapshot: ${generateResult.stderr}');
       }
-      final File buildScript = fs.file(generateResult.stdout.trim());
-      final ProcessResult result = await processManager.run(<String>[
-        artifacts.getArtifactPath(Artifact.engineDartBinary),
+      final File buildScript = globals.fs.file(generateResult.stdout.trim());
+      final ProcessResult result = await globals.processManager.run(<String>[
+        globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
         '--snapshot=${buildSnapshot.path}',
         '--snapshot-kind=app-jit',
-        '--packages=${fs.path.join(generatedDirectory.path, '.packages')}',
+        '--packages=${globals.fs.path.join(generatedDirectory.path, '.packages')}',
         buildScript.path,
       ]);
       if (result.exitCode != 0) {
@@ -143,7 +141,7 @@
     List<String> extraFrontEndOptions = const <String> [],
   }) async {
     await generateBuildScript(flutterProject);
-    final String engineDartBinaryPath = artifacts.getArtifactPath(Artifact.engineDartBinary);
+    final String engineDartBinaryPath = globals.artifacts.getArtifactPath(Artifact.engineDartBinary);
     final File buildSnapshot = flutterProject
         .dartTool
         .childDirectory('build')
@@ -154,7 +152,7 @@
         .childDirectory('flutter_tool')
         .childFile('.packages')
         .path;
-    final Status status = logger.startProgress('starting build daemon...', timeout: null);
+    final Status status = globals.logger.startProgress('starting build daemon...', timeout: null);
     BuildDaemonClient buildDaemonClient;
     try {
       final List<String> command = <String>[
@@ -170,7 +168,7 @@
         command,
         logHandler: (ServerLog log) {
           if (log.message != null) {
-            printTrace(log.message);
+            globals.printTrace(log.message);
           }
         },
       );
@@ -228,7 +226,7 @@
 // Sorts the builders by name and produces a hashcode of the resulting iterable.
 List<int> _produceScriptId(YamlMap builders) {
   if (builders == null || builders.isEmpty) {
-    return md5.convert(platform.version.codeUnits).bytes;
+    return md5.convert(globals.platform.version.codeUnits).bytes;
   }
   final List<String> orderedBuilderNames = builders.keys
     .cast<String>()
@@ -239,6 +237,6 @@
   return md5.convert(<String>[
     ...orderedBuilderNames,
     ...orderedBuilderValues,
-    platform.version,
+    globals.platform.version,
   ].join('').codeUnits).bytes;
 }
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 8c28756..491046b 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
@@ -14,7 +14,6 @@
 import '../application_package.dart';
 import '../base/async_guard.dart';
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/logger.dart';
 import '../base/net.dart';
@@ -26,7 +25,7 @@
 import '../devfs.dart';
 import '../device.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import '../resident_runner.dart';
@@ -87,7 +86,7 @@
     @required this.dartDefines,
   }) : super(
           <FlutterDevice>[],
-          target: target ?? fs.path.join('lib', 'main.dart'),
+          target: target ?? globals.fs.path.join('lib', 'main.dart'),
           debuggingOptions: debuggingOptions,
           ipv6: ipv6,
           stayResident: stayResident,
@@ -172,18 +171,18 @@
     const String rawMessage =
         '  To hot restart changes while running, press "r". '
         'To hot restart (and refresh the browser), press "R".';
-    final String message = terminal.color(
-      fire + terminal.bolden(rawMessage),
+    final String message = globals.terminal.color(
+      fire + globals.terminal.bolden(rawMessage),
       TerminalColor.red,
     );
-    printStatus(
+    globals.printStatus(
         'Warning: Flutter\'s support for web development is not stable yet and hasn\'t');
-    printStatus('been thoroughly tested in production environments.');
-    printStatus('For more information see https://flutter.dev/web');
-    printStatus('');
-    printStatus(message);
+    globals.printStatus('been thoroughly tested in production environments.');
+    globals.printStatus('For more information see https://flutter.dev/web');
+    globals.printStatus('');
+    globals.printStatus(message);
     const String quitMessage = 'To quit, press "q".';
-    printStatus('For a more detailed help message, press "h". $quitMessage');
+    globals.printStatus('For a more detailed help message, press "h". $quitMessage');
   }
 
   @override
@@ -240,7 +239,7 @@
           args: <String, Object>{
             'value': platform,
           });
-      printStatus('Switched operating system to $platform');
+      globals.printStatus('Switched operating system to $platform');
     } on vmservice.RPCError {
       return;
     }
@@ -353,7 +352,7 @@
   }) : super(
           device,
           flutterProject: flutterProject,
-          target: target ?? fs.path.join('lib', 'main.dart'),
+          target: target ?? globals.fs.path.join('lib', 'main.dart'),
           debuggingOptions: debuggingOptions,
           ipv6: ipv6,
           stayResident: stayResident,
@@ -375,21 +374,21 @@
       applicationBinary: null,
     );
     if (package == null) {
-      printError('This application is not configured to build on the web.');
-      printError('To add web support to a project, run `flutter create .`.');
+      globals.printError('This application is not configured to build on the web.');
+      globals.printError('To add web support to a project, run `flutter create .`.');
       return 1;
     }
-    if (!fs.isFileSync(mainPath)) {
+    if (!globals.fs.isFileSync(mainPath)) {
       String message = 'Tried to run $mainPath, but that file does not exist.';
       if (target == null) {
         message +=
             '\nConsider using the -t option to specify the Dart file to start.';
       }
-      printError(message);
+      globals.printError(message);
       return 1;
     }
     final String modeName = debuggingOptions.buildInfo.friendlyModeName;
-    printStatus('Launching ${getDisplayPath(target)} on ${device.device.name} in $modeName mode...');
+    globals.printStatus('Launching ${getDisplayPath(target)} on ${device.device.name} in $modeName mode...');
     final String effectiveHostname = debuggingOptions.hostname ?? 'localhost';
     final int hostPort = debuggingOptions.port == null
         ? await os.findFreePort()
@@ -424,7 +423,7 @@
     bool benchmarkMode = false,
   }) async {
     final Stopwatch timer = Stopwatch()..start();
-    final Status status = logger.startProgress(
+    final Status status = globals.logger.startProgress(
       'Performing hot restart...',
       timeout: supportsServiceProtocol
           ? timeoutConfiguration.fastOperation
@@ -454,13 +453,13 @@
         });
       }
     } on WipError catch (err) {
-      printError(err.toString());
+      globals.printError(err.toString());
       return OperationResult(1, err.toString());
     } finally {
       status.stop();
     }
     final String verb = fullRestart ? 'Restarted' : 'Reloaded';
-    printStatus('$verb application in ${getElapsedAsMilliseconds(timer.elapsed)}.');
+    globals.printStatus('$verb application in ${getElapsedAsMilliseconds(timer.elapsed)}.');
     if (!fullRestart) {
       flutterUsage.sendTiming('hot', 'web-incremental-restart', timer.elapsed);
     }
@@ -479,7 +478,7 @@
     final bool isFirstUpload = !assetBundle.wasBuiltOnce();
     final bool rebuildBundle = assetBundle.needsBuild();
     if (rebuildBundle) {
-      printTrace('Updating assets');
+      globals.printTrace('Updating assets');
       final int result = await assetBundle.build();
       if (result != 0) {
         return UpdateFSReport(success: false);
@@ -491,7 +490,7 @@
       urisToMonitor: device.devFS.sources,
       packagesPath: packagesFilePath,
     );
-    final Status devFSStatus = logger.startProgress(
+    final Status devFSStatus = globals.logger.startProgress(
       'Syncing files to device ${device.device.name}...',
       timeout: timeoutConfiguration.fastOperation,
     );
@@ -510,7 +509,7 @@
       trackWidgetCreation: true,
     );
     devFSStatus.stop();
-    printTrace('Synced ${getSizeAsMB(report.syncedBytes)}.');
+    globals.printTrace('Synced ${getSizeAsMB(report.syncedBytes)}.');
     return report;
   }
 
@@ -552,7 +551,7 @@
   }) : super(
           device,
           flutterProject: flutterProject,
-          target: target ?? fs.path.join('lib', 'main.dart'),
+          target: target ?? globals.fs.path.join('lib', 'main.dart'),
           debuggingOptions: debuggingOptions,
           ipv6: ipv6,
           stayResident: stayResident,
@@ -573,21 +572,21 @@
       applicationBinary: null,
     );
     if (package == null) {
-      printError('This application is not configured to build on the web.');
-      printError('To add web support to a project, run `flutter create .`.');
+      globals.printError('This application is not configured to build on the web.');
+      globals.printError('To add web support to a project, run `flutter create .`.');
       return 1;
     }
-    if (!fs.isFileSync(mainPath)) {
+    if (!globals.fs.isFileSync(mainPath)) {
       String message = 'Tried to run $mainPath, but that file does not exist.';
       if (target == null) {
         message +=
             '\nConsider using the -t option to specify the Dart file to start.';
       }
-      printError(message);
+      globals.printError(message);
       return 1;
     }
     final String modeName = debuggingOptions.buildInfo.friendlyModeName;
-    printStatus(
+    globals.printStatus(
         'Launching ${getDisplayPath(target)} on ${device.device.name} in $modeName mode...');
     Status buildStatus;
     bool statusActive = false;
@@ -595,7 +594,7 @@
       // dwds does not handle uncaught exceptions from its servers. To work
       // around this, we need to catch all uncaught exceptions and determine if
       // they are fatal or not.
-      buildStatus = logger.startProgress('Building application for the web...', timeout: null);
+      buildStatus = globals.logger.startProgress('Building application for the web...', timeout: null);
       statusActive = true;
       final int result = await asyncGuard(() async {
         _webFs = await webFsFactory(
@@ -614,7 +613,7 @@
         buildStatus.stop();
         statusActive = false;
         if (supportsServiceProtocol) {
-          buildStatus = logger.startProgress(
+          buildStatus = globals.logger.startProgress(
             'Attempting to connect to browser instance..',
             timeout: const Duration(seconds: 30),
           );
@@ -697,7 +696,7 @@
     bool benchmarkMode = false,
   }) async {
     final Stopwatch timer = Stopwatch()..start();
-    final Status status = logger.startProgress(
+    final Status status = globals.logger.startProgress(
       'Performing hot restart...',
       timeout: supportsServiceProtocol
           ? timeoutConfiguration.fastOperation
@@ -718,7 +717,7 @@
           ? await _vmService.callServiceExtension('fullReload')
           : await _vmService.callServiceExtension('hotRestart');
         final String verb = fullRestart ? 'Restarted' : 'Reloaded';
-        printStatus(
+        globals.printStatus(
             '$verb application in ${getElapsedAsMilliseconds(timer.elapsed)}.');
 
         // Send timing analytics for full restart and for refresh.
@@ -761,7 +760,7 @@
       }
     }
     status.stop();
-    printStatus('Recompile complete. Page requires refresh.');
+    globals.printStatus('Recompile complete. Page requires refresh.');
     return OperationResult.ok;
   }
 
@@ -788,7 +787,7 @@
       }
       _stdOutSub = _vmService.onStdoutEvent.listen((vmservice.Event log) {
         final String message = utf8.decode(base64.decode(log.bytes)).trim();
-        printStatus(message);
+        globals.printStatus(message);
       });
       unawaited(_vmService.registerService('reloadSources', 'FlutterTools'));
       websocketUri = Uri.parse(_connectionResult.debugConnection.uri);
@@ -807,7 +806,7 @@
       }
     }
     if (websocketUri != null) {
-      printStatus('Debug service listening on $websocketUri');
+      globals.printStatus('Debug service listening on $websocketUri');
     }
     connectionInfoCompleter?.complete(DebugConnectionInfo(wsUri: websocketUri));
 
diff --git a/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart b/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart
index 4f8ae4f..de5f20d 100644
--- a/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart
+++ b/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart
@@ -16,6 +16,7 @@
 import '../base/file_system.dart';
 import '../build_info.dart';
 import '../convert.dart';
+import '../globals.dart' as globals;
 import '../platform_plugins.dart';
 import '../plugins.dart';
 import '../project.dart';
@@ -81,14 +82,14 @@
         .listSync()
         .whereType<Directory>();
       for (Directory childDirectory in childDirectories) {
-        final String path = fs.path.join(testOutputDir, 'packages',
-            fs.path.basename(childDirectory.path));
-        copyDirectorySync(childDirectory.childDirectory('lib'), fs.directory(path));
+        final String path = globals.fs.path.join(testOutputDir, 'packages',
+            globals.fs.path.basename(childDirectory.path));
+        copyDirectorySync(childDirectory.childDirectory('lib'), globals.fs.directory(path));
       }
       final Directory outputDirectory = rootDirectory
           .childDirectory(projectName)
           .childDirectory('test');
-      copyDirectorySync(outputDirectory, fs.directory(fs.path.join(testOutputDir)));
+      copyDirectorySync(outputDirectory, globals.fs.directory(globals.fs.path.join(testOutputDir)));
     }
     return success;
   }
@@ -133,18 +134,18 @@
   @override
   Stream<AssetId> findAssets(Glob glob, {String package}) async* {
     if (package == null || packageGraph.root.name == package) {
-      final String generatedRoot = fs.path.join(generatedDirectory.path, packageGraph.root.name);
+      final String generatedRoot = globals.fs.path.join(generatedDirectory.path, packageGraph.root.name);
       await for (io.FileSystemEntity entity in glob.list(followLinks: true, root: packageGraph.root.path)) {
-        if (entity is io.File && _isNotHidden(entity) && !fs.path.isWithin(generatedRoot, entity.path)) {
+        if (entity is io.File && _isNotHidden(entity) && !globals.fs.path.isWithin(generatedRoot, entity.path)) {
           yield _fileToAssetId(entity, packageGraph.root);
         }
       }
-      if (!fs.isDirectorySync(generatedRoot)) {
+      if (!globals.fs.isDirectorySync(generatedRoot)) {
         return;
       }
       await for (io.FileSystemEntity entity in glob.list(followLinks: true, root: generatedRoot)) {
         if (entity is io.File && _isNotHidden(entity)) {
-          yield _fileToAssetId(entity, packageGraph.root, fs.path.relative(generatedRoot), true);
+          yield _fileToAssetId(entity, packageGraph.root, globals.fs.path.relative(generatedRoot), true);
         }
       }
       return;
@@ -157,11 +158,11 @@
   }
 
   bool _missingSource(AssetId id) {
-    return !fs.file(path.joinAll(<String>[packageGraph.root.path, ...id.pathSegments])).existsSync();
+    return !globals.fs.file(path.joinAll(<String>[packageGraph.root.path, ...id.pathSegments])).existsSync();
   }
 
   File _generatedFile(AssetId id) {
-    return fs.file(
+    return globals.fs.file(
       path.joinAll(<String>[generatedDirectory.path, packageGraph.root.name, ...id.pathSegments])
     );
   }
diff --git a/packages/flutter_tools/lib/src/build_runner/web_fs.dart b/packages/flutter_tools/lib/src/build_runner/web_fs.dart
index b996a67..1e9c0bd 100644
--- a/packages/flutter_tools/lib/src/build_runner/web_fs.dart
+++ b/packages/flutter_tools/lib/src/build_runner/web_fs.dart
@@ -28,13 +28,12 @@
 import '../base/io.dart';
 import '../base/net.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../build_info.dart';
 import '../bundle.dart';
 import '../cache.dart';
 import '../dart/package_map.dart';
 import '../dart/pub.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../platform_plugins.dart';
 import '../plugins.dart';
 import '../project.dart';
@@ -186,8 +185,8 @@
       flutterProject.dartTool.createSync(recursive: true);
     }
     // Workaround for https://github.com/flutter/flutter/issues/41681.
-    final String toolPath = fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools');
-    if (!fs.isFileSync(fs.path.join(toolPath, '.packages'))) {
+    final String toolPath = globals.fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools');
+    if (!globals.fs.isFileSync(globals.fs.path.join(toolPath, '.packages'))) {
       await pub.get(
         context: PubContext.pubGet,
         directory: toolPath,
@@ -202,10 +201,10 @@
     // Initialize the asset bundle.
     final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle();
     await assetBundle.build();
-    await writeBundle(fs.directory(getAssetBuildDirectory()), assetBundle.entries);
+    await writeBundle(globals.fs.directory(getAssetBuildDirectory()), assetBundle.entries);
 
-    final String targetBaseName = fs.path
-      .withoutExtension(target).replaceFirst('lib${fs.path.separator}', '');
+    final String targetBaseName = globals.fs.path
+      .withoutExtension(target).replaceFirst('lib${globals.fs.path.separator}', '');
     final Map<String, String> mappedUrls = <String, String>{
       'main.dart.js': 'packages/${flutterProject.manifest.appName}/'
           '${targetBaseName}_web_entrypoint.dart.js',
@@ -251,7 +250,7 @@
           .any((Plugin p) => p.platforms.containsKey(WebPlugin.kConfigKey));
       // Start the build daemon and run an initial build.
       client = await buildDaemonCreator
-        .startBuildDaemon(fs.currentDirectory.path,
+        .startBuildDaemon(globals.fs.currentDirectory.path,
             release: buildInfo.isRelease,
             profile: buildInfo.isProfile,
             hasPlugins: hasWebPlugins,
@@ -279,12 +278,12 @@
           firstBuildCompleter.complete(true);
         }
       });
-      final int daemonAssetPort = buildDaemonCreator.assetServerPort(fs.currentDirectory);
+      final int daemonAssetPort = buildDaemonCreator.assetServerPort(globals.fs.currentDirectory);
 
       // Initialize the asset bundle.
       final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle();
       await assetBundle.build();
-      await writeBundle(fs.directory(getAssetBuildDirectory()), assetBundle.entries);
+      await writeBundle(globals.fs.directory(getAssetBuildDirectory()), assetBundle.entries);
       if (!skipDwds) {
         final BuildRunnerAssetHandler assetHandler = BuildRunnerAssetHandler(
           daemonAssetPort,
@@ -303,7 +302,7 @@
           verbose: false,
           enableDebugExtension: true,
           urlEncoder: urlTunneller,
-          logWriter: (dynamic level, String message) => printTrace(message),
+          logWriter: (dynamic level, String message) => globals.printTrace(message),
         );
         handler = pipeline.addHandler(dwds.handler);
       } else {
@@ -360,9 +359,9 @@
 class ReleaseAssetServer extends AssetServer {
   // Locations where source files, assets, or source maps may be located.
   final List<Uri> _searchPaths = <Uri>[
-    fs.directory(getWebBuildDirectory()).uri,
-    fs.directory(Cache.flutterRoot).parent.uri,
-    fs.currentDirectory.childDirectory('lib').uri,
+    globals.fs.directory(getWebBuildDirectory()).uri,
+    globals.fs.directory(Cache.flutterRoot).parent.uri,
+    globals.fs.currentDirectory.childDirectory('lib').uri,
   ];
 
   @override
@@ -370,7 +369,7 @@
     Uri fileUri;
     for (Uri uri in _searchPaths) {
       final Uri potential = uri.resolve(request.url.path);
-      if (potential == null || !fs.isFileSync(potential.toFilePath())) {
+      if (potential == null || !globals.fs.isFileSync(potential.toFilePath())) {
         continue;
       }
       fileUri = potential;
@@ -378,7 +377,7 @@
     }
 
     if (fileUri != null) {
-      final File file = fs.file(fileUri);
+      final File file = globals.fs.file(fileUri);
       final Uint8List bytes = file.readAsBytesSync();
       // Fallback to "application/octet-stream" on null which
       // makes no claims as to the structure of the data.
@@ -389,7 +388,7 @@
       });
     }
     if (request.url.path == '') {
-      final File file = fs.file(fs.path.join(getWebBuildDirectory(), 'index.html'));
+      final File file = globals.fs.file(globals.fs.path.join(getWebBuildDirectory(), 'index.html'));
       return Response.ok(file.readAsBytesSync(), headers: <String, String>{
         'Content-Type': 'text/html',
       });
@@ -410,7 +409,7 @@
   Future<Response> handle(Request request) async {
     if (request.url.path.endsWith('.html')) {
       final Uri htmlUri = flutterProject.web.directory.uri.resolveUri(request.url);
-      final File htmlFile = fs.file(htmlUri);
+      final File htmlFile = globals.fs.file(htmlUri);
       if (htmlFile.existsSync()) {
         return Response.ok(htmlFile.readAsBytesSync(), headers: <String, String>{
           'Content-Type': 'text/html',
@@ -418,8 +417,8 @@
       }
       return Response.notFound('');
     } else if (request.url.path.contains('stack_trace_mapper')) {
-      final File file = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.engineDartSdkPath),
+      final File file = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
         'lib',
         'dev_compiler',
         'web',
@@ -434,7 +433,7 @@
       // entrypoint + a "part" suffix (Though the actual names are arbitrary).
       // To make this easier to deal with they are copied into a temp directory.
       if (partFiles == null) {
-        final File dart2jsArchive = fs.file(fs.path.join(
+        final File dart2jsArchive = globals.fs.file(globals.fs.path.join(
           flutterProject.dartTool.path,
           'build',
           'flutter_web',
@@ -444,20 +443,20 @@
         ));
         if (dart2jsArchive.existsSync()) {
           final Archive archive = TarDecoder().decodeBytes(dart2jsArchive.readAsBytesSync());
-          partFiles = fs.systemTempDirectory.createTempSync('flutter_tool.')
+          partFiles = globals.fs.systemTempDirectory.createTempSync('flutter_tool.')
             ..createSync();
           for (ArchiveFile file in archive) {
             partFiles.childFile(file.name).writeAsBytesSync(file.content as List<int>);
           }
         }
       }
-      final String fileName = fs.path.basename(request.url.path);
+      final String fileName = globals.fs.path.basename(request.url.path);
       return Response.ok(partFiles.childFile(fileName).readAsBytesSync(), headers: <String, String>{
         'Content-Type': 'text/javascript',
       });
     } else if (request.url.path.contains('require.js')) {
-      final File file = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.engineDartSdkPath),
+      final File file = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
         'lib',
         'dev_compiler',
         'kernel',
@@ -468,16 +467,16 @@
         'Content-Type': 'text/javascript',
       });
     } else if (request.url.path.endsWith('dart_sdk.js.map')) {
-      final File file = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.flutterWebSdk),
+      final File file = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.flutterWebSdk),
         'kernel',
         'amd',
         'dart_sdk.js.map',
       ));
       return Response.ok(file.readAsBytesSync());
     } else if (request.url.path.endsWith('dart_sdk.js')) {
-      final File file = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.flutterWebSdk),
+      final File file = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.flutterWebSdk),
         'kernel',
         'amd',
         'dart_sdk.js',
@@ -498,16 +497,16 @@
       // Handle sdk requests that have mangled urls from engine build.
       if (request.url.path.contains('dart-sdk')) {
         // Note: the request is a uri and not a file path, so they always use `/`.
-        final String sdkPath = fs.path.joinAll(request.url.path.split('dart-sdk/').last.split('/'));
-        final String dartSdkPath = artifacts.getArtifactPath(Artifact.engineDartSdkPath);
-        final File candidateFile = fs.file(fs.path.join(dartSdkPath, sdkPath));
+        final String sdkPath = globals.fs.path.joinAll(request.url.path.split('dart-sdk/').last.split('/'));
+        final String dartSdkPath = globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath);
+        final File candidateFile = globals.fs.file(globals.fs.path.join(dartSdkPath, sdkPath));
         return Response.ok(candidateFile.readAsBytesSync());
       }
 
       // See if it is a flutter sdk path.
-      final String webSdkPath = artifacts.getArtifactPath(Artifact.flutterWebSdk);
-      final File candidateFile = fs.file(fs.path.join(webSdkPath,
-        basePath.split('/').join(platform.pathSeparator)));
+      final String webSdkPath = globals.artifacts.getArtifactPath(Artifact.flutterWebSdk);
+      final File candidateFile = globals.fs.file(globals.fs.path.join(webSdkPath,
+        basePath.split('/').join(globals.platform.pathSeparator)));
       if (candidateFile.existsSync()) {
         return Response.ok(candidateFile.readAsBytesSync());
       }
@@ -515,25 +514,25 @@
       final String packageName = request.url.pathSegments.length == 1
           ? flutterProject.manifest.appName
           : request.url.pathSegments.first;
-      String filePath = fs.path.joinAll(request.url.pathSegments.length == 1
+      String filePath = globals.fs.path.joinAll(request.url.pathSegments.length == 1
           ? request.url.pathSegments
           : request.url.pathSegments.skip(1));
-      String packagePath = packageMap.map[packageName]?.toFilePath(windows: platform.isWindows);
+      String packagePath = packageMap.map[packageName]?.toFilePath(windows: globals.platform.isWindows);
       // If the package isn't found, then we have an issue with relative
       // paths within the main project.
       if (packagePath == null) {
         packagePath = packageMap.map[flutterProject.manifest.appName]
-            .toFilePath(windows: platform.isWindows);
+            .toFilePath(windows: globals.platform.isWindows);
         filePath = request.url.path;
       }
-      final File file = fs.file(fs.path.join(packagePath, filePath));
+      final File file = globals.fs.file(globals.fs.path.join(packagePath, filePath));
       if (file.existsSync()) {
         return Response.ok(file.readAsBytesSync());
       }
       return Response.notFound('');
     } else if (request.url.path.contains('assets')) {
       final String assetPath = request.url.path.replaceFirst('assets/', '');
-      final File file = fs.file(fs.path.join(getAssetBuildDirectory(), assetPath));
+      final File file = globals.fs.file(globals.fs.path.join(getAssetBuildDirectory(), assetPath));
       if (file.existsSync()) {
         final Uint8List bytes = file.readAsBytesSync();
         // Fallback to "application/octet-stream" on null which
@@ -643,15 +642,15 @@
     bool initializePlatform,
     WebTestTargetManifest testTargets,
   }) {
-    final String flutterToolsPackages = fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools', '.packages');
-    final String buildScript = fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools', 'lib', 'src', 'build_runner', 'build_script.dart');
-    final String flutterWebSdk = artifacts.getArtifactPath(Artifact.flutterWebSdk);
+    final String flutterToolsPackages = globals.fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools', '.packages');
+    final String buildScript = globals.fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools', 'lib', 'src', 'build_runner', 'build_script.dart');
+    final String flutterWebSdk = globals.artifacts.getArtifactPath(Artifact.flutterWebSdk);
 
     // On Windows we need to call the snapshot directly otherwise
     // the process will start in a disjoint cmd without access to
     // STDIO.
     final List<String> args = <String>[
-      artifacts.getArtifactPath(Artifact.engineDartBinary),
+      globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
       '--packages=$flutterToolsPackages',
       buildScript,
       'daemon',
@@ -682,19 +681,19 @@
                 serverLog.message.contains(_ignoredLine3)) {
               return;
             }
-            printError(serverLog.message);
+            globals.printError(serverLog.message);
             if (serverLog.error != null) {
-              printError(serverLog.error);
+              globals.printError(serverLog.error);
             }
             if (serverLog.stackTrace != null) {
-              printTrace(serverLog.stackTrace);
+              globals.printTrace(serverLog.stackTrace);
             }
             break;
           default:
             if (serverLog.message.contains('Skipping compiling')) {
-              printError(serverLog.message);
+              globals.printError(serverLog.message);
             } else {
-              printTrace(serverLog.message);
+              globals.printTrace(serverLog.message);
             }
         }
       },
@@ -704,7 +703,7 @@
 
   /// Retrieve the asset server port for the current daemon.
   int assetServerPort(Directory workingDirectory) {
-    final String portFilePath = fs.path.join(daemon.daemonWorkspace(workingDirectory.path), '.asset_server_port');
-    return int.tryParse(fs.file(portFilePath).readAsStringSync());
+    final String portFilePath = globals.fs.path.join(daemon.daemonWorkspace(workingDirectory.path), '.asset_server_port');
+    return int.tryParse(globals.fs.file(portFilePath).readAsStringSync());
   }
 }
diff --git a/packages/flutter_tools/lib/src/build_system/build_system.dart b/packages/flutter_tools/lib/src/build_system/build_system.dart
index f8c25d4d..1f67a56 100644
--- a/packages/flutter_tools/lib/src/build_system/build_system.dart
+++ b/packages/flutter_tools/lib/src/build_system/build_system.dart
@@ -12,11 +12,10 @@
 
 import '../base/context.dart';
 import '../base/file_system.dart';
-import '../base/platform.dart';
 import '../base/utils.dart';
 import '../cache.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'exceptions.dart';
 import 'file_hash_store.dart';
 import 'source.dart';
@@ -256,7 +255,7 @@
 /// Use a hard-coded path or directory relative to the current working
 /// directory to write an output file.
 ///
-///   fs.file('build/linux/out')
+///   globals.fs.file('build/linux/out')
 ///     ..createSync()
 ///     ..writeAsStringSync('output data');
 ///
@@ -309,9 +308,9 @@
       projectDir: projectDir,
       buildDir: buildDirectory,
       rootBuildDir: rootBuildDir,
-      cacheDir: Cache.instance.getRoot(),
+      cacheDir: globals.cache.getRoot(),
       defines: defines,
-      flutterRootDir: fs.directory(Cache.flutterRoot),
+      flutterRootDir: globals.fs.directory(Cache.flutterRoot),
     );
   }
 
@@ -411,7 +410,7 @@
     environment.outputDir.createSync(recursive: true);
 
     // Load file hash store from previous builds.
-    final FileHashStore fileCache = FileHashStore(environment, fs)
+    final FileHashStore fileCache = FileHashStore(environment, globals.fs)
       ..initialize();
 
     // Perform sanity checks on build.
@@ -461,7 +460,7 @@
 /// An active instance of a build.
 class _BuildInstance {
   _BuildInstance(this.environment, this.fileCache, this.buildSystemConfig)
-    : resourcePool = Pool(buildSystemConfig.resourcePoolSize ?? platform?.numberOfProcessors ?? 1);
+    : resourcePool = Pool(buildSystemConfig.resourcePoolSize ?? globals.platform?.numberOfProcessors ?? 1);
 
   final BuildSystemConfig buildSystemConfig;
   final Pool resourcePool;
@@ -523,13 +522,13 @@
 
       if (canSkip) {
         skipped = true;
-        printTrace('Skipping target: ${node.target.name}');
+        globals.printTrace('Skipping target: ${node.target.name}');
         updateGraph();
         return passed;
       }
-      printTrace('${node.target.name}: Starting due to ${node.invalidatedReasons}');
+      globals.printTrace('${node.target.name}: Starting due to ${node.invalidatedReasons}');
       await node.target.build(environment);
-      printTrace('${node.target.name}: Complete');
+      globals.printTrace('${node.target.name}: Complete');
 
       node.inputs
         ..clear()
@@ -555,7 +554,7 @@
         if (outputFiles.containsKey(previousOutput)) {
           continue;
         }
-        final File previousFile = fs.file(previousOutput);
+        final File previousFile = globals.fs.file(previousOutput);
         if (previousFile.existsSync()) {
           previousFile.deleteSync();
         }
@@ -769,7 +768,7 @@
         // if this isn't a current output file there is no reason to compute the hash.
         continue;
       }
-      final File file = fs.file(previousOutput);
+      final File file = globals.fs.file(previousOutput);
       if (!file.existsSync()) {
         invalidatedReasons.add(InvalidatedReason.outputMissing);
         _dirty = true;
@@ -794,7 +793,7 @@
     if (missingInputs.isNotEmpty) {
       _dirty = true;
       final String missingMessage = missingInputs.map((File file) => file.path).join(', ');
-      printTrace('invalidated build due to missing files: $missingMessage');
+      globals.printTrace('invalidated build due to missing files: $missingMessage');
       invalidatedReasons.add(InvalidatedReason.inputMissing);
     }
 
diff --git a/packages/flutter_tools/lib/src/build_system/depfile.dart b/packages/flutter_tools/lib/src/build_system/depfile.dart
index 4d815c0..6e777af 100644
--- a/packages/flutter_tools/lib/src/build_system/depfile.dart
+++ b/packages/flutter_tools/lib/src/build_system/depfile.dart
@@ -3,8 +3,7 @@
 // found in the LICENSE file.
 
 import '../base/file_system.dart';
-import '../base/platform.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 /// A class for representing depfile formats.
 class Depfile {
@@ -18,7 +17,7 @@
     final String contents = file.readAsStringSync();
     final List<String> colonSeparated = contents.split(': ');
     if (colonSeparated.length != 2) {
-      printError('Invalid depfile: ${file.path}');
+      globals.printError('Invalid depfile: ${file.path}');
       return const Depfile(<File>[], <File>[]);
     }
     final List<File> inputs = _processList(colonSeparated[1].trim());
@@ -43,7 +42,7 @@
       if (fileUri.scheme != 'file') {
         continue;
       }
-      inputs.add(fs.file(fileUri));
+      inputs.add(globals.fs.file(fileUri));
     }
     return Depfile(inputs, <File>[output]);
   }
@@ -74,7 +73,7 @@
 
   void _writeFilesToBuffer(List<File> files, StringBuffer buffer) {
     for (File outputFile in files) {
-      if (platform.isWindows) {
+      if (globals.platform.isWindows) {
         // Paths in a depfile have to be escaped on windows.
         final String escapedPath = outputFile.path.replaceAll(r'\', r'\\');
         buffer.write(' $escapedPath');
@@ -98,7 +97,7 @@
     // The tool doesn't write duplicates to these lists. This call is an attempt to
     // be resillient to the outputs of other tools which write or user edits to depfiles.
         .toSet()
-        .map((String path) => fs.file(path))
+        .map((String path) => globals.fs.file(path))
         .toList();
   }
 }
diff --git a/packages/flutter_tools/lib/src/build_system/file_hash_store.dart b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
index 9d687b1..72925ee 100644
--- a/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
+++ b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
@@ -12,7 +12,7 @@
 import '../base/file_system.dart';
 import '../base/utils.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'build_system.dart';
 
 /// An encoded representation of all file hashes.
@@ -88,7 +88,7 @@
 
   /// Read file hashes from disk.
   void initialize() {
-    printTrace('Initializing file store');
+    globals.printTrace('Initializing file store');
     final File cacheFile = fileSystem.file(_cachePath);
     if (!cacheFile.existsSync()) {
       return;
@@ -97,7 +97,7 @@
     try {
       data = cacheFile.readAsBytesSync();
     } on FileSystemException catch (err) {
-      printError(
+      globals.printError(
         'Failed to read file store at ${cacheFile.path} due to $err.\n'
         'Build artifacts will not be cached. Try clearing the cache directories '
         'with "flutter clean"',
@@ -109,24 +109,24 @@
     try {
       fileStorage = FileStorage.fromBuffer(data);
     } catch (err) {
-      printTrace('Filestorage format changed');
+      globals.printTrace('Filestorage format changed');
       cacheFile.deleteSync();
       return;
     }
     if (fileStorage.version != _kVersion) {
-      printTrace('file cache format updating, clearing old hashes.');
+      globals.printTrace('file cache format updating, clearing old hashes.');
       cacheFile.deleteSync();
       return;
     }
     for (FileHash fileHash in fileStorage.files) {
       previousHashes[fileHash.path] = fileHash.hash;
     }
-    printTrace('Done initializing file store');
+    globals.printTrace('Done initializing file store');
   }
 
   /// Persist file hashes to disk.
   void persist() {
-    printTrace('Persisting file store');
+    globals.printTrace('Persisting file store');
     final File cacheFile = fileSystem.file(_cachePath);
     if (!cacheFile.existsSync()) {
       cacheFile.createSync(recursive: true);
@@ -143,13 +143,13 @@
     try {
       cacheFile.writeAsBytesSync(buffer);
     } on FileSystemException catch (err) {
-      printError(
+      globals.printError(
         'Failed to persist file store at ${cacheFile.path} due to $err.\n'
         'Build artifacts will not be cached. Try clearing the cache directories '
         'with "flutter clean"',
       );
     }
-    printTrace('Done persisting file store');
+    globals.printTrace('Done persisting file store');
   }
 
   /// Computes a hash of the provided files and returns a list of entities
diff --git a/packages/flutter_tools/lib/src/build_system/source.dart b/packages/flutter_tools/lib/src/build_system/source.dart
index c7f4385..eb35f95 100644
--- a/packages/flutter_tools/lib/src/build_system/source.dart
+++ b/packages/flutter_tools/lib/src/build_system/source.dart
@@ -5,7 +5,7 @@
 import '../artifacts.dart';
 import '../base/file_system.dart';
 import '../build_info.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'build_system.dart';
 import 'exceptions.dart';
 
@@ -56,7 +56,7 @@
     final String contents = depfile.readAsStringSync();
     final List<String> colonSeparated = contents.split(': ');
     if (colonSeparated.length != 2) {
-      printError('Invalid depfile: ${depfile.path}');
+      globals.printError('Invalid depfile: ${depfile.path}');
       return;
     }
     if (inputs) {
@@ -78,7 +78,7 @@
         .map<String>((String path) => path.replaceAllMapped(_escapeExpr, (Match match) => match.group(1)).trim())
         .where((String path) => path.isNotEmpty)
         .toSet()
-        .map((String path) => fs.file(path));
+        .map((String path) => globals.fs.file(path));
   }
 
   /// Visit a [Source] which contains a file URL.
@@ -101,35 +101,35 @@
     switch (rawParts.first) {
       case Environment.kProjectDirectory:
         segments.addAll(
-            fs.path.split(environment.projectDir.resolveSymbolicLinksSync()));
+            globals.fs.path.split(environment.projectDir.resolveSymbolicLinksSync()));
         break;
       case Environment.kBuildDirectory:
-        segments.addAll(fs.path.split(
+        segments.addAll(globals.fs.path.split(
             environment.buildDir.resolveSymbolicLinksSync()));
         break;
       case Environment.kCacheDirectory:
         segments.addAll(
-            fs.path.split(environment.cacheDir.resolveSymbolicLinksSync()));
+            globals.fs.path.split(environment.cacheDir.resolveSymbolicLinksSync()));
         break;
       case Environment.kFlutterRootDirectory:
         // flutter root will not contain a symbolic link.
         segments.addAll(
-            fs.path.split(environment.flutterRootDir.absolute.path));
+            globals.fs.path.split(environment.flutterRootDir.absolute.path));
         break;
       case Environment.kOutputDirectory:
         segments.addAll(
-            fs.path.split(environment.outputDir.resolveSymbolicLinksSync()));
+            globals.fs.path.split(environment.outputDir.resolveSymbolicLinksSync()));
         break;
       default:
         throw InvalidPatternException(pattern);
     }
     rawParts.skip(1).forEach(segments.add);
-    final String filePath = fs.path.joinAll(segments);
+    final String filePath = globals.fs.path.joinAll(segments);
     if (!hasWildcard) {
-      if (optional && !fs.isFileSync(filePath)) {
+      if (optional && !globals.fs.isFileSync(filePath)) {
         return;
       }
-      sources.add(fs.file(fs.path.normalize(filePath)));
+      sources.add(globals.fs.file(globals.fs.path.normalize(filePath)));
       return;
     }
     // Perform a simple match by splitting the wildcard containing file one
@@ -143,21 +143,21 @@
     if (wildcardSegments.length > 2) {
       throw InvalidPatternException(pattern);
     }
-    if (!fs.directory(filePath).existsSync()) {
+    if (!globals.fs.directory(filePath).existsSync()) {
       throw Exception('$filePath does not exist!');
     }
-    for (FileSystemEntity entity in fs.directory(filePath).listSync()) {
-      final String filename = fs.path.basename(entity.path);
+    for (FileSystemEntity entity in globals.fs.directory(filePath).listSync()) {
+      final String filename = globals.fs.path.basename(entity.path);
       if (wildcardSegments.isEmpty) {
-        sources.add(fs.file(entity.absolute));
+        sources.add(globals.fs.file(entity.absolute));
       } else if (wildcardSegments.length == 1) {
         if (filename.startsWith(wildcardSegments[0]) ||
             filename.endsWith(wildcardSegments[0])) {
-          sources.add(fs.file(entity.absolute));
+          sources.add(globals.fs.file(entity.absolute));
         }
       } else if (filename.startsWith(wildcardSegments[0])) {
         if (filename.substring(wildcardSegments[0].length).endsWith(wildcardSegments[1])) {
-          sources.add(fs.file(entity.absolute));
+          sources.add(globals.fs.file(entity.absolute));
         }
       }
     }
@@ -167,15 +167,15 @@
   ///
   /// If the [Artifact] points to a directory then all child files are included.
   void visitArtifact(Artifact artifact, TargetPlatform platform, BuildMode mode) {
-    final String path = artifacts.getArtifactPath(artifact, platform: platform, mode: mode);
-    if (fs.isDirectorySync(path)) {
+    final String path = globals.artifacts.getArtifactPath(artifact, platform: platform, mode: mode);
+    if (globals.fs.isDirectorySync(path)) {
       sources.addAll(<File>[
-        for (FileSystemEntity entity in fs.directory(path).listSync(recursive: true))
+        for (FileSystemEntity entity in globals.fs.directory(path).listSync(recursive: true))
           if (entity is File)
             entity,
       ]);
     } else {
-      sources.add(fs.file(path));
+      sources.add(globals.fs.file(path));
     }
   }
 }
diff --git a/packages/flutter_tools/lib/src/build_system/targets/android.dart b/packages/flutter_tools/lib/src/build_system/targets/android.dart
index 45ad5d6..cc282be 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/android.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/android.dart
@@ -6,7 +6,7 @@
 import '../../base/build.dart';
 import '../../base/file_system.dart';
 import '../../build_info.dart';
-import '../../globals.dart';
+import '../../globals.dart' as globals;
 import '../build_system.dart';
 import '../depfile.dart';
 import '../exceptions.dart';
@@ -50,13 +50,13 @@
 
     // Only copy the prebuilt runtimes and kernel blob in debug mode.
     if (buildMode == BuildMode.debug) {
-      final String vmSnapshotData = artifacts.getArtifactPath(Artifact.vmSnapshotData, mode: BuildMode.debug);
-      final String isolateSnapshotData = artifacts.getArtifactPath(Artifact.isolateSnapshotData, mode: BuildMode.debug);
+      final String vmSnapshotData = globals.artifacts.getArtifactPath(Artifact.vmSnapshotData, mode: BuildMode.debug);
+      final String isolateSnapshotData = globals.artifacts.getArtifactPath(Artifact.isolateSnapshotData, mode: BuildMode.debug);
       environment.buildDir.childFile('app.dill')
           .copySync(outputDirectory.childFile('kernel_blob.bin').path);
-      fs.file(vmSnapshotData)
+      globals.fs.file(vmSnapshotData)
           .copySync(outputDirectory.childFile('vm_snapshot_data').path);
-      fs.file(isolateSnapshotData)
+      globals.fs.file(isolateSnapshotData)
           .copySync(outputDirectory.childFile('isolate_snapshot_data').path);
     }
     if (_copyAssets) {
diff --git a/packages/flutter_tools/lib/src/build_system/targets/assets.dart b/packages/flutter_tools/lib/src/build_system/targets/assets.dart
index 6080f11..fb3c3df 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/assets.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/assets.dart
@@ -7,6 +7,7 @@
 import '../../asset.dart';
 import '../../base/file_system.dart';
 import '../../devfs.dart';
+import '../../globals.dart' as globals;
 import '../../plugins.dart';
 import '../../project.dart';
 import '../build_system.dart';
@@ -39,12 +40,12 @@
         // to `%23.ext`.  However, we have to keep it this way since the
         // platform channels in the framework will URI encode these values,
         // and the native APIs will look for files this way.
-        final File file = fs.file(fs.path.join(outputDirectory.path, entry.key));
+        final File file = globals.fs.file(globals.fs.path.join(outputDirectory.path, entry.key));
         outputs.add(file);
         file.parent.createSync(recursive: true);
         final DevFSContent content = entry.value;
         if (content is DevFSFileContent && content.file is File) {
-          inputs.add(fs.file(content.file.path));
+          inputs.add(globals.fs.file(content.file.path));
           await (content.file as File).copy(file.path);
         } else {
           await file.writeAsBytes(await entry.value.contentsAsBytes());
diff --git a/packages/flutter_tools/lib/src/build_system/targets/dart.dart b/packages/flutter_tools/lib/src/build_system/targets/dart.dart
index 800cd12..ab237da 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/dart.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/dart.dart
@@ -8,7 +8,7 @@
 import '../../build_info.dart';
 import '../../compile.dart';
 import '../../convert.dart';
-import '../../globals.dart';
+import '../../globals.dart' as globals;
 import '../../project.dart';
 import '../build_system.dart';
 import '../depfile.dart';
@@ -99,13 +99,13 @@
 
     // Only copy the prebuilt runtimes and kernel blob in debug mode.
     if (buildMode == BuildMode.debug) {
-      final String vmSnapshotData = artifacts.getArtifactPath(Artifact.vmSnapshotData, mode: BuildMode.debug);
-      final String isolateSnapshotData = artifacts.getArtifactPath(Artifact.isolateSnapshotData, mode: BuildMode.debug);
+      final String vmSnapshotData = globals.artifacts.getArtifactPath(Artifact.vmSnapshotData, mode: BuildMode.debug);
+      final String isolateSnapshotData = globals.artifacts.getArtifactPath(Artifact.isolateSnapshotData, mode: BuildMode.debug);
       environment.buildDir.childFile('app.dill')
           .copySync(environment.outputDir.childFile('kernel_blob.bin').path);
-      fs.file(vmSnapshotData)
+      globals.fs.file(vmSnapshotData)
           .copySync(environment.outputDir.childFile('vm_snapshot_data').path);
-      fs.file(isolateSnapshotData)
+      globals.fs.file(isolateSnapshotData)
           .copySync(environment.outputDir.childFile('isolate_snapshot_data').path);
     }
     final Depfile assetDepfile = await copyAssets(environment, environment.outputDir);
@@ -180,9 +180,9 @@
       throw MissingDefineException(kTargetPlatform, 'kernel_snapshot');
     }
     final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
-    final String targetFile = environment.defines[kTargetFile] ?? fs.path.join('lib', 'main.dart');
+    final String targetFile = environment.defines[kTargetFile] ?? globals.fs.path.join('lib', 'main.dart');
     final String packagesPath = environment.projectDir.childFile('.packages').path;
-    final String targetFileAbsolute = fs.file(targetFile).absolute.path;
+    final String targetFileAbsolute = globals.fs.file(targetFile).absolute.path;
     // everything besides 'false' is considered to be enabled.
     final bool trackWidgetCreation = environment.defines[kTrackWidgetCreation] != 'false';
     final TargetPlatform targetPlatform = getTargetPlatformForName(environment.defines[kTargetPlatform]);
@@ -214,7 +214,7 @@
     }
 
     final CompilerOutput output = await compiler.compile(
-      sdkRoot: artifacts.getArtifactPath(
+      sdkRoot: globals.artifacts.getArtifactPath(
         Artifact.flutterPatchedSdkPath,
         platform: targetPlatform,
         mode: buildMode,
diff --git a/packages/flutter_tools/lib/src/build_system/targets/ios.dart b/packages/flutter_tools/lib/src/build_system/targets/ios.dart
index 47b41f4..1d9152a 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/ios.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/ios.dart
@@ -8,8 +8,8 @@
 import '../../base/file_system.dart';
 import '../../base/io.dart';
 import '../../base/process.dart';
-import '../../base/process_manager.dart';
 import '../../build_info.dart';
+import '../../globals.dart' as globals;
 import '../../macos/xcode.dart';
 import '../build_system.dart';
 import '../exceptions.dart';
@@ -65,7 +65,7 @@
           buildMode: buildMode,
           mainPath: environment.buildDir.childFile('app.dill').path,
           packagesPath: environment.projectDir.childFile('.packages').path,
-          outputPath: fs.path.join(buildOutputPath, getNameForDarwinArch(iosArch)),
+          outputPath: globals.fs.path.join(buildOutputPath, getNameForDarwinArch(iosArch)),
           darwinArch: iosArch,
           bitcode: bitcode,
         ));
@@ -74,13 +74,13 @@
       if (results.any((int result) => result != 0)) {
         throw Exception('AOT snapshotter exited with code ${results.join()}');
       }
-      final ProcessResult result = await processManager.run(<String>[
+      final ProcessResult result = await globals.processManager.run(<String>[
         'lipo',
         ...iosArchs.map((DarwinArch iosArch) =>
-            fs.path.join(buildOutputPath, getNameForDarwinArch(iosArch), 'App.framework', 'App')),
+            globals.fs.path.join(buildOutputPath, getNameForDarwinArch(iosArch), 'App.framework', 'App')),
         '-create',
         '-output',
-        fs.path.join(environment.outputDir.path, 'App.framework', 'App'),
+        globals.fs.path.join(environment.outputDir.path, 'App.framework', 'App'),
       ]);
       if (result.exitCode != 0) {
         throw Exception('lipo exited with code ${result.exitCode}');
@@ -164,7 +164,7 @@
     throwToolExit('Failed to create App.framework stub at ${outputFile.path}');
   }
 
-  final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_stub_source.');
+  final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_stub_source.');
   try {
     final File stubSource = tempDir.childFile('debug_app.cc')
       ..writeAsStringSync(r'''
diff --git a/packages/flutter_tools/lib/src/build_system/targets/linux.dart b/packages/flutter_tools/lib/src/build_system/targets/linux.dart
index 73c06da..706b788 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/linux.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/linux.dart
@@ -5,7 +5,7 @@
 import '../../artifacts.dart';
 import '../../base/file_system.dart';
 import '../../build_info.dart';
-import '../../globals.dart';
+import '../../globals.dart' as globals;
 import '../build_system.dart';
 import '../depfile.dart';
 import '../exceptions.dart';
@@ -48,10 +48,10 @@
 
   @override
   Future<void> build(Environment environment) async {
-    final String basePath = artifacts.getArtifactPath(Artifact.linuxDesktopPath);
+    final String basePath = globals.artifacts.getArtifactPath(Artifact.linuxDesktopPath);
     final List<File> inputs = <File>[];
     final List<File> outputs = <File>[];
-    final String outputPrefix = fs.path.join(
+    final String outputPrefix = globals.fs.path.join(
       environment.projectDir.path,
       'linux',
       'flutter',
@@ -60,18 +60,18 @@
     // The native linux artifacts are composed of 6 files and a directory (listed above)
     // which need to be copied to the target directory.
     for (String artifact in _kLinuxArtifacts) {
-      final String entityPath = fs.path.join(basePath, artifact);
+      final String entityPath = globals.fs.path.join(basePath, artifact);
       // If this artifact is a file, just copy the source over.
-      if (fs.isFileSync(entityPath)) {
-        final String outputPath = fs.path.join(
+      if (globals.fs.isFileSync(entityPath)) {
+        final String outputPath = globals.fs.path.join(
           outputPrefix,
-          fs.path.relative(entityPath, from: basePath),
+          globals.fs.path.relative(entityPath, from: basePath),
         );
-        final File destinationFile = fs.file(outputPath);
+        final File destinationFile = globals.fs.file(outputPath);
         if (!destinationFile.parent.existsSync()) {
           destinationFile.parent.createSync(recursive: true);
         }
-        final File inputFile = fs.file(entityPath);
+        final File inputFile = globals.fs.file(entityPath);
         inputFile.copySync(destinationFile.path);
         inputs.add(inputFile);
         outputs.add(destinationFile);
@@ -79,18 +79,18 @@
       }
       // If the artifact is the directory cpp_client_wrapper, recursively
       // copy every file from it.
-      for (File input in fs.directory(entityPath)
+      for (File input in globals.fs.directory(entityPath)
           .listSync(recursive: true)
           .whereType<File>()) {
-        final String outputPath = fs.path.join(
+        final String outputPath = globals.fs.path.join(
           outputPrefix,
-          fs.path.relative(input.path, from: basePath),
+          globals.fs.path.relative(input.path, from: basePath),
         );
-        final File destinationFile = fs.file(outputPath);
+        final File destinationFile = globals.fs.file(outputPath);
         if (!destinationFile.parent.existsSync()) {
           destinationFile.parent.createSync(recursive: true);
         }
-        final File inputFile = fs.file(input);
+        final File inputFile = globals.fs.file(input);
         inputFile.copySync(destinationFile.path);
         inputs.add(inputFile);
         outputs.add(destinationFile);
diff --git a/packages/flutter_tools/lib/src/build_system/targets/macos.dart b/packages/flutter_tools/lib/src/build_system/targets/macos.dart
index 950f8c0..fb9cd8c 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/macos.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/macos.dart
@@ -7,9 +7,8 @@
 import '../../base/file_system.dart';
 import '../../base/io.dart';
 import '../../base/process.dart';
-import '../../base/process_manager.dart';
 import '../../build_info.dart';
-import '../../globals.dart';
+import '../../globals.dart' as globals;
 import '../../macos/xcode.dart';
 import '../build_system.dart';
 import '../depfile.dart';
@@ -76,14 +75,14 @@
       throw MissingDefineException(kBuildMode, 'unpack_macos');
     }
     final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
-    final String basePath = artifacts.getArtifactPath(Artifact.flutterMacOSFramework, mode: buildMode);
+    final String basePath = globals.artifacts.getArtifactPath(Artifact.flutterMacOSFramework, mode: buildMode);
     final Directory targetDirectory = environment
       .outputDir
       .childDirectory('FlutterMacOS.framework');
     if (targetDirectory.existsSync()) {
       targetDirectory.deleteSync(recursive: true);
     }
-    final ProcessResult result = await processManager
+    final ProcessResult result = await globals.processManager
         .run(<String>['cp', '-R', basePath, targetDirectory.path]);
     if (result.exitCode != 0) {
       throw Exception(
@@ -149,7 +148,7 @@
 
   @override
   Future<void> build(Environment environment) async {
-    final File outputFile = fs.file(fs.path.join(
+    final File outputFile = globals.fs.file(globals.fs.path.join(
         environment.buildDir.path, 'App.framework', 'App'));
     outputFile.createSync(recursive: true);
     final File debugApp = environment.buildDir.childFile('debug_app.cc')
@@ -324,13 +323,13 @@
       }
       // Copy precompiled runtimes.
       try {
-        final String vmSnapshotData = artifacts.getArtifactPath(Artifact.vmSnapshotData,
+        final String vmSnapshotData = globals.artifacts.getArtifactPath(Artifact.vmSnapshotData,
             platform: TargetPlatform.darwin_x64, mode: BuildMode.debug);
-        final String isolateSnapshotData = artifacts.getArtifactPath(Artifact.isolateSnapshotData,
+        final String isolateSnapshotData = globals.artifacts.getArtifactPath(Artifact.isolateSnapshotData,
             platform: TargetPlatform.darwin_x64, mode: BuildMode.debug);
-        fs.file(vmSnapshotData).copySync(
+        globals.fs.file(vmSnapshotData).copySync(
             assetDirectory.childFile('vm_snapshot_data').path);
-        fs.file(isolateSnapshotData).copySync(
+        globals.fs.file(isolateSnapshotData).copySync(
             assetDirectory.childFile('isolate_snapshot_data').path);
       } catch (err) {
         throw Exception('Failed to copy precompiled runtimes: $err');
@@ -343,7 +342,7 @@
       final Link currentVersion = outputDirectory.parent
           .childLink('Current');
       if (!currentVersion.existsSync()) {
-        final String linkPath = fs.path.relative(outputDirectory.path,
+        final String linkPath = globals.fs.path.relative(outputDirectory.path,
             from: outputDirectory.parent.path);
         currentVersion.createSync(linkPath);
       }
@@ -351,7 +350,7 @@
       final Link currentResources = frameworkRootDirectory
           .childLink('Resources');
       if (!currentResources.existsSync()) {
-        final String linkPath = fs.path.relative(fs.path.join(currentVersion.path, 'Resources'),
+        final String linkPath = globals.fs.path.relative(globals.fs.path.join(currentVersion.path, 'Resources'),
             from: frameworkRootDirectory.path);
         currentResources.createSync(linkPath);
       }
@@ -359,7 +358,7 @@
       final Link currentFramework = frameworkRootDirectory
           .childLink('App');
       if (!currentFramework.existsSync()) {
-        final String linkPath = fs.path.relative(fs.path.join(currentVersion.path, 'App'),
+        final String linkPath = globals.fs.path.relative(globals.fs.path.join(currentVersion.path, 'App'),
             from: frameworkRootDirectory.path);
         currentFramework.createSync(linkPath);
       }
diff --git a/packages/flutter_tools/lib/src/build_system/targets/web.dart b/packages/flutter_tools/lib/src/build_system/targets/web.dart
index 96e52fa..97e0a00 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/web.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/web.dart
@@ -5,11 +5,10 @@
 import '../../artifacts.dart';
 import '../../base/file_system.dart';
 import '../../base/io.dart';
-import '../../base/process_manager.dart';
 import '../../build_info.dart';
 import '../../compile.dart';
 import '../../dart/package_map.dart';
-import '../../globals.dart';
+import '../../globals.dart' as globals;
 import '../../project.dart';
 import '../build_system.dart';
 import '../depfile.dart';
@@ -52,7 +51,7 @@
     final String targetFile = environment.defines[kTargetFile];
     final bool shouldInitializePlatform = environment.defines[kInitializePlatform] == 'true';
     final bool hasPlugins = environment.defines[kHasWebPlugins] == 'true';
-    final String importPath = fs.path.absolute(targetFile);
+    final String importPath = globals.fs.path.absolute(targetFile);
 
     // Use the package uri mapper to find the correct package-scheme import path
     // for the user application. If the application has a mix of package-scheme
@@ -71,7 +70,7 @@
     // have an entry for the user's application or if the main file is
     // outside of the lib/ directory.
     final String mainImport = packageUriMapper.map(importPath)?.toString()
-      ?? fs.file(importPath).absolute.uri.toString();
+      ?? globals.fs.file(importPath).absolute.uri.toString();
 
     String contents;
     if (hasPlugins) {
@@ -148,15 +147,15 @@
   Future<void> build(Environment environment) async {
     final String dart2jsOptimization = environment.defines[kDart2jsOptimization];
     final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
-    final String specPath = fs.path.join(artifacts.getArtifactPath(Artifact.flutterWebSdk), 'libraries.json');
+    final String specPath = globals.fs.path.join(globals.artifacts.getArtifactPath(Artifact.flutterWebSdk), 'libraries.json');
     final String packageFile = FlutterProject.fromDirectory(environment.projectDir).hasBuilders
       ? PackageMap.globalGeneratedPackagesPath
       : PackageMap.globalPackagesPath;
     final File outputFile = environment.buildDir.childFile('main.dart.js');
 
-    final ProcessResult result = await processManager.run(<String>[
-      artifacts.getArtifactPath(Artifact.engineDartBinary),
-      artifacts.getArtifactPath(Artifact.dart2jsSnapshot),
+    final ProcessResult result = await globals.processManager.run(<String>[
+      globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
+      globals.artifacts.getArtifactPath(Artifact.dart2jsSnapshot),
       '--libraries-spec=$specPath',
       if (dart2jsOptimization != null)
         '-$dart2jsOptimization'
@@ -181,7 +180,7 @@
     final File dart2jsDeps = environment.buildDir
       .childFile('main.dart.js.deps');
     if (!dart2jsDeps.existsSync()) {
-      printError('Warning: dart2js did not produced expected deps list at '
+      globals.printError('Warning: dart2js did not produced expected deps list at '
         '${dart2jsDeps.path}');
       return;
     }
@@ -226,11 +225,11 @@
   @override
   Future<void> build(Environment environment) async {
     for (File outputFile in environment.buildDir.listSync(recursive: true).whereType<File>()) {
-      if (!fs.path.basename(outputFile.path).contains('main.dart.js')) {
+      if (!globals.fs.path.basename(outputFile.path).contains('main.dart.js')) {
         continue;
       }
       outputFile.copySync(
-        environment.outputDir.childFile(fs.path.basename(outputFile.path)).path
+        environment.outputDir.childFile(globals.fs.path.basename(outputFile.path)).path
       );
     }
     final Directory outputDirectory = environment.outputDir.childDirectory('assets');
@@ -238,7 +237,7 @@
     environment.projectDir
       .childDirectory('web')
       .childFile('index.html')
-      .copySync(fs.path.join(environment.outputDir.path, 'index.html'));
+      .copySync(globals.fs.path.join(environment.outputDir.path, 'index.html'));
     final Depfile depfile = await copyAssets(environment, environment.outputDir.childDirectory('assets'));
     depfile.writeToFile(environment.buildDir.childFile('flutter_assets.d'));
   }
diff --git a/packages/flutter_tools/lib/src/build_system/targets/windows.dart b/packages/flutter_tools/lib/src/build_system/targets/windows.dart
index da1169f..5b05aa1 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/windows.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/windows.dart
@@ -5,7 +5,7 @@
 import '../../artifacts.dart';
 import '../../base/file_system.dart';
 import '../../build_info.dart';
-import '../../globals.dart';
+import '../../globals.dart' as globals;
 import '../build_system.dart';
 
 /// Copies the Windows desktop embedding files to the copy directory.
@@ -40,21 +40,21 @@
   @override
   Future<void> build(Environment environment) async {
     // This path needs to match the prefix in the rule below.
-    final String basePath = artifacts.getArtifactPath(Artifact.windowsDesktopPath);
-    for (File input in fs.directory(basePath)
+    final String basePath = globals.artifacts.getArtifactPath(Artifact.windowsDesktopPath);
+    for (File input in globals.fs.directory(basePath)
         .listSync(recursive: true)
         .whereType<File>()) {
-      final String outputPath = fs.path.join(
+      final String outputPath = globals.fs.path.join(
         environment.projectDir.path,
         'windows',
         'flutter',
-        fs.path.relative(input.path, from: basePath),
+        globals.fs.path.relative(input.path, from: basePath),
       );
-      final File destinationFile = fs.file(outputPath);
+      final File destinationFile = globals.fs.file(outputPath);
       if (!destinationFile.parent.existsSync()) {
         destinationFile.parent.createSync(recursive: true);
       }
-      fs.file(input).copySync(destinationFile.path);
+      globals.fs.file(input).copySync(destinationFile.path);
     }
   }
 }
diff --git a/packages/flutter_tools/lib/src/bundle.dart b/packages/flutter_tools/lib/src/bundle.dart
index e3799bf..2a3c938 100644
--- a/packages/flutter_tools/lib/src/bundle.dart
+++ b/packages/flutter_tools/lib/src/bundle.dart
@@ -17,17 +17,17 @@
 import 'build_system/targets/dart.dart';
 import 'dart/package_map.dart';
 import 'devfs.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'project.dart';
 
-String get defaultMainPath => fs.path.join('lib', 'main.dart');
+String get defaultMainPath => globals.fs.path.join('lib', 'main.dart');
 const String defaultAssetBasePath = '.';
 const String defaultManifestPath = 'pubspec.yaml';
-String get defaultDepfilePath => fs.path.join(getBuildDirectory(), 'snapshot_blob.bin.d');
+String get defaultDepfilePath => globals.fs.path.join(getBuildDirectory(), 'snapshot_blob.bin.d');
 
 String getDefaultApplicationKernelPath({ @required bool trackWidgetCreation }) {
   return getKernelPathForTransformerOptions(
-    fs.path.join(getBuildDirectory(), 'app.dill'),
+    globals.fs.path.join(getBuildDirectory(), 'app.dill'),
     trackWidgetCreation: trackWidgetCreation,
   );
 }
@@ -71,7 +71,7 @@
     mainPath ??= defaultMainPath;
     depfilePath ??= defaultDepfilePath;
     assetDirPath ??= getAssetBuildDirectory();
-    packagesPath ??= fs.path.absolute(PackageMap.globalPackagesPath);
+    packagesPath ??= globals.fs.path.absolute(PackageMap.globalPackagesPath);
     final FlutterProject flutterProject = FlutterProject.current();
     await buildWithAssemble(
       buildMode: buildMode ?? BuildMode.debug,
@@ -85,7 +85,7 @@
     );
     // Work around for flutter_tester placing kernel artifacts in odd places.
     if (applicationKernelFilePath != null) {
-      final File outputDill = fs.directory(assetDirPath).childFile('kernel_blob.bin');
+      final File outputDill = globals.fs.directory(assetDirPath).childFile('kernel_blob.bin');
       if (outputDill.existsSync()) {
         outputDill.copySync(applicationKernelFilePath);
       }
@@ -111,7 +111,7 @@
   buildMode = precompiled ? buildMode : BuildMode.debug;
   final Environment environment = Environment(
     projectDir: flutterProject.directory,
-    outputDir: fs.directory(outputDir),
+    outputDir: globals.fs.directory(outputDir),
     buildDir: flutterProject.dartTool.childDirectory('flutter_build'),
     defines: <String, String>{
       kTargetFile: mainPath,
@@ -127,7 +127,7 @@
 
   if (!result.success) {
     for (ExceptionMeasurement measurement in result.exceptions.values) {
-        printError('Target ${measurement.target} failed: ${measurement.exception}',
+        globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
             : null,
@@ -137,7 +137,7 @@
   }
   if (depfilePath != null) {
     final Depfile depfile = Depfile(result.inputFiles, result.outputFiles);
-    final File outputDepfile = fs.file(depfilePath);
+    final File outputDepfile = globals.fs.file(depfilePath);
     if (!outputDepfile.parent.existsSync()) {
       outputDepfile.parent.createSync(recursive: true);
     }
@@ -153,7 +153,7 @@
   bool reportLicensedPackages = false,
 }) async {
   assetDirPath ??= getAssetBuildDirectory();
-  packagesPath ??= fs.path.absolute(PackageMap.globalPackagesPath);
+  packagesPath ??= globals.fs.path.absolute(PackageMap.globalPackagesPath);
 
   // Build the asset bundle.
   final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle();
@@ -176,7 +176,7 @@
   Map<String, DevFSContent> assetEntries,
   { Logger loggerOverride }
 ) async {
-  loggerOverride ??= logger;
+  loggerOverride ??= globals.logger;
   if (bundleDir.existsSync()) {
     try {
       bundleDir.deleteSync(recursive: true);
@@ -200,7 +200,7 @@
         // to `%23.ext`.  However, we have to keep it this way since the
         // platform channels in the framework will URI encode these values,
         // and the native APIs will look for files this way.
-        final File file = fs.file(fs.path.join(bundleDir.path, entry.key));
+        final File file = globals.fs.file(globals.fs.path.join(bundleDir.path, entry.key));
         file.parent.createSync(recursive: true);
         await file.writeAsBytes(await entry.value.contentsAsBytes());
       } finally {
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index dc4031e..821f4c2 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -8,16 +8,14 @@
 
 import 'android/gradle_utils.dart';
 import 'base/common.dart';
-import 'base/context.dart';
 import 'base/file_system.dart';
 import 'base/io.dart' show SocketException;
 import 'base/logger.dart';
 import 'base/net.dart';
 import 'base/os.dart';
-import 'base/platform.dart';
 import 'base/process.dart';
 import 'features.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 
 /// A tag for a set of development artifacts that need to be cached.
 class DevelopmentArtifact {
@@ -168,12 +166,12 @@
     }
     assert(_lock == null);
     final File lockFile =
-        fs.file(fs.path.join(flutterRoot, 'bin', 'cache', 'lockfile'));
+        globals.fs.file(globals.fs.path.join(flutterRoot, 'bin', 'cache', 'lockfile'));
     try {
       _lock = lockFile.openSync(mode: FileMode.write);
     } on FileSystemException catch (e) {
-      printError('Failed to open or create the artifact cache lockfile: "$e"');
-      printError('Please ensure you have permissions to create or open '
+      globals.printError('Failed to open or create the artifact cache lockfile: "$e"');
+      globals.printError('Please ensure you have permissions to create or open '
                  '${lockFile.path}');
       throwToolExit('Failed to open or create the lockfile');
     }
@@ -185,8 +183,8 @@
         locked = true;
       } on FileSystemException {
         if (!printed) {
-          printTrace('Waiting to be able to obtain lock of Flutter binary artifacts directory: ${_lock.path}');
-          printStatus('Waiting for another flutter command to release the startup lock...');
+          globals.printTrace('Waiting to be able to obtain lock of Flutter binary artifacts directory: ${_lock.path}');
+          globals.printStatus('Waiting for another flutter command to release the startup lock...');
           printed = true;
         }
         await Future<void>.delayed(const Duration(milliseconds: 50));
@@ -206,7 +204,7 @@
   /// Checks if the current process owns the lock for the cache directory at
   /// this very moment; throws a [StateError] if it doesn't.
   static void checkLockAcquired() {
-    if (_lockEnabled && _lock == null && platform.environment['FLUTTER_ALREADY_LOCKED'] != 'true') {
+    if (_lockEnabled && _lock == null && globals.platform.environment['FLUTTER_ALREADY_LOCKED'] != 'true') {
       throw StateError(
         'The current process does not own the lock for the cache directory. This is a bug in Flutter CLI tools.',
       );
@@ -219,7 +217,7 @@
     if (_dartSdkVersion == null) {
       // Make the version string more customer-friendly.
       // Changes '2.1.0-dev.8.0.flutter-4312ae32' to '2.1.0 (build 2.1.0-dev.8.0 4312ae32)'
-      final String justVersion = platform.version.split(' ')[0];
+      final String justVersion = globals.platform.version.split(' ')[0];
       _dartSdkVersion = justVersion.replaceFirstMapped(RegExp(r'(\d+\.\d+\.\d+)(.+)'), (Match match) {
         final String noFlutter = match[2].replaceAll('.flutter-', ' ');
         return '${match[1]} (build ${match[1]}$noFlutter)';
@@ -236,7 +234,7 @@
   String _engineRevision;
 
   String get storageBaseUrl {
-    final String overrideUrl = platform.environment['FLUTTER_STORAGE_BASE_URL'];
+    final String overrideUrl = globals.platform.environment['FLUTTER_STORAGE_BASE_URL'];
     if (overrideUrl == null) {
       return 'https://storage.googleapis.com';
     }
@@ -256,27 +254,25 @@
     if (_hasWarnedAboutStorageOverride) {
       return;
     }
-    logger.printStatus(
+    globals.logger.printStatus(
       'Flutter assets will be downloaded from $overrideUrl. Make sure you trust this source!',
       emphasis: true,
     );
     _hasWarnedAboutStorageOverride = true;
   }
 
-  static Cache get instance => context.get<Cache>();
-
   /// Return the top-level directory in the cache; this is `bin/cache`.
   Directory getRoot() {
     if (_rootOverride != null) {
-      return fs.directory(fs.path.join(_rootOverride.path, 'bin', 'cache'));
+      return globals.fs.directory(globals.fs.path.join(_rootOverride.path, 'bin', 'cache'));
     } else {
-      return fs.directory(fs.path.join(flutterRoot, 'bin', 'cache'));
+      return globals.fs.directory(globals.fs.path.join(flutterRoot, 'bin', 'cache'));
     }
   }
 
   /// Return a directory in the cache dir. For `pkg`, this will return `bin/cache/pkg`.
   Directory getCacheDir(String name) {
-    final Directory dir = fs.directory(fs.path.join(getRoot().path, name));
+    final Directory dir = globals.fs.directory(globals.fs.path.join(getRoot().path, name));
     if (!dir.existsSync()) {
       dir.createSync(recursive: true);
       os.chmod(dir, '755');
@@ -291,7 +287,7 @@
   Directory getCacheArtifacts() => getCacheDir('artifacts');
 
   /// Location of LICENSE file.
-  File getLicenseFile() => fs.file(fs.path.join(flutterRoot, 'LICENSE'));
+  File getLicenseFile() => globals.fs.file(globals.fs.path.join(flutterRoot, 'LICENSE'));
 
   /// Get a named directory from with the cache's artifact directory; for example,
   /// `material_fonts` would return `bin/cache/artifacts/material_fonts`.
@@ -327,7 +323,7 @@
   }
 
   String getVersionFor(String artifactName) {
-    final File versionFile = fs.file(fs.path.join(
+    final File versionFile = globals.fs.file(globals.fs.path.join(
         _rootOverride?.path ?? flutterRoot, 'bin', 'internal',
         '$artifactName.version'));
     return versionFile.existsSync() ? versionFile.readAsStringSync().trim() : null;
@@ -343,7 +339,7 @@
   }
 
   File getStampFileFor(String artifactName) {
-    return fs.file(fs.path.join(getRoot().path, '$artifactName.stamp'));
+    return globals.fs.file(globals.fs.path.join(getRoot().path, '$artifactName.stamp'));
   }
 
   /// Returns `true` if either [entity] is older than the tools stamp or if
@@ -359,13 +355,13 @@
     final Uri url = Uri.parse(urlStr);
     final Directory thirdPartyDir = getArtifactDirectory('third_party');
 
-    final Directory serviceDir = fs.directory(fs.path.join(thirdPartyDir.path, serviceName));
+    final Directory serviceDir = globals.fs.directory(globals.fs.path.join(thirdPartyDir.path, serviceName));
     if (!serviceDir.existsSync()) {
       serviceDir.createSync(recursive: true);
       os.chmod(serviceDir, '755');
     }
 
-    final File cachedFile = fs.file(fs.path.join(serviceDir.path, url.pathSegments.last));
+    final File cachedFile = globals.fs.file(globals.fs.path.join(serviceDir.path, url.pathSegments.last));
     if (!cachedFile.existsSync()) {
       try {
         await _downloadFile(url, cachedFile);
@@ -384,7 +380,7 @@
     }
     for (ArtifactSet artifact in _artifacts) {
       if (!requiredArtifacts.contains(artifact.developmentArtifact)) {
-        printTrace('Artifact $artifact is not required, skipping update.');
+        globals.printTrace('Artifact $artifact is not required, skipping update.');
         continue;
       }
       if (artifact.isUpToDate()) {
@@ -394,7 +390,7 @@
         await artifact.update();
       } on SocketException catch (e) {
         if (_hostsBlockedInChina.contains(e.address?.host)) {
-          printError(
+          globals.printError(
             'Failed to retrieve Flutter tool dependencies: ${e.message}.\n'
             'If you\'re in China, please see this page: '
             'https://flutter.dev/community/china',
@@ -410,15 +406,15 @@
     String engineVersion,
     bool includeAllPlatforms = true,
   }) async {
-    final bool includeAllPlatformsState = cache.includeAllPlatforms;
+    final bool includeAllPlatformsState = globals.cache.includeAllPlatforms;
     bool allAvailible = true;
-    cache.includeAllPlatforms = includeAllPlatforms;
+    globals.cache.includeAllPlatforms = includeAllPlatforms;
     for (ArtifactSet cachedArtifact in _artifacts) {
       if (cachedArtifact is EngineCachedArtifact) {
         allAvailible &= await cachedArtifact.checkForArtifacts(engineVersion);
       }
     }
-    cache.includeAllPlatforms = includeAllPlatformsState;
+    globals.cache.includeAllPlatforms = includeAllPlatformsState;
     return allAvailible;
   }
 }
@@ -486,7 +482,7 @@
       try {
         location.createSync(recursive: true);
       } on FileSystemException catch (err) {
-        printError(err.toString());
+        globals.printError(err.toString());
         throwToolExit(
           'Failed to create directory for flutter cache at ${location.path}. '
           'Flutter may be missing permissions in its cache directory.'
@@ -504,7 +500,7 @@
       try {
         f.deleteSync();
       } on FileSystemException catch (e) {
-        printError('Failed to delete "${f.path}". Please delete manually. $e');
+        globals.printError('Failed to delete "${f.path}". Please delete manually. $e');
         continue;
       }
       for (Directory d = f.parent; d.absolute.path != cache.getDownloadDir().absolute.path; d = d.parent) {
@@ -520,6 +516,7 @@
   /// Hook method for extra checks for being up-to-date.
   bool isUpToDateInner() => true;
 
+
   /// Template method to perform artifact update.
   Future<void> updateInner();
 
@@ -529,7 +526,7 @@
   Future<void> _downloadArchive(String message, Uri url, Directory location, bool verifier(File f), void extractor(File f, Directory d)) {
     return _withDownloadFile('${flattenNameSubdirs(url)}', (File tempFile) async {
       if (!verifier(tempFile)) {
-        final Status status = logger.startProgress(message, timeout: timeoutConfiguration.slowOperation);
+        final Status status = globals.logger.startProgress(message, timeout: timeoutConfiguration.slowOperation);
         try {
           await _downloadFile(url, tempFile);
           status.stop();
@@ -538,7 +535,7 @@
           rethrow;
         }
       } else {
-        logger.printTrace('$message (cached)');
+        globals.logger.printTrace('$message (cached)');
       }
       _ensureExists(location);
       extractor(tempFile, location);
@@ -558,7 +555,7 @@
   /// Create a temporary file and invoke [onTemporaryFile] with the file as
   /// argument, then add the temporary file to the [downloadedFiles].
   Future<void> _withDownloadFile(String name, Future<void> onTemporaryFile(File file)) async {
-    final File tempFile = fs.file(fs.path.join(cache.getDownloadDir().path, name));
+    final File tempFile = globals.fs.file(globals.fs.path.join(cache.getDownloadDir().path, name));
     downloadedFiles.add(tempFile);
     await onTemporaryFile(tempFile);
   }
@@ -599,11 +596,11 @@
   @override
   Future<void> updateInner() async {
     String platformName = 'flutter-web-sdk-';
-    if (platform.isMacOS) {
+    if (globals.platform.isMacOS) {
       platformName += 'darwin-x64';
-    } else if (platform.isLinux) {
+    } else if (globals.platform.isLinux) {
       platformName += 'linux-x64';
-    } else if (platform.isWindows) {
+    } else if (globals.platform.isWindows) {
       platformName += 'windows-x64';
     }
     final Uri url = Uri.parse('${cache.storageBaseUrl}/flutter_infra/flutter/$version/$platformName.zip');
@@ -611,10 +608,10 @@
     // This is a temporary work-around for not being able to safely download into a shared directory.
     for (FileSystemEntity entity in location.listSync(recursive: true)) {
       if (entity is File) {
-        final List<String> segments = fs.path.split(entity.path);
+        final List<String> segments = globals.fs.path.split(entity.path);
         segments.remove('flutter_web_sdk');
-        final String newPath = fs.path.joinAll(segments);
-        final File newFile = fs.file(newPath);
+        final String newPath = globals.fs.path.joinAll(segments);
+        final File newFile = globals.fs.file(newPath);
         if (!newFile.existsSync()) {
           newFile.createSync(recursive: true);
         }
@@ -647,21 +644,21 @@
   bool isUpToDateInner() {
     final Directory pkgDir = cache.getCacheDir('pkg');
     for (String pkgName in getPackageDirs()) {
-      final String pkgPath = fs.path.join(pkgDir.path, pkgName);
-      if (!fs.directory(pkgPath).existsSync()) {
+      final String pkgPath = globals.fs.path.join(pkgDir.path, pkgName);
+      if (!globals.fs.directory(pkgPath).existsSync()) {
         return false;
       }
     }
 
     for (List<String> toolsDir in getBinaryDirs()) {
-      final Directory dir = fs.directory(fs.path.join(location.path, toolsDir[0]));
+      final Directory dir = globals.fs.directory(globals.fs.path.join(location.path, toolsDir[0]));
       if (!dir.existsSync()) {
         return false;
       }
     }
 
     for (String licenseDir in getLicenseDirs()) {
-      final File file = fs.file(fs.path.join(location.path, licenseDir, 'LICENSE'));
+      final File file = globals.fs.file(globals.fs.path.join(location.path, licenseDir, 'LICENSE'));
       if (!file.existsSync()) {
         return false;
       }
@@ -681,16 +678,16 @@
     for (List<String> toolsDir in getBinaryDirs()) {
       final String cacheDir = toolsDir[0];
       final String urlPath = toolsDir[1];
-      final Directory dir = fs.directory(fs.path.join(location.path, cacheDir));
+      final Directory dir = globals.fs.directory(globals.fs.path.join(location.path, cacheDir));
       await _downloadZipArchive('Downloading $cacheDir tools...', Uri.parse(url + urlPath), dir);
 
       _makeFilesExecutable(dir);
 
       const List<String> frameworkNames = <String>['Flutter', 'FlutterMacOS'];
       for (String frameworkName in frameworkNames) {
-        final File frameworkZip = fs.file(fs.path.join(dir.path, '$frameworkName.framework.zip'));
+        final File frameworkZip = globals.fs.file(globals.fs.path.join(dir.path, '$frameworkName.framework.zip'));
         if (frameworkZip.existsSync()) {
-          final Directory framework = fs.directory(fs.path.join(dir.path, '$frameworkName.framework'));
+          final Directory framework = globals.fs.directory(globals.fs.path.join(dir.path, '$frameworkName.framework'));
           framework.createSync();
           os.unzip(frameworkZip, framework);
         }
@@ -699,7 +696,7 @@
 
     final File licenseSource = cache.getLicenseFile();
     for (String licenseDir in getLicenseDirs()) {
-      final String licenseDestinationPath = fs.path.join(location.path, licenseDir, 'LICENSE');
+      final String licenseDestinationPath = globals.fs.path.join(location.path, licenseDir, 'LICENSE');
       await licenseSource.copy(licenseDestinationPath);
     }
   }
@@ -766,11 +763,11 @@
         <String>['linux-x64', 'linux-x64/artifacts.zip'],
         <String>['darwin-x64', 'darwin-x64/artifacts.zip'],
       ]
-      else if (platform.isWindows)
+      else if (globals.platform.isWindows)
         <String>['windows-x64', 'windows-x64/artifacts.zip']
-      else if (platform.isMacOS)
+      else if (globals.platform.isMacOS)
         <String>['darwin-x64', 'darwin-x64/artifacts.zip']
-      else if (platform.isLinux)
+      else if (globals.platform.isLinux)
         <String>['linux-x64', 'linux-x64/artifacts.zip'],
     ];
   }
@@ -791,7 +788,7 @@
 
   @override
   List<List<String>> getBinaryDirs() {
-    if (platform.isMacOS) {
+    if (globals.platform.isMacOS) {
       return _macOSDesktopBinaryDirs;
     }
     return const <List<String>>[];
@@ -813,7 +810,7 @@
 
   @override
   List<List<String>> getBinaryDirs() {
-    if (platform.isWindows) {
+    if (globals.platform.isWindows) {
       return _windowsDesktopBinaryDirs;
     }
     return const <List<String>>[];
@@ -835,7 +832,7 @@
 
   @override
   List<List<String>> getBinaryDirs() {
-    if (platform.isLinux) {
+    if (globals.platform.isLinux) {
       return _linuxDesktopBinaryDirs;
     }
     return const <List<String>>[];
@@ -864,11 +861,11 @@
         ..._linuxBinaryDirs,
         ..._windowsBinaryDirs,
         ..._dartSdks,
-      ] else if (platform.isWindows)
+      ] else if (globals.platform.isWindows)
         ..._windowsBinaryDirs
-      else if (platform.isMacOS)
+      else if (globals.platform.isMacOS)
         ..._osxBinaryDirs
-      else if (platform.isLinux)
+      else if (globals.platform.isLinux)
         ..._linuxBinaryDirs,
     ];
   }
@@ -905,13 +902,13 @@
   @override
   Future<void> update() async {
     final Directory tempDir =
-        fs.systemTempDirectory.createTempSync('flutter_gradle_wrapper.');
+        globals.fs.systemTempDirectory.createTempSync('flutter_gradle_wrapper.');
     gradleUtils.injectGradleWrapperIfNeeded(tempDir);
 
-    final Status status = logger.startProgress('Downloading Android Maven dependencies...',
+    final Status status = globals.logger.startProgress('Downloading Android Maven dependencies...',
         timeout: timeoutConfiguration.slowOperation);
     final File gradle = tempDir.childFile(
-        platform.isWindows ? 'gradlew.bat' : 'gradlew',
+        globals.platform.isWindows ? 'gradlew.bat' : 'gradlew',
       );
     try {
       final String gradleExecutable = gradle.absolute.path;
@@ -919,13 +916,13 @@
       final RunResult processResult = await processUtils.run(
         <String>[
           gradleExecutable,
-          '-b', fs.path.join(flutterSdk, 'packages', 'flutter_tools', 'gradle', 'resolve_dependencies.gradle'),
+          '-b', globals.fs.path.join(flutterSdk, 'packages', 'flutter_tools', 'gradle', 'resolve_dependencies.gradle'),
           '--project-cache-dir', tempDir.path,
           'resolveDependencies',
         ],
         environment: gradleEnvironment);
       if (processResult.exitCode != 0) {
-        printError('Failed to download the Android dependencies');
+        globals.printError('Failed to download the Android dependencies');
       }
     } finally {
       status.stop();
@@ -952,14 +949,14 @@
   @override
   List<List<String>> getBinaryDirs() {
     return <List<String>>[
-      if (platform.isMacOS || cache.includeAllPlatforms)
+      if (globals.platform.isMacOS || cache.includeAllPlatforms)
         ..._iosBinaryDirs,
     ];
   }
 
   @override
   List<String> getLicenseDirs() {
-    if (cache.includeAllPlatforms || platform.isMacOS) {
+    if (cache.includeAllPlatforms || globals.platform.isMacOS) {
       return const <String>['ios', 'ios-profile', 'ios-release'];
     }
     return const <String>[];
@@ -984,32 +981,32 @@
 
   List<String> get _gradleScripts => <String>['gradlew', 'gradlew.bat'];
 
-  String get _gradleWrapper => fs.path.join('gradle', 'wrapper', 'gradle-wrapper.jar');
+  String get _gradleWrapper => globals.fs.path.join('gradle', 'wrapper', 'gradle-wrapper.jar');
 
   @override
   Future<void> updateInner() {
     final Uri archiveUri = _toStorageUri(version);
     return _downloadZippedTarball('Downloading Gradle Wrapper...', archiveUri, location).then<void>((_) {
       // Delete property file, allowing templates to provide it.
-      fs.file(fs.path.join(location.path, 'gradle', 'wrapper', 'gradle-wrapper.properties')).deleteSync();
+      globals.fs.file(globals.fs.path.join(location.path, 'gradle', 'wrapper', 'gradle-wrapper.properties')).deleteSync();
       // Remove NOTICE file. Should not be part of the template.
-      fs.file(fs.path.join(location.path, 'NOTICE')).deleteSync();
+      globals.fs.file(globals.fs.path.join(location.path, 'NOTICE')).deleteSync();
     });
   }
 
   @override
   bool isUpToDateInner() {
-    final Directory wrapperDir = cache.getCacheDir(fs.path.join('artifacts', 'gradle_wrapper'));
-    if (!fs.directory(wrapperDir).existsSync()) {
+    final Directory wrapperDir = cache.getCacheDir(globals.fs.path.join('artifacts', 'gradle_wrapper'));
+    if (!globals.fs.directory(wrapperDir).existsSync()) {
       return false;
     }
     for (String scriptName in _gradleScripts) {
-      final File scriptFile = fs.file(fs.path.join(wrapperDir.path, scriptName));
+      final File scriptFile = globals.fs.file(globals.fs.path.join(wrapperDir.path, scriptName));
       if (!scriptFile.existsSync()) {
         return false;
       }
     }
-    final File gradleWrapperJar = fs.file(fs.path.join(wrapperDir.path, _gradleWrapper));
+    final File gradleWrapperJar = globals.fs.file(globals.fs.path.join(wrapperDir.path, _gradleWrapper));
     if (!gradleWrapperJar.existsSync()) {
       return false;
     }
@@ -1058,7 +1055,7 @@
 
   @override
   Future<void> updateInner() async {
-    if (!platform.isLinux && !platform.isMacOS) {
+    if (!globals.platform.isLinux && !globals.platform.isMacOS) {
       return Future<void>.value();
     }
     final String url = '$_cipdBaseUrl/flutter/fuchsia/+/git_revision:$version';
@@ -1115,7 +1112,7 @@
 
   @override
   Future<void> updateInner() async {
-    if (!platform.isLinux && !platform.isMacOS) {
+    if (!globals.platform.isLinux && !globals.platform.isMacOS) {
       return Future<void>.value();
     }
     await _downloadDebugSymbols('x64');
@@ -1129,7 +1126,7 @@
 
   @override
   Future<void> updateInner() {
-    if (!platform.isLinux) {
+    if (!globals.platform.isLinux) {
       return Future<void>.value();
     }
     return _doUpdate();
@@ -1142,7 +1139,7 @@
 
   @override
   Future<void> updateInner() async {
-    if (!platform.isMacOS) {
+    if (!globals.platform.isMacOS) {
       return Future<void>.value();
     }
     return _doUpdate();
@@ -1202,7 +1199,7 @@
 
   @override
   Future<void> updateInner() {
-    if (!platform.isMacOS && !cache.includeAllPlatforms) {
+    if (!globals.platform.isMacOS && !cache.includeAllPlatforms) {
       return Future<void>.value();
     }
     if (location.existsSync()) {
@@ -1244,7 +1241,7 @@
 String flattenNameSubdirs(Uri url) {
   final List<String> pieces = <String>[url.host, ...url.pathSegments];
   final Iterable<String> convertedPieces = pieces.map<String>(_flattenNameNoSubdirs);
-  return fs.path.joinAll(convertedPieces);
+  return globals.fs.path.joinAll(convertedPieces);
 }
 
 /// Download a file from the given [url] and write it to [location].
@@ -1254,7 +1251,7 @@
 }
 
 Future<bool> _doesRemoteExist(String message, Uri url) async {
-  final Status status = logger.startProgress(message, timeout: timeoutConfiguration.slowOperation);
+  final Status status = globals.logger.startProgress(message, timeout: timeoutConfiguration.slowOperation);
   final bool exists = await doesRemoteFileExist(url);
   status.stop();
   return exists;
diff --git a/packages/flutter_tools/lib/src/codegen.dart b/packages/flutter_tools/lib/src/codegen.dart
index 1f48a12..75e1072 100644
--- a/packages/flutter_tools/lib/src/codegen.dart
+++ b/packages/flutter_tools/lib/src/codegen.dart
@@ -6,12 +6,10 @@
 
 import 'artifacts.dart';
 import 'base/context.dart';
-import 'base/file_system.dart';
-import 'base/platform.dart';
 import 'build_info.dart';
 import 'compile.dart';
 import 'dart/package_map.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'project.dart';
 
 // Arbitrarily chosen multi-root file scheme. This is used to configure the
@@ -48,11 +46,11 @@
   /// scheme. To support codegen on arbitrary packages we would need to do
   /// this for each dependency.
   void updatePackages(FlutterProject flutterProject) {
-    final String oldPackagesContents = fs.file(PackageMap.globalPackagesPath).readAsStringSync();
+    final String oldPackagesContents = globals.fs.file(PackageMap.globalPackagesPath).readAsStringSync();
     final String appName = flutterProject.manifest.appName;
     final String newPackagesContents = oldPackagesContents.replaceFirst('$appName:lib/', '$appName:$kMultiRootScheme:/');
-    final String generatedPackagesPath = fs.path.setExtension(PackageMap.globalPackagesPath, '.generated');
-    fs.file(generatedPackagesPath).writeAsStringSync(newPackagesContents);
+    final String generatedPackagesPath = globals.fs.path.setExtension(PackageMap.globalPackagesPath, '.generated');
+    globals.fs.file(generatedPackagesPath).writeAsStringSync(newPackagesContents);
   }
 }
 
@@ -112,7 +110,7 @@
     List<String> dartDefines,
   }) async {
     if (fileSystemRoots != null || fileSystemScheme != null || depFilePath != null || targetModel != null || sdkRoot != null || packagesPath != null) {
-      printTrace('fileSystemRoots, fileSystemScheme, depFilePath, targetModel,'
+      globals.printTrace('fileSystemRoots, fileSystemScheme, depFilePath, targetModel,'
         'sdkRoot, packagesPath are not supported when using the experimental '
         'build* pipeline');
     }
@@ -122,7 +120,7 @@
     codegenDaemon.startBuild();
     await for (CodegenStatus codegenStatus in codegenDaemon.buildResults) {
       if (codegenStatus == CodegenStatus.Failed) {
-        printError('Code generation failed, build may have compile errors.');
+        globals.printError('Code generation failed, build may have compile errors.');
         break;
       }
       if (codegenStatus == CodegenStatus.Succeeded) {
@@ -141,8 +139,8 @@
       sdkRoot: sdkRoot,
       packagesPath: PackageMap.globalGeneratedPackagesPath,
       fileSystemRoots: <String>[
-        fs.path.join(flutterProject.generated.path, 'lib${platform.pathSeparator}'),
-        fs.path.join(flutterProject.directory.path, 'lib${platform.pathSeparator}'),
+        globals.fs.path.join(flutterProject.generated.path, 'lib${globals.platform.pathSeparator}'),
+        globals.fs.path.join(flutterProject.directory.path, 'lib${globals.platform.pathSeparator}'),
       ],
       fileSystemScheme: kMultiRootScheme,
       depFilePath: depFilePath,
@@ -168,7 +166,7 @@
     @required FlutterProject flutterProject,
     @required BuildMode buildMode,
     bool trackWidgetCreation = false,
-    CompilerMessageConsumer compilerMessageConsumer = printError,
+    CompilerMessageConsumer compilerMessageConsumer = globals.printError,
     bool unsafePackageSerialization = false,
     String outputPath,
     String initializeFromDill,
@@ -178,7 +176,7 @@
   }) async {
     codeGenerator.updatePackages(flutterProject);
     final ResidentCompiler residentCompiler = ResidentCompiler(
-      artifacts.getArtifactPath(
+      globals.artifacts.getArtifactPath(
         Artifact.flutterPatchedSdkPath,
         platform: targetPlatform,
         mode: buildMode,
@@ -187,8 +185,8 @@
       trackWidgetCreation: trackWidgetCreation,
       packagesPath: PackageMap.globalGeneratedPackagesPath,
       fileSystemRoots: <String>[
-        fs.path.join(flutterProject.generated.path, 'lib${platform.pathSeparator}'),
-        fs.path.join(flutterProject.directory.path, 'lib${platform.pathSeparator}'),
+        globals.fs.path.join(flutterProject.generated.path, 'lib${globals.platform.pathSeparator}'),
+        globals.fs.path.join(flutterProject.directory.path, 'lib${globals.platform.pathSeparator}'),
       ],
       fileSystemScheme: kMultiRootScheme,
       targetModel: TargetModel.flutter,
@@ -205,7 +203,7 @@
       return status == CodegenStatus.Succeeded || status == CodegenStatus.Failed;
     });
     if (status == CodegenStatus.Failed) {
-      printError('Code generation failed, build may have compile errors.');
+      globals.printError('Code generation failed, build may have compile errors.');
     }
     return CodeGeneratingResidentCompiler._(residentCompiler, codegenDaemon, flutterProject);
   }
@@ -232,13 +230,13 @@
       });
     }
     if (_codegenDaemon.lastStatus == CodegenStatus.Failed) {
-      printError('Code generation failed, build may have compile errors.');
+      globals.printError('Code generation failed, build may have compile errors.');
     }
     // Update the generated packages file if the original packages file has changes.
-    if (fs.statSync(PackageMap.globalPackagesPath).modified.millisecondsSinceEpoch >
-        fs.statSync(PackageMap.globalGeneratedPackagesPath).modified.millisecondsSinceEpoch) {
+    if (globals.fs.statSync(PackageMap.globalPackagesPath).modified.millisecondsSinceEpoch >
+        globals.fs.statSync(PackageMap.globalGeneratedPackagesPath).modified.millisecondsSinceEpoch) {
       codeGenerator.updatePackages(_flutterProject);
-      invalidatedFiles.add(fs.file(PackageMap.globalGeneratedPackagesPath).uri);
+      invalidatedFiles.add(globals.fs.file(PackageMap.globalGeneratedPackagesPath).uri);
     }
     return _residentCompiler.recompile(
       mainPath,
diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart
index c4123c0..a3661a1 100644
--- a/packages/flutter_tools/lib/src/commands/analyze.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import '../base/file_system.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 import 'analyze_continuously.dart';
 import 'analyze_once.dart';
@@ -72,7 +73,7 @@
     }
 
     // Or we're not in a project directory.
-    if (!fs.file('pubspec.yaml').existsSync()) {
+    if (!globals.fs.file('pubspec.yaml').existsSync()) {
       return false;
     }
 
diff --git a/packages/flutter_tools/lib/src/commands/analyze_base.dart b/packages/flutter_tools/lib/src/commands/analyze_base.dart
index 32c7aad..568e117 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_base.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_base.dart
@@ -11,7 +11,7 @@
 import '../base/file_system.dart';
 import '../base/utils.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 /// Common behavior for `flutter analyze` and `flutter analyze --watch`
 abstract class AnalyzeBase {
@@ -26,7 +26,7 @@
   void dumpErrors(Iterable<String> errors) {
     if (argResults['write'] != null) {
       try {
-        final RandomAccessFile resultsFile = fs.file(argResults['write']).openSync(mode: FileMode.write);
+        final RandomAccessFile resultsFile = globals.fs.file(argResults['write']).openSync(mode: FileMode.write);
         try {
           resultsFile.lockSync();
           resultsFile.writeStringSync(errors.join('\n'));
@@ -34,7 +34,7 @@
           resultsFile.close();
         }
       } catch (e) {
-        printError('Failed to save output to "${argResults['write']}": $e');
+        globals.printError('Failed to save output to "${argResults['write']}": $e');
       }
     }
   }
@@ -46,8 +46,8 @@
       'issues': errorCount,
       'missingDartDocs': membersMissingDocumentation,
     };
-    fs.file(benchmarkOut).writeAsStringSync(toPrettyJson(data));
-    printStatus('Analysis benchmark written to $benchmarkOut ($data).');
+    globals.fs.file(benchmarkOut).writeAsStringSync(toPrettyJson(data));
+    globals.printStatus('Analysis benchmark written to $benchmarkOut ($data).');
   }
 
   bool get isBenchmarking => argResults['benchmark'] as bool;
@@ -57,12 +57,12 @@
 /// If [fileList] is empty, then return true if the current directory resides inside the Flutter repository.
 bool inRepo(List<String> fileList) {
   if (fileList == null || fileList.isEmpty) {
-    fileList = <String>[fs.path.current];
+    fileList = <String>[globals.fs.path.current];
   }
-  final String root = fs.path.normalize(fs.path.absolute(Cache.flutterRoot));
-  final String prefix = root + fs.path.separator;
+  final String root = globals.fs.path.normalize(globals.fs.path.absolute(Cache.flutterRoot));
+  final String prefix = root + globals.fs.path.separator;
   for (String file in fileList) {
-    file = fs.path.normalize(fs.path.absolute(file));
+    file = globals.fs.path.normalize(globals.fs.path.absolute(file));
     if (file == root || file.startsWith(prefix)) {
       return true;
     }
@@ -85,11 +85,11 @@
   }
   bool get hasConflict => values.length > 1;
   bool get hasConflictAffectingFlutterRepo {
-    assert(fs.path.isAbsolute(Cache.flutterRoot));
+    assert(globals.fs.path.isAbsolute(Cache.flutterRoot));
     for (List<String> targetSources in values.values) {
       for (String source in targetSources) {
-        assert(fs.path.isAbsolute(source));
-        if (fs.path.isWithin(Cache.flutterRoot, source)) {
+        assert(globals.fs.path.isAbsolute(source));
+        if (globals.fs.path.isWithin(Cache.flutterRoot, source)) {
           return true;
         }
       }
@@ -132,8 +132,8 @@
 
   /// Read the .packages file in [directory] and add referenced packages to [dependencies].
   void addDependenciesFromPackagesFileIn(Directory directory) {
-    final String dotPackagesPath = fs.path.join(directory.path, '.packages');
-    final File dotPackages = fs.file(dotPackagesPath);
+    final String dotPackagesPath = globals.fs.path.join(directory.path, '.packages');
+    final File dotPackages = globals.fs.file(dotPackagesPath);
     if (dotPackages.existsSync()) {
       // this directory has opinions about what we should be using
       final Iterable<String> lines = dotPackages
@@ -144,12 +144,12 @@
         final int colon = line.indexOf(':');
         if (colon > 0) {
           final String packageName = line.substring(0, colon);
-          final String packagePath = fs.path.fromUri(line.substring(colon+1));
+          final String packagePath = globals.fs.path.fromUri(line.substring(colon+1));
           // Ensure that we only add `analyzer` and dependent packages defined in the vended SDK (and referred to with a local
-          // fs.path. directive). Analyzer package versions reached via transitive dependencies (e.g., via `test`) are ignored
+          // globals.fs.path. directive). Analyzer package versions reached via transitive dependencies (e.g., via `test`) are ignored
           // since they would produce spurious conflicts.
           if (!_vendedSdkPackages.contains(packageName) || packagePath.startsWith('..')) {
-            add(packageName, fs.path.normalize(fs.path.absolute(directory.path, packagePath)), dotPackagesPath);
+            add(packageName, globals.fs.path.normalize(globals.fs.path.absolute(directory.path, packagePath)), dotPackagesPath);
           }
         }
       }
@@ -166,17 +166,17 @@
 
   void checkForConflictingDependencies(Iterable<Directory> pubSpecDirectories, PackageDependencyTracker dependencies) {
     for (Directory directory in pubSpecDirectories) {
-      final String pubSpecYamlPath = fs.path.join(directory.path, 'pubspec.yaml');
-      final File pubSpecYamlFile = fs.file(pubSpecYamlPath);
+      final String pubSpecYamlPath = globals.fs.path.join(directory.path, 'pubspec.yaml');
+      final File pubSpecYamlFile = globals.fs.file(pubSpecYamlPath);
       if (pubSpecYamlFile.existsSync()) {
         // we are analyzing the actual canonical source for this package;
         // make sure we remember that, in case all the packages are actually
         // pointing elsewhere somehow.
-        final dynamic pubSpecYaml = yaml.loadYaml(fs.file(pubSpecYamlPath).readAsStringSync());
+        final dynamic pubSpecYaml = yaml.loadYaml(globals.fs.file(pubSpecYamlPath).readAsStringSync());
         if (pubSpecYaml is yaml.YamlMap) {
           final dynamic packageName = pubSpecYaml['name'];
           if (packageName is String) {
-            final String packagePath = fs.path.normalize(fs.path.absolute(fs.path.join(directory.path, 'lib')));
+            final String packagePath = globals.fs.path.normalize(globals.fs.path.absolute(globals.fs.path.join(directory.path, 'lib')));
             dependencies.addCanonicalCase(packageName, packagePath, pubSpecYamlPath);
           } else {
             throwToolExit('pubspec.yaml is malformed. The name should be a String.');
diff --git a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
index 89d386f..2e9802c 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
@@ -10,12 +10,11 @@
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/logger.dart';
-import '../base/terminal.dart';
 import '../base/utils.dart';
 import '../cache.dart';
 import '../dart/analysis.dart';
 import '../dart/sdk.dart' as sdk;
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'analyze_base.dart';
 
 class AnalyzeContinuously extends AnalyzeBase {
@@ -43,13 +42,13 @@
       directories = repoRoots;
       analysisTarget = 'Flutter repository';
 
-      printTrace('Analyzing Flutter repository:');
+      globals.printTrace('Analyzing Flutter repository:');
       for (String projectPath in repoRoots) {
-        printTrace('  ${fs.path.relative(projectPath)}');
+        globals.printTrace('  ${globals.fs.path.relative(projectPath)}');
       }
     } else {
-      directories = <String>[fs.currentDirectory.path];
-      analysisTarget = fs.currentDirectory.path;
+      directories = <String>[globals.fs.currentDirectory.path];
+      analysisTarget = globals.fs.currentDirectory.path;
     }
 
     final String sdkPath = argResults['dart-sdk'] as String ?? sdk.dartSdkPath;
@@ -67,7 +66,7 @@
     if (exitCode != 0) {
       throwToolExit(message, exitCode: exitCode);
     }
-    printStatus(message);
+    globals.printStatus(message);
 
     if (server.didServerErrorOccur) {
       throwToolExit('Server error(s) occurred.');
@@ -78,9 +77,9 @@
     if (isAnalyzing) {
       analysisStatus?.cancel();
       if (!firstAnalysis) {
-        printStatus('\n');
+        globals.printStatus('\n');
       }
-      analysisStatus = logger.startProgress('Analyzing $analysisTarget...', timeout: timeoutConfiguration.slowOperation);
+      analysisStatus = globals.logger.startProgress('Analyzing $analysisTarget...', timeout: timeoutConfiguration.slowOperation);
       analyzedPaths.clear();
       analysisTimer = Stopwatch()..start();
     } else {
@@ -88,12 +87,12 @@
       analysisStatus = null;
       analysisTimer.stop();
 
-      logger.printStatus(terminal.clearScreen(), newline: false);
+      globals.logger.printStatus(globals.terminal.clearScreen(), newline: false);
 
       // Remove errors for deleted files, sort, and print errors.
       final List<AnalysisError> errors = <AnalysisError>[];
       for (String path in analysisErrors.keys.toList()) {
-        if (fs.isFileSync(path)) {
+        if (globals.fs.isFileSync(path)) {
           errors.addAll(analysisErrors[path]);
         } else {
           analysisErrors.remove(path);
@@ -114,9 +113,9 @@
       errors.sort();
 
       for (AnalysisError error in errors) {
-        printStatus(error.toString());
+        globals.printStatus(error.toString());
         if (error.code != null) {
-          printTrace('error code: ${error.code}');
+          globals.printTrace('error code: ${error.code}');
         }
       }
 
@@ -149,9 +148,9 @@
       final String files = '${analyzedPaths.length} ${pluralize('file', analyzedPaths.length)}';
       final String seconds = (analysisTimer.elapsedMilliseconds / 1000.0).toStringAsFixed(2);
       if (undocumentedMembers > 0) {
-        printStatus('$errorsMessage • $dartdocMessage • analyzed $files in $seconds seconds');
+        globals.printStatus('$errorsMessage • $dartdocMessage • analyzed $files in $seconds seconds');
       } else {
-        printStatus('$errorsMessage • analyzed $files in $seconds seconds');
+        globals.printStatus('$errorsMessage • analyzed $files in $seconds seconds');
       }
 
       if (firstAnalysis && isBenchmarking) {
diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart
index c339a49..aaa44df 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_once.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart
@@ -13,7 +13,7 @@
 import '../cache.dart';
 import '../dart/analysis.dart';
 import '../dart/sdk.dart' as sdk;
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'analyze.dart';
 import 'analyze_base.dart';
 
@@ -35,14 +35,14 @@
   @override
   Future<void> analyze() async {
     final String currentDirectory =
-        (workingDirectory ?? fs.currentDirectory).path;
+        (workingDirectory ?? globals.fs.currentDirectory).path;
 
     // find directories from argResults.rest
     final Set<String> directories = Set<String>.from(argResults.rest
-        .map<String>((String path) => fs.path.canonicalize(path)));
+        .map<String>((String path) => globals.fs.path.canonicalize(path)));
     if (directories.isNotEmpty) {
       for (String directory in directories) {
-        final FileSystemEntityType type = fs.typeSync(directory);
+        final FileSystemEntityType type = globals.fs.typeSync(directory);
 
         if (type == FileSystemEntityType.notFound) {
           throwToolExit("'$directory' does not exist");
@@ -108,9 +108,9 @@
     final Stopwatch timer = Stopwatch()..start();
     final String message = directories.length > 1
         ? '${directories.length} ${directories.length == 1 ? 'directory' : 'directories'}'
-        : fs.path.basename(directories.first);
+        : globals.fs.path.basename(directories.first);
     final Status progress = argResults['preamble'] as bool
-        ? logger.startProgress('Analyzing $message...', timeout: timeoutConfiguration.slowOperation)
+        ? globals.logger.startProgress('Analyzing $message...', timeout: timeoutConfiguration.slowOperation)
         : null;
 
     await analysisCompleter.future;
@@ -135,11 +135,11 @@
 
     // report errors
     if (errors.isNotEmpty && (argResults['preamble'] as bool)) {
-      printStatus('');
+      globals.printStatus('');
     }
     errors.sort();
     for (AnalysisError error in errors) {
-      printStatus(error.toString(), hangingIndent: 7);
+      globals.printStatus(error.toString(), hangingIndent: 7);
     }
 
     final String seconds = (timer.elapsedMilliseconds / 1000.0).toStringAsFixed(1);
@@ -154,7 +154,7 @@
     // We consider any level of error to be an error exit (we don't report different levels).
     if (errors.isNotEmpty) {
       final int errorCount = errors.length;
-      printStatus('');
+      globals.printStatus('');
       if (undocumentedMembers > 0) {
         throwToolExit('$errorCount ${pluralize('issue', errorCount)} found. (ran in ${seconds}s; $dartdocMessage)');
       } else {
@@ -168,9 +168,9 @@
 
     if (argResults['congratulate'] as bool) {
       if (undocumentedMembers > 0) {
-        printStatus('No issues found! (ran in ${seconds}s; $dartdocMessage)');
+        globals.printStatus('No issues found! (ran in ${seconds}s; $dartdocMessage)');
       } else {
-        printStatus('No issues found! (ran in ${seconds}s)');
+        globals.printStatus('No issues found! (ran in ${seconds}s)');
       }
     }
   }
diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart
index 0c6fbda..583412b 100644
--- a/packages/flutter_tools/lib/src/commands/assemble.dart
+++ b/packages/flutter_tools/lib/src/commands/assemble.dart
@@ -16,7 +16,7 @@
 import '../build_system/targets/macos.dart';
 import '../build_system/targets/web.dart';
 import '../build_system/targets/windows.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import '../runner/flutter_command.dart';
@@ -137,11 +137,11 @@
       throwToolExit('--output directory is required for assemble.');
     }
     // If path is relative, make it absolute from flutter project.
-    if (fs.path.isRelative(output)) {
-      output = fs.path.join(flutterProject.directory.path, output);
+    if (globals.fs.path.isRelative(output)) {
+      output = globals.fs.path.join(flutterProject.directory.path, output);
     }
     final Environment result = Environment(
-      outputDir: fs.directory(output),
+      outputDir: globals.fs.directory(output),
       buildDir: flutterProject.directory
           .childDirectory('.dart_tool')
           .childDirectory('flutter_build'),
@@ -180,7 +180,7 @@
     ));
     if (!result.success) {
       for (ExceptionMeasurement measurement in result.exceptions.values) {
-        printError('Target ${measurement.target} failed: ${measurement.exception}',
+        globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
             : null,
@@ -188,7 +188,7 @@
       }
       throwToolExit('build failed.');
     }
-    printTrace('build succeeded.');
+    globals.printTrace('build succeeded.');
     if (argResults.wasParsed('build-inputs')) {
       writeListIfChanged(result.inputFiles, stringArg('build-inputs'));
     }
@@ -196,9 +196,9 @@
       writeListIfChanged(result.outputFiles, stringArg('build-outputs'));
     }
     if (argResults.wasParsed('depfile')) {
-      final File depfileFile = fs.file(stringArg('depfile'));
+      final File depfileFile = globals.fs.file(stringArg('depfile'));
       final Depfile depfile = Depfile(result.inputFiles, result.outputFiles);
-      depfile.writeToFile(fs.file(depfileFile));
+      depfile.writeToFile(globals.fs.file(depfileFile));
     }
     return null;
   }
@@ -206,7 +206,7 @@
 
 @visibleForTesting
 void writeListIfChanged(List<File> files, String path) {
-  final File file = fs.file(path);
+  final File file = globals.fs.file(path);
   final StringBuffer buffer = StringBuffer();
   // These files are already sorted.
   for (File file in files) {
diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart
index da717c3..3ce4a89 100644
--- a/packages/flutter_tools/lib/src/commands/attach.dart
+++ b/packages/flutter_tools/lib/src/commands/attach.dart
@@ -11,14 +11,13 @@
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/terminal.dart';
 import '../base/utils.dart';
 import '../cache.dart';
 import '../commands/daemon.dart';
 import '../compile.dart';
 import '../device.dart';
 import '../fuchsia/fuchsia_device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../ios/devices.dart';
 import '../ios/simulators.dart';
 import '../mdns_discovery.dart';
@@ -172,11 +171,11 @@
 
     final Device device = await findTargetDevice();
 
-    final Artifacts artifacts = device.artifactOverrides ?? Artifacts.instance;
+    final Artifacts overrideArtifacts = device.artifactOverrides ?? globals.artifacts;
     await context.run<void>(
       body: () => _attachToDevice(device),
       overrides: <Type, Generator>{
-        Artifacts: () => artifacts,
+        Artifacts: () => overrideArtifacts,
     });
 
     return null;
@@ -254,7 +253,7 @@
             devicePort: deviceVmservicePort,
             hostPort: hostVmservicePort,
           );
-        printStatus('Waiting for a connection from Flutter on ${device.name}...');
+        globals.printStatus('Waiting for a connection from Flutter on ${device.name}...');
         observatoryUri = observatoryDiscovery.uris;
         // Determine ipv6 status from the scanned logs.
         usesIpv6 = observatoryDiscovery.ipv6;
@@ -272,7 +271,7 @@
         ).asBroadcastStream();
     }
 
-    terminal.usesTerminalUi = daemon == null;
+    globals.terminal.usesTerminalUi = daemon == null;
 
     try {
       int result;
@@ -291,7 +290,7 @@
             device,
             null,
             true,
-            fs.currentDirectory,
+            globals.fs.currentDirectory,
             LaunchMode.attach,
           );
         } catch (error) {
@@ -326,7 +325,7 @@
         if (runner.exited || !runner.isWaitingForObservatory) {
           break;
         }
-        printStatus('Waiting for a new connection from Flutter on ${device.name}...');
+        globals.printStatus('Waiting for a new connection from Flutter on ${device.name}...');
       }
     } finally {
       final List<ForwardedPort> ports = device.portForwarder.forwardedPorts.toList();
diff --git a/packages/flutter_tools/lib/src/commands/build_apk.dart b/packages/flutter_tools/lib/src/commands/build_apk.dart
index 05948bc..3307656 100644
--- a/packages/flutter_tools/lib/src/commands/build_apk.dart
+++ b/packages/flutter_tools/lib/src/commands/build_apk.dart
@@ -10,7 +10,7 @@
 import '../base/terminal.dart';
 import '../build_info.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import '../runner/flutter_command.dart' show FlutterCommandResult;
@@ -93,19 +93,19 @@
     if (buildInfo.isRelease && !androidBuildInfo.splitPerAbi && androidBuildInfo.targetArchs.length > 1) {
       final String targetPlatforms = stringsArg('target-platform').join(', ');
 
-      printStatus('You are building a fat APK that includes binaries for '
+      globals.printStatus('You are building a fat APK that includes binaries for '
                   '$targetPlatforms.', emphasis: true, color: TerminalColor.green);
-      printStatus('If you are deploying the app to the Play Store, '
+      globals.printStatus('If you are deploying the app to the Play Store, '
                   'it\'s recommended to use app bundles or split the APK to reduce the APK size.', emphasis: true);
-      printStatus('To generate an app bundle, run:', emphasis: true, indent: 4);
-      printStatus('flutter build appbundle '
+      globals.printStatus('To generate an app bundle, run:', emphasis: true, indent: 4);
+      globals.printStatus('flutter build appbundle '
                   '--target-platform ${targetPlatforms.replaceAll(' ', '')}',indent: 8);
-      printStatus('Learn more on: https://developer.android.com/guide/app-bundle',indent: 8);
-      printStatus('To split the APKs per ABI, run:', emphasis: true, indent: 4);
-      printStatus('flutter build apk '
+      globals.printStatus('Learn more on: https://developer.android.com/guide/app-bundle',indent: 8);
+      globals.printStatus('To split the APKs per ABI, run:', emphasis: true, indent: 4);
+      globals.printStatus('flutter build apk '
                   '--target-platform ${targetPlatforms.replaceAll(' ', '')} '
                   '--split-per-abi', indent: 8);
-      printStatus('Learn more on:  https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split',indent: 8);
+      globals.printStatus('Learn more on:  https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split',indent: 8);
     }
     await androidBuilder.buildApk(
       project: FlutterProject.current(),
diff --git a/packages/flutter_tools/lib/src/commands/build_bundle.dart b/packages/flutter_tools/lib/src/commands/build_bundle.dart
index 78b3747..90b1c73 100644
--- a/packages/flutter_tools/lib/src/commands/build_bundle.dart
+++ b/packages/flutter_tools/lib/src/commands/build_bundle.dart
@@ -5,10 +5,10 @@
 import 'dart:async';
 
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../build_info.dart';
 import '../bundle.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import '../runner/flutter_command.dart' show FlutterOptions, FlutterCommandResult;
@@ -82,7 +82,7 @@
 
   @override
   Future<Map<CustomDimensions, String>> get usageValues async {
-    final String projectDir = fs.file(targetFile).parent.parent.path;
+    final String projectDir = globals.fs.file(targetFile).parent.parent.path;
     final FlutterProject futterProject = FlutterProject.fromPath(projectDir);
     if (futterProject == null) {
       return const <CustomDimensions, String>{};
diff --git a/packages/flutter_tools/lib/src/commands/build_fuchsia.dart b/packages/flutter_tools/lib/src/commands/build_fuchsia.dart
index c64f128..b0a8c71 100644
--- a/packages/flutter_tools/lib/src/commands/build_fuchsia.dart
+++ b/packages/flutter_tools/lib/src/commands/build_fuchsia.dart
@@ -5,11 +5,11 @@
 import 'dart:async';
 
 import '../base/common.dart';
-import '../base/platform.dart';
 import '../build_info.dart';
 import '../cache.dart';
 import '../fuchsia/fuchsia_build.dart';
 import '../fuchsia/fuchsia_pm.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../runner/flutter_command.dart' show FlutterCommandResult;
 import 'build.dart';
@@ -56,7 +56,7 @@
     Cache.releaseLockEarly();
     final BuildInfo buildInfo = getBuildInfo();
     final FlutterProject flutterProject = FlutterProject.current();
-    if (!platform.isLinux && !platform.isMacOS) {
+    if (!globals.platform.isLinux && !globals.platform.isMacOS) {
       throwToolExit('"build fuchsia" is only supported on Linux and MacOS hosts.');
     }
     if (!flutterProject.fuchsia.existsSync()) {
diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart
index 62849ee..3f28e77 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios.dart
@@ -6,10 +6,9 @@
 
 import '../application_package.dart';
 import '../base/common.dart';
-import '../base/platform.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../ios/mac.dart';
 import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult;
 import 'build.dart';
@@ -51,7 +50,7 @@
     final bool forSimulator = boolArg('simulator');
     defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release;
 
-    if (!platform.isMacOS) {
+    if (!globals.platform.isMacOS) {
       throwToolExit('Building for iOS is only supported on the Mac.');
     }
 
@@ -64,7 +63,7 @@
     final bool shouldCodesign = boolArg('codesign');
 
     if (!forSimulator && !shouldCodesign) {
-      printStatus('Warning: Building for device with codesigning disabled. You will '
+      globals.printStatus('Warning: Building for device with codesigning disabled. You will '
         'have to manually codesign before deploying to device.');
     }
     final BuildInfo buildInfo = getBuildInfo();
@@ -74,8 +73,8 @@
 
     final String logTarget = forSimulator ? 'simulator' : 'device';
 
-    final String typeName = artifacts.getEngineType(TargetPlatform.ios, buildInfo.mode);
-    printStatus('Building $app for $logTarget ($typeName)...');
+    final String typeName = globals.artifacts.getEngineType(TargetPlatform.ios, buildInfo.mode);
+    globals.printStatus('Building $app for $logTarget ($typeName)...');
     final XcodeBuildResult result = await buildXcodeProject(
       app: app,
       buildInfo: buildInfo,
@@ -90,7 +89,7 @@
     }
 
     if (result.output != null) {
-      printStatus('Built ${result.output}.');
+      globals.printStatus('Built ${result.output}.');
     }
 
     return null;
diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
index 0cf45b1..bd48a12 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
@@ -13,14 +13,13 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../base/logger.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
 import '../build_system/targets/ios.dart';
 import '../bundle.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../macos/cocoapod_utils.dart';
 import '../macos/xcode.dart';
 import '../plugins.dart';
@@ -121,7 +120,7 @@
       throwToolExit('Building frameworks for iOS is only supported from a module.');
     }
 
-    if (!platform.isMacOS) {
+    if (!globals.platform.isMacOS) {
       throwToolExit('Building frameworks for iOS is only supported on the Mac.');
     }
 
@@ -141,7 +140,7 @@
     Cache.releaseLockEarly();
 
     final String outputArgument = stringArg('output')
-        ?? fs.path.join(fs.currentDirectory.path, 'build', 'ios', 'framework');
+        ?? globals.fs.path.join(globals.fs.currentDirectory.path, 'build', 'ios', 'framework');
 
     if (outputArgument.isEmpty) {
       throwToolExit('--output is required.');
@@ -153,14 +152,14 @@
       throwToolExit("Module's iOS folder missing");
     }
 
-    final Directory outputDirectory = fs.directory(fs.path.absolute(fs.path.normalize(outputArgument)));
+    final Directory outputDirectory = globals.fs.directory(globals.fs.path.absolute(globals.fs.path.normalize(outputArgument)));
 
     aotBuilder ??= AotBuilder();
     bundleBuilder ??= BundleBuilder();
-    cache ??= Cache.instance;
+    cache ??= globals.cache;
 
     for (BuildMode mode in buildModes) {
-      printStatus('Building framework for $iosProject in ${getNameForBuildMode(mode)} mode...');
+      globals.printStatus('Building framework for $iosProject in ${getNameForBuildMode(mode)} mode...');
       final String xcodeBuildConfiguration = toTitleCase(getNameForBuildMode(mode));
       final Directory modeDirectory = outputDirectory.childDirectory(xcodeBuildConfiguration);
 
@@ -188,7 +187,8 @@
         await _producePlugins(mode, xcodeBuildConfiguration, iPhoneBuildOutput, simulatorBuildOutput, modeDirectory, outputDirectory);
       }
 
-      final Status status = logger.startProgress(' └─Moving to ${fs.path.relative(modeDirectory.path)}', timeout: timeoutConfiguration.slowOperation);
+      final Status status = globals.logger.startProgress(
+        ' └─Moving to ${globals.fs.path.relative(modeDirectory.path)}', timeout: timeoutConfiguration.slowOperation);
       try {
         // Delete the intermediaries since they would have been copied into our
         // output frameworks.
@@ -203,7 +203,7 @@
       }
     }
 
-    printStatus('Frameworks written to ${outputDirectory.path}.');
+    globals.printStatus('Frameworks written to ${outputDirectory.path}.');
 
     return null;
   }
@@ -212,7 +212,7 @@
   /// vendored framework caching.
   @visibleForTesting
   void produceFlutterPodspec(BuildMode mode, Directory modeDirectory) {
-    final Status status = logger.startProgress(' ├─Creating Flutter.podspec...', timeout: timeoutConfiguration.fastOperation);
+    final Status status = globals.logger.startProgress(' ├─Creating Flutter.podspec...', timeout: timeoutConfiguration.fastOperation);
     try {
       final GitTagVersion gitTagVersion = flutterVersion.gitTagVersion;
       if (gitTagVersion.x == null || gitTagVersion.y == null || gitTagVersion.z == null || gitTagVersion.commits != 0) {
@@ -267,14 +267,14 @@
   }
 
   Future<void> _produceFlutterFramework(Directory outputDirectory, BuildMode mode, Directory iPhoneBuildOutput, Directory simulatorBuildOutput, Directory modeDirectory) async {
-    final Status status = logger.startProgress(' ├─Populating Flutter.framework...', timeout: timeoutConfiguration.slowOperation);
-    final String engineCacheFlutterFrameworkDirectory = artifacts.getArtifactPath(Artifact.flutterFramework, platform: TargetPlatform.ios, mode: mode);
-    final String flutterFrameworkFileName = fs.path.basename(engineCacheFlutterFrameworkDirectory);
+    final Status status = globals.logger.startProgress(' ├─Populating Flutter.framework...', timeout: timeoutConfiguration.slowOperation);
+    final String engineCacheFlutterFrameworkDirectory = globals.artifacts.getArtifactPath(Artifact.flutterFramework, platform: TargetPlatform.ios, mode: mode);
+    final String flutterFrameworkFileName = globals.fs.path.basename(engineCacheFlutterFrameworkDirectory);
     final Directory fatFlutterFrameworkCopy = modeDirectory.childDirectory(flutterFrameworkFileName);
 
     try {
       // Copy universal engine cache framework to mode directory.
-      copyDirectorySync(fs.directory(engineCacheFlutterFrameworkDirectory), fatFlutterFrameworkCopy);
+      copyDirectorySync(globals.fs.directory(engineCacheFlutterFrameworkDirectory), fatFlutterFrameworkCopy);
 
       if (mode != BuildMode.debug) {
         final File fatFlutterFrameworkBinary = fatFlutterFrameworkCopy.childFile('Flutter');
@@ -312,7 +312,7 @@
     destinationAppFrameworkDirectory.createSync(recursive: true);
 
     if (mode == BuildMode.debug) {
-      final Status status = logger.startProgress(' ├─Adding placeholder App.framework for debug...', timeout: timeoutConfiguration.fastOperation);
+      final Status status = globals.logger.startProgress(' ├─Adding placeholder App.framework for debug...', timeout: timeoutConfiguration.fastOperation);
       try {
         await _produceStubAppFrameworkIfNeeded(mode, iPhoneBuildOutput, simulatorBuildOutput, destinationAppFrameworkDirectory);
       } finally {
@@ -327,13 +327,14 @@
 
     destinationInfoPlist.writeAsBytesSync(sourceInfoPlist.readAsBytesSync());
 
-    final Status status = logger.startProgress(' ├─Assembling Flutter resources for App.framework...', timeout: timeoutConfiguration.slowOperation);
+    final Status status = globals.logger.startProgress(
+      ' ├─Assembling Flutter resources for App.framework...', timeout: timeoutConfiguration.slowOperation);
     try {
       await bundleBuilder.build(
         platform: TargetPlatform.ios,
         buildMode: mode,
         // Relative paths show noise in the compiler https://github.com/dart-lang/sdk/issues/37978.
-        mainPath: fs.path.absolute(targetFile),
+        mainPath: globals.fs.path.absolute(targetFile),
         assetDirPath: destinationAppFrameworkDirectory.childDirectory('flutter_assets').path,
         precompiledSnapshot: mode != BuildMode.debug,
       );
@@ -382,14 +383,15 @@
     if (mode == BuildMode.debug) {
       return;
     }
-    final Status status = logger.startProgress(' ├─Building Dart AOT for App.framework...', timeout: timeoutConfiguration.slowOperation);
+    final Status status = globals.logger.startProgress(
+      ' ├─Building Dart AOT for App.framework...', timeout: timeoutConfiguration.slowOperation);
     try {
       await aotBuilder.build(
         platform: TargetPlatform.ios,
         outputPath: iPhoneBuildOutput.path,
         buildMode: mode,
         // Relative paths show noise in the compiler https://github.com/dart-lang/sdk/issues/37978.
-        mainDartFile: fs.path.absolute(targetFile),
+        mainDartFile: globals.fs.path.absolute(targetFile),
         quiet: true,
         bitcode: true,
         reportTimings: false,
@@ -412,7 +414,8 @@
     Directory modeDirectory,
     Directory outputDirectory,
   ) async {
-    final Status status = logger.startProgress(' ├─Building plugins...', timeout: timeoutConfiguration.slowOperation);
+    final Status status = globals.logger.startProgress(
+      ' ├─Building plugins...', timeout: timeoutConfiguration.slowOperation);
     try {
       List<String> pluginsBuildCommand = <String>[
         'xcrun',
@@ -470,15 +473,15 @@
       for (Directory builtProduct in iPhoneBuildConfiguration.listSync(followLinks: false).whereType<Directory>()) {
         for (FileSystemEntity podProduct in builtProduct.listSync(followLinks: false)) {
           final String podFrameworkName = podProduct.basename;
-          if (fs.path.extension(podFrameworkName) == '.framework') {
-            final String binaryName = fs.path.basenameWithoutExtension(podFrameworkName);
+          if (globals.fs.path.extension(podFrameworkName) == '.framework') {
+            final String binaryName = globals.fs.path.basenameWithoutExtension(podFrameworkName);
             if (boolArg('universal')) {
               copyDirectorySync(podProduct as Directory, modeDirectory.childDirectory(podFrameworkName));
               final List<String> lipoCommand = <String>[
                 'xcrun',
                 'lipo',
                 '-create',
-                fs.path.join(podProduct.path, binaryName),
+                globals.fs.path.join(podProduct.path, binaryName),
                 if (mode == BuildMode.debug)
                   simulatorBuildConfiguration.childDirectory(binaryName).childDirectory(podFrameworkName).childFile(binaryName).path,
                 '-output',
@@ -531,10 +534,10 @@
 
   void _produceXCFramework(BuildMode mode, Directory fatFramework) {
     if (boolArg('xcframework')) {
-      final String frameworkBinaryName = fs.path.basenameWithoutExtension(
+      final String frameworkBinaryName = globals.fs.path.basenameWithoutExtension(
           fatFramework.basename);
 
-      final Status status = logger.startProgress(' ├─Creating $frameworkBinaryName.xcframework...', timeout: timeoutConfiguration.fastOperation);
+      final Status status = globals.logger.startProgress(' ├─Creating $frameworkBinaryName.xcframework...', timeout: timeoutConfiguration.fastOperation);
       try {
         if (mode == BuildMode.debug) {
           _produceDebugXCFramework(fatFramework, frameworkBinaryName);
@@ -555,7 +558,7 @@
     final String frameworkFileName = fatFramework.basename;
     final File fatFlutterFrameworkBinary = fatFramework.childFile(
         frameworkBinaryName);
-    final Directory temporaryOutput = fs.systemTempDirectory.createTempSync(
+    final Directory temporaryOutput = globals.fs.systemTempDirectory.createTempSync(
         'flutter_tool_build_ios_framework.');
     try {
       // Copy universal framework to variant directory.
diff --git a/packages/flutter_tools/lib/src/commands/build_linux.dart b/packages/flutter_tools/lib/src/commands/build_linux.dart
index eb2d447..b3e9b78 100644
--- a/packages/flutter_tools/lib/src/commands/build_linux.dart
+++ b/packages/flutter_tools/lib/src/commands/build_linux.dart
@@ -5,10 +5,10 @@
 import 'dart:async';
 
 import '../base/common.dart';
-import '../base/platform.dart';
 import '../build_info.dart';
 import '../cache.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 import '../linux/build_linux.dart';
 import '../project.dart';
 import '../runner/flutter_command.dart' show FlutterCommandResult;
@@ -25,7 +25,7 @@
   final String name = 'linux';
 
   @override
-  bool get hidden => !featureFlags.isLinuxEnabled || !platform.isLinux;
+  bool get hidden => !featureFlags.isLinuxEnabled || !globals.platform.isLinux;
 
   @override
   Future<Set<DevelopmentArtifact>> get requiredArtifacts async => <DevelopmentArtifact>{
@@ -43,7 +43,7 @@
     if (!featureFlags.isLinuxEnabled) {
       throwToolExit('"build linux" is not currently supported.');
     }
-    if (!platform.isLinux) {
+    if (!globals.platform.isLinux) {
       throwToolExit('"build linux" only supported on Linux hosts.');
     }
     if (!flutterProject.linux.existsSync()) {
diff --git a/packages/flutter_tools/lib/src/commands/build_macos.dart b/packages/flutter_tools/lib/src/commands/build_macos.dart
index 8ee6c45..c966f3c 100644
--- a/packages/flutter_tools/lib/src/commands/build_macos.dart
+++ b/packages/flutter_tools/lib/src/commands/build_macos.dart
@@ -5,10 +5,10 @@
 import 'dart:async';
 
 import '../base/common.dart';
-import '../base/platform.dart';
 import '../build_info.dart';
 import '../cache.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 import '../macos/build_macos.dart';
 import '../project.dart';
 import '../runner/flutter_command.dart' show FlutterCommandResult;
@@ -25,7 +25,7 @@
   final String name = 'macos';
 
   @override
-  bool get hidden => !featureFlags.isMacOSEnabled || !platform.isMacOS;
+  bool get hidden => !featureFlags.isMacOSEnabled || !globals.platform.isMacOS;
 
   @override
   Future<Set<DevelopmentArtifact>> get requiredArtifacts async => <DevelopmentArtifact>{
@@ -43,7 +43,7 @@
     if (!featureFlags.isMacOSEnabled) {
       throwToolExit('"build macos" is not currently supported.');
     }
-    if (!platform.isMacOS) {
+    if (!globals.platform.isMacOS) {
       throwToolExit('"build macos" only supported on macOS hosts.');
     }
     if (!flutterProject.macos.existsSync()) {
diff --git a/packages/flutter_tools/lib/src/commands/build_windows.dart b/packages/flutter_tools/lib/src/commands/build_windows.dart
index 24d154d..7be232b 100644
--- a/packages/flutter_tools/lib/src/commands/build_windows.dart
+++ b/packages/flutter_tools/lib/src/commands/build_windows.dart
@@ -5,10 +5,10 @@
 import 'dart:async';
 
 import '../base/common.dart';
-import '../base/platform.dart';
 import '../build_info.dart';
 import '../cache.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../runner/flutter_command.dart' show FlutterCommandResult;
 import '../windows/build_windows.dart';
@@ -25,7 +25,7 @@
   final String name = 'windows';
 
   @override
-  bool get hidden => !featureFlags.isWindowsEnabled || !platform.isWindows;
+  bool get hidden => !featureFlags.isWindowsEnabled || !globals.platform.isWindows;
 
   @override
   Future<Set<DevelopmentArtifact>> get requiredArtifacts async => <DevelopmentArtifact>{
@@ -43,7 +43,7 @@
     if (!featureFlags.isWindowsEnabled) {
       throwToolExit('"build windows" is not currently supported.');
     }
-    if (!platform.isWindows) {
+    if (!globals.platform.isWindows) {
       throwToolExit('"build windows" only supported on Windows hosts.');
     }
     if (!flutterProject.windows.existsSync()) {
diff --git a/packages/flutter_tools/lib/src/commands/channel.dart b/packages/flutter_tools/lib/src/commands/channel.dart
index 2071d19..2b9461f 100644
--- a/packages/flutter_tools/lib/src/commands/channel.dart
+++ b/packages/flutter_tools/lib/src/commands/channel.dart
@@ -7,7 +7,7 @@
 import '../base/common.dart';
 import '../base/process.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 import '../version.dart';
 
@@ -60,7 +60,7 @@
 
     showAll = showAll || currentChannel != currentBranch;
 
-    printStatus('Flutter channels:');
+    globals.printStatus('Flutter channels:');
     final int result = await processUtils.stream(
       <String>['git', 'branch', '-r'],
       workingDirectory: Cache.flutterRoot,
@@ -94,12 +94,12 @@
   }
 
   Future<void> _switchChannel(String branchName) {
-    printStatus("Switching to flutter channel '$branchName'...");
+    globals.printStatus("Switching to flutter channel '$branchName'...");
     if (FlutterVersion.obsoleteBranches.containsKey(branchName)) {
       final String alternative = FlutterVersion.obsoleteBranches[branchName];
-      printStatus("This channel is obsolete. Consider switching to the '$alternative' channel instead.");
+      globals.printStatus("This channel is obsolete. Consider switching to the '$alternative' channel instead.");
     } else if (!FlutterVersion.officialChannels.contains(branchName)) {
-      printStatus('This is not an official channel. For a list of available channels, try "flutter channel".');
+      globals.printStatus('This is not an official channel. For a list of available channels, try "flutter channel".');
     }
     return _checkout(branchName);
   }
@@ -108,7 +108,7 @@
     final String channel = FlutterVersion.instance.channel;
     if (FlutterVersion.obsoleteBranches.containsKey(channel)) {
       final String alternative = FlutterVersion.obsoleteBranches[channel];
-      printStatus("Transitioning from '$channel' to '$alternative'...");
+      globals.printStatus("Transitioning from '$channel' to '$alternative'...");
       return _checkout(alternative);
     }
   }
diff --git a/packages/flutter_tools/lib/src/commands/clean.dart b/packages/flutter_tools/lib/src/commands/clean.dart
index f1b7140..5d7bc07 100644
--- a/packages/flutter_tools/lib/src/commands/clean.dart
+++ b/packages/flutter_tools/lib/src/commands/clean.dart
@@ -8,9 +8,8 @@
 
 import '../base/file_system.dart';
 import '../base/logger.dart';
-import '../base/platform.dart';
 import '../build_info.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../ios/xcodeproj.dart';
 import '../macos/xcode.dart';
 import '../project.dart';
@@ -40,7 +39,7 @@
       await _cleanXcode(flutterProject.macos);
     }
 
-    final Directory buildDir = fs.directory(getBuildDirectory());
+    final Directory buildDir = globals.fs.directory(getBuildDirectory());
     deleteFile(buildDir);
 
     deleteFile(flutterProject.dartTool);
@@ -67,7 +66,10 @@
     if (!xcodeProject.existsSync()) {
       return;
     }
-    final Status xcodeStatus = logger.startProgress('Cleaning Xcode workspace...', timeout: timeoutConfiguration.slowOperation);
+    final Status xcodeStatus = globals.logger.startProgress(
+      'Cleaning Xcode workspace...',
+      timeout: timeoutConfiguration.slowOperation,
+    );
     try {
       final Directory xcodeWorkspace = xcodeProject.xcodeWorkspace;
       final XcodeProjectInfo projectInfo = await xcodeProjectInterpreter.getInfo(xcodeWorkspace.parent.path);
@@ -75,7 +77,7 @@
         xcodeProjectInterpreter.cleanWorkspace(xcodeWorkspace.path, scheme);
       }
     } catch (error) {
-      printTrace('Could not clean Xcode workspace: $error');
+      globals.printTrace('Could not clean Xcode workspace: $error');
     } finally {
       xcodeStatus?.stop();
     }
@@ -89,22 +91,25 @@
         return;
       }
     } on FileSystemException catch (err) {
-      printError('Cannot clean ${file.path}.\n$err');
+      globals.printError('Cannot clean ${file.path}.\n$err');
       return;
     }
-    final Status deletionStatus = logger.startProgress('Deleting ${file.basename}...', timeout: timeoutConfiguration.fastOperation);
+    final Status deletionStatus = globals.logger.startProgress(
+      'Deleting ${file.basename}...',
+      timeout: timeoutConfiguration.fastOperation,
+    );
     try {
       file.deleteSync(recursive: true);
     } on FileSystemException catch (error) {
       final String path = file.path;
-      if (platform.isWindows) {
-        printError(
+      if (globals.platform.isWindows) {
+        globals.printError(
           'Failed to remove $path. '
             'A program may still be using a file in the directory or the directory itself. '
             'To find and stop such a program, see: '
             'https://superuser.com/questions/1333118/cant-delete-empty-folder-because-it-is-used');
       } else {
-        printError('Failed to remove $path: $error');
+        globals.printError('Failed to remove $path: $error');
       }
     } finally {
       deletionStatus.stop();
diff --git a/packages/flutter_tools/lib/src/commands/config.dart b/packages/flutter_tools/lib/src/commands/config.dart
index bbe6044..d1626ac 100644
--- a/packages/flutter_tools/lib/src/commands/config.dart
+++ b/packages/flutter_tools/lib/src/commands/config.dart
@@ -7,10 +7,9 @@
 import '../android/android_sdk.dart';
 import '../android/android_studio.dart';
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../convert.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../reporting/reporting.dart';
 import '../runner/flutter_command.dart';
 import '../version.dart';
@@ -75,7 +74,7 @@
         featuresByName[feature.configSetting] = feature;
       }
     }
-    String values = config.keys
+    String values = globals.config.keys
         .map<String>((String key) {
           String configFooter = '';
           if (featuresByName.containsKey(key)) {
@@ -84,7 +83,7 @@
               configFooter = '(Unavailable)';
             }
           }
-          return '  $key: ${config.getValue(key)} $configFooter';
+          return '  $key: ${globals.config.getValue(key)} $configFooter';
         }).join('\n');
     if (values.isEmpty) {
       values = '  No settings have been configured.';
@@ -108,7 +107,7 @@
     if (boolArg('clear-features')) {
       for (Feature feature in allFeatures) {
         if (feature.configSetting != null) {
-          config.removeValue(feature.configSetting);
+          globals.config.removeValue(feature.configSetting);
         }
       }
       return null;
@@ -118,7 +117,7 @@
       final bool value = boolArg('analytics');
       flutterUsage.enabled = value;
       AnalyticsConfigEvent(enabled: value).send();
-      printStatus('Analytics reporting ${value ? 'enabled' : 'disabled'}.');
+      globals.printStatus('Analytics reporting ${value ? 'enabled' : 'disabled'}.');
     }
 
     if (argResults.wasParsed('android-sdk')) {
@@ -135,7 +134,7 @@
 
     if (argResults.wasParsed('build-dir')) {
       final String buildDir = stringArg('build-dir');
-      if (fs.path.isAbsolute(buildDir)) {
+      if (globals.fs.path.isAbsolute(buildDir)) {
         throwToolExit('build-dir should be a relative path');
       }
       _updateConfig('build-dir', buildDir);
@@ -147,15 +146,15 @@
       }
       if (argResults.wasParsed(feature.configSetting)) {
         final bool keyValue = boolArg(feature.configSetting);
-        config.setValue(feature.configSetting, keyValue);
-        printStatus('Setting "${feature.configSetting}" value to "$keyValue".');
+        globals.config.setValue(feature.configSetting, keyValue);
+        globals.printStatus('Setting "${feature.configSetting}" value to "$keyValue".');
       }
     }
 
     if (argResults.arguments.isEmpty) {
-      printStatus(usage);
+      globals.printStatus(usage);
     } else {
-      printStatus('\nYou may need to restart any open editors for them to read new settings.');
+      globals.printStatus('\nYou may need to restart any open editors for them to read new settings.');
     }
 
     return null;
@@ -164,8 +163,8 @@
   Future<void> handleMachine() async {
     // Get all the current values.
     final Map<String, dynamic> results = <String, dynamic>{};
-    for (String key in config.keys) {
-      results[key] = config.getValue(key);
+    for (String key in globals.config.keys) {
+      results[key] = globals.config.getValue(key);
     }
 
     // Ensure we send any calculated ones, if overrides don't exist.
@@ -176,16 +175,16 @@
       results['android-sdk'] = androidSdk.directory;
     }
 
-    printStatus(const JsonEncoder.withIndent('  ').convert(results));
+    globals.printStatus(const JsonEncoder.withIndent('  ').convert(results));
   }
 
   void _updateConfig(String keyName, String keyValue) {
     if (keyValue.isEmpty) {
-      config.removeValue(keyName);
-      printStatus('Removing "$keyName" value.');
+      globals.config.removeValue(keyName);
+      globals.printStatus('Removing "$keyName" value.');
     } else {
-      config.setValue(keyName, keyValue);
-      printStatus('Setting "$keyName" value to "$keyValue".');
+      globals.config.setValue(keyName, keyValue);
+      globals.printStatus('Setting "$keyName" value to "$keyValue".');
     }
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 071d4a7..823da6a 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -20,7 +20,7 @@
 import '../dart/pub.dart';
 import '../doctor.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import '../runner/flutter_command.dart';
@@ -176,7 +176,7 @@
       if (!projectDir.existsSync()) {
         return null;
       }
-      final File metadataFile = fs.file(fs.path.join(projectDir.absolute.path, '.metadata'));
+      final File metadataFile = globals.fs.file(globals.fs.path.join(projectDir.absolute.path, '.metadata'));
       if (!metadataFile.existsSync()) {
         return null;
       }
@@ -190,7 +190,7 @@
     }
 
     bool exists(List<String> path) {
-      return fs.directory(fs.path.joinAll(<String>[projectDir.absolute.path, ...path])).existsSync();
+      return globals.fs.directory(globals.fs.path.joinAll(<String>[projectDir.absolute.path, ...path])).existsSync();
     }
 
     // If it exists, the project type in the metadata is definitive.
@@ -243,7 +243,7 @@
   /// [outputFilePath].
   Future<void> _writeSamplesJson(String outputFilePath) async {
     try {
-      final File outputFile = fs.file(outputFilePath);
+      final File outputFile = globals.fs.file(outputFilePath);
       if (outputFile.existsSync()) {
         throwToolExit('File "$outputFilePath" already exists', exitCode: 1);
       }
@@ -253,7 +253,7 @@
       }
       else {
         outputFile.writeAsStringSync(samplesJson);
-        printStatus('Wrote samples JSON to "$outputFilePath"');
+        globals.printStatus('Wrote samples JSON to "$outputFilePath"');
       }
     } catch (e) {
       throwToolExit('Failed to write samples JSON to "$outputFilePath": $e', exitCode: 2);
@@ -320,21 +320,21 @@
         'variable was specified. Unable to find package:flutter.', exitCode: 2);
     }
 
-    final String flutterRoot = fs.path.absolute(Cache.flutterRoot);
+    final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot);
 
-    final String flutterPackagesDirectory = fs.path.join(flutterRoot, 'packages');
-    final String flutterPackagePath = fs.path.join(flutterPackagesDirectory, 'flutter');
-    if (!fs.isFileSync(fs.path.join(flutterPackagePath, 'pubspec.yaml'))) {
+    final String flutterPackagesDirectory = globals.fs.path.join(flutterRoot, 'packages');
+    final String flutterPackagePath = globals.fs.path.join(flutterPackagesDirectory, 'flutter');
+    if (!globals.fs.isFileSync(globals.fs.path.join(flutterPackagePath, 'pubspec.yaml'))) {
       throwToolExit('Unable to find package:flutter in $flutterPackagePath', exitCode: 2);
     }
 
-    final String flutterDriverPackagePath = fs.path.join(flutterRoot, 'packages', 'flutter_driver');
-    if (!fs.isFileSync(fs.path.join(flutterDriverPackagePath, 'pubspec.yaml'))) {
+    final String flutterDriverPackagePath = globals.fs.path.join(flutterRoot, 'packages', 'flutter_driver');
+    if (!globals.fs.isFileSync(globals.fs.path.join(flutterDriverPackagePath, 'pubspec.yaml'))) {
       throwToolExit('Unable to find package:flutter_driver in $flutterDriverPackagePath', exitCode: 2);
     }
 
-    final Directory projectDir = fs.directory(argResults.rest.first);
-    final String projectDirPath = fs.path.normalize(projectDir.absolute.path);
+    final Directory projectDir = globals.fs.directory(argResults.rest.first);
+    final String projectDirPath = globals.fs.path.normalize(projectDir.absolute.path);
 
     String sampleCode;
     if (argResults['sample'] != null) {
@@ -372,7 +372,7 @@
       throwToolExit(error);
     }
 
-    final String projectName = stringArg('project-name') ?? fs.path.basename(projectDirPath);
+    final String projectName = stringArg('project-name') ?? globals.fs.path.basename(projectDirPath);
     error = _validateProjectName(projectName);
     if (error != null) {
       throwToolExit(error);
@@ -392,18 +392,18 @@
       macos: featureFlags.isMacOSEnabled,
     );
 
-    final String relativeDirPath = fs.path.relative(projectDirPath);
+    final String relativeDirPath = globals.fs.path.relative(projectDirPath);
     if (!projectDir.existsSync() || projectDir.listSync().isEmpty) {
-      printStatus('Creating project $relativeDirPath... androidx: ${boolArg('androidx')}');
+      globals.printStatus('Creating project $relativeDirPath... androidx: ${boolArg('androidx')}');
     } else {
       if (sampleCode != null && !overwrite) {
         throwToolExit('Will not overwrite existing project in $relativeDirPath: '
           'must specify --overwrite for samples to overwrite.');
       }
-      printStatus('Recreating project $relativeDirPath...');
+      globals.printStatus('Recreating project $relativeDirPath...');
     }
 
-    final Directory relativeDir = fs.directory(projectDirPath);
+    final Directory relativeDir = globals.fs.directory(projectDirPath);
     int generatedFileCount = 0;
     switch (template) {
       case _ProjectType.app:
@@ -422,36 +422,36 @@
     if (sampleCode != null) {
       generatedFileCount += _applySample(relativeDir, sampleCode);
     }
-    printStatus('Wrote $generatedFileCount files.');
-    printStatus('\nAll done!');
+    globals.printStatus('Wrote $generatedFileCount files.');
+    globals.printStatus('\nAll done!');
     final String application = sampleCode != null ? 'sample application' : 'application';
     if (generatePackage) {
-      final String relativeMainPath = fs.path.normalize(fs.path.join(
+      final String relativeMainPath = globals.fs.path.normalize(globals.fs.path.join(
         relativeDirPath,
         'lib',
         '${templateContext['projectName']}.dart',
       ));
-      printStatus('Your package code is in $relativeMainPath');
+      globals.printStatus('Your package code is in $relativeMainPath');
     } else if (generateModule) {
-      final String relativeMainPath = fs.path.normalize(fs.path.join(
+      final String relativeMainPath = globals.fs.path.normalize(globals.fs.path.join(
           relativeDirPath,
           'lib',
           'main.dart',
       ));
-      printStatus('Your module code is in $relativeMainPath.');
+      globals.printStatus('Your module code is in $relativeMainPath.');
     } else {
       // Run doctor; tell the user the next steps.
       final FlutterProject project = FlutterProject.fromPath(projectDirPath);
       final FlutterProject app = project.hasExampleApp ? project.example : project;
-      final String relativeAppPath = fs.path.normalize(fs.path.relative(app.directory.path));
-      final String relativeAppMain = fs.path.join(relativeAppPath, 'lib', 'main.dart');
-      final String relativePluginPath = fs.path.normalize(fs.path.relative(projectDirPath));
-      final String relativePluginMain = fs.path.join(relativePluginPath, 'lib', '$projectName.dart');
+      final String relativeAppPath = globals.fs.path.normalize(globals.fs.path.relative(app.directory.path));
+      final String relativeAppMain = globals.fs.path.join(relativeAppPath, 'lib', 'main.dart');
+      final String relativePluginPath = globals.fs.path.normalize(globals.fs.path.relative(projectDirPath));
+      final String relativePluginMain = globals.fs.path.join(relativePluginPath, 'lib', '$projectName.dart');
       if (doctor.canLaunchAnything) {
         // Let them know a summary of the state of their tooling.
         await doctor.summary();
 
-        printStatus('''
+        globals.printStatus('''
 In order to run your $application, type:
 
   \$ cd $relativeAppPath
@@ -460,7 +460,7 @@
 Your $application code is in $relativeAppMain.
 ''');
         if (generatePlugin) {
-          printStatus('''
+          globals.printStatus('''
 Your plugin code is in $relativePluginMain.
 
 Host platform code is in the "android" and "ios" directories under $relativePluginPath.
@@ -468,18 +468,18 @@
 ''');
         }
       } else {
-        printStatus("You'll need to install additional components before you can run "
+        globals.printStatus("You'll need to install additional components before you can run "
             'your Flutter app:');
-        printStatus('');
+        globals.printStatus('');
 
         // Give the user more detailed analysis.
         await doctor.diagnose();
-        printStatus('');
-        printStatus("After installing components, run 'flutter doctor' in order to "
+        globals.printStatus('');
+        globals.printStatus("After installing components, run 'flutter doctor' in order to "
             're-validate your setup.');
-        printStatus("When complete, type 'flutter run' from the '$relativeAppPath' "
+        globals.printStatus("When complete, type 'flutter run' from the '$relativeAppPath' "
             'directory in order to launch your app.');
-        printStatus('Your $application code is in $relativeAppMain');
+        globals.printStatus('Your $application code is in $relativeAppMain');
       }
     }
 
@@ -492,7 +492,7 @@
         ? stringArg('description')
         : 'A new flutter module project.';
     templateContext['description'] = description;
-    generatedCount += _renderTemplate(fs.path.join('module', 'common'), directory, templateContext, overwrite: overwrite);
+    generatedCount += _renderTemplate(globals.fs.path.join('module', 'common'), directory, templateContext, overwrite: overwrite);
     if (boolArg('pub')) {
       await pub.get(
         context: PubContext.create,
@@ -602,7 +602,7 @@
     bool web = false,
     bool macos = false,
   }) {
-    flutterRoot = fs.path.normalize(flutterRoot);
+    flutterRoot = globals.fs.path.normalize(flutterRoot);
 
     final String pluginDartClass = _createPluginClassName(projectName);
     final String pluginClass = pluginDartClass.endsWith('Plugin')
@@ -652,7 +652,7 @@
   int _injectGradleWrapper(FlutterProject project) {
     int filesCreated = 0;
     copyDirectorySync(
-      cache.getArtifactDirectory('gradle_wrapper'),
+      globals.cache.getArtifactDirectory('gradle_wrapper'),
       project.android.hostAppGradleRoot,
       onFileCopied: (File sourceFile, File destinationFile) {
         filesCreated++;
@@ -850,14 +850,14 @@
 /// Return null if the project directory is legal. Return a validation message
 /// if we should disallow the directory name.
 String _validateProjectDir(String dirPath, { String flutterRoot, bool overwrite = false }) {
-  if (fs.path.isWithin(flutterRoot, dirPath)) {
+  if (globals.fs.path.isWithin(flutterRoot, dirPath)) {
     return 'Cannot create a project within the Flutter SDK. '
       "Target directory '$dirPath' is within the Flutter SDK at '$flutterRoot'.";
   }
 
   // If the destination directory is actually a file, then we refuse to
   // overwrite, on the theory that the user probably didn't expect it to exist.
-  if (fs.isFileSync(dirPath)) {
+  if (globals.fs.isFileSync(dirPath)) {
     return "Invalid project name: '$dirPath' - refers to an existing file."
         '${overwrite ? ' Refusing to overwrite a file with a directory.' : ''}';
   }
@@ -866,7 +866,7 @@
     return null;
   }
 
-  final FileSystemEntityType type = fs.typeSync(dirPath);
+  final FileSystemEntityType type = globals.fs.typeSync(dirPath);
 
   if (type != FileSystemEntityType.notFound) {
     switch (type) {
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index d4dd562..0c30d60 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -18,7 +18,7 @@
 import '../convert.dart';
 import '../device.dart';
 import '../emulator.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../resident_runner.dart';
 import '../run_cold.dart';
@@ -50,7 +50,7 @@
 
   @override
   Future<FlutterCommandResult> runCommand() async {
-    printStatus('Starting device daemon...');
+    globals.printStatus('Starting device daemon...');
     isRunningFromDaemon = true;
 
     final NotifyingLogger notifyingLogger = NotifyingLogger();
@@ -361,7 +361,7 @@
     if (res is Map<String, dynamic> && res['url'] is String) {
       return res['url'] as String;
     } else {
-      printError('Invalid response to exposeUrl - params should include a String url field');
+      globals.printError('Invalid response to exposeUrl - params should include a String url field');
       return url;
     }
   }
@@ -387,7 +387,7 @@
     try {
       // TODO(jonahwilliams): replace this with a project metadata check once
       // that has been implemented.
-      final FlutterProject flutterProject = FlutterProject.fromDirectory(fs.directory(projectRoot));
+      final FlutterProject flutterProject = FlutterProject.fromDirectory(globals.fs.directory(projectRoot));
       if (flutterProject.linux.existsSync()) {
         result.add('linux');
       }
@@ -472,8 +472,8 @@
       throw '${toTitleCase(options.buildInfo.friendlyModeName)} mode is not supported for emulators.';
     }
     // We change the current working directory for the duration of the `start` command.
-    final Directory cwd = fs.currentDirectory;
-    fs.currentDirectory = fs.directory(projectDirectory);
+    final Directory cwd = globals.fs.currentDirectory;
+    globals.fs.currentDirectory = globals.fs.directory(projectDirectory);
     final FlutterProject flutterProject = FlutterProject.current();
 
     final FlutterDevice flutterDevice = await FlutterDevice.create(
@@ -600,7 +600,7 @@
           'trace': '$trace',
         });
       } finally {
-        fs.currentDirectory = cwd;
+        globals.fs.currentDirectory = cwd;
         _apps.remove(app);
       }
     });
@@ -779,7 +779,7 @@
           final Map<String, Object> response = await _deviceToMap(device);
           sendEvent(eventName, response);
         } catch (err) {
-          printError('$err');
+          globals.printError('$err');
         }
       });
     };
@@ -1011,7 +1011,7 @@
   }
 
   Future<T> _runInZone<T>(AppDomain domain, FutureOr<T> method()) {
-    _logger ??= _AppRunLogger(domain, this, parent: logToStdout ? logger : null);
+    _logger ??= _AppRunLogger(domain, this, parent: logToStdout ? globals.logger : null);
 
     return context.run<T>(
       body: method,
diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart
index b9842f5..dbae667 100644
--- a/packages/flutter_tools/lib/src/commands/devices.dart
+++ b/packages/flutter_tools/lib/src/commands/devices.dart
@@ -8,7 +8,7 @@
 import '../base/utils.dart';
 import '../device.dart';
 import '../doctor.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 
 class DevicesCommand extends FlutterCommand {
@@ -30,20 +30,20 @@
     final List<Device> devices = await deviceManager.getAllConnectedDevices().toList();
 
     if (devices.isEmpty) {
-      printStatus(
+      globals.printStatus(
         'No devices detected.\n\n'
         "Run 'flutter emulators' to list and start any available device emulators.\n\n"
         'Or, if you expected your device to be detected, please run "flutter doctor" to diagnose '
         'potential issues, or visit https://flutter.dev/setup/ for troubleshooting tips.');
       final List<String> diagnostics = await deviceManager.getDeviceDiagnostics();
       if (diagnostics.isNotEmpty) {
-        printStatus('');
+        globals.printStatus('');
         for (String diagnostic in diagnostics) {
-          printStatus('• $diagnostic', hangingIndent: 2);
+          globals.printStatus('• $diagnostic', hangingIndent: 2);
         }
       }
     } else {
-      printStatus('${devices.length} connected ${pluralize('device', devices.length)}:\n');
+      globals.printStatus('${devices.length} connected ${pluralize('device', devices.length)}:\n');
       await Device.printDevices(devices);
     }
 
diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart
index 5245c61..c69fe0b 100644
--- a/packages/flutter_tools/lib/src/commands/drive.dart
+++ b/packages/flutter_tools/lib/src/commands/drive.dart
@@ -12,7 +12,7 @@
 import '../dart/package_map.dart';
 import '../dart/sdk.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../resident_runner.dart';
 import '../runner/flutter_command.dart' show FlutterCommandResult;
@@ -131,13 +131,13 @@
       throwToolExit(null);
     }
 
-    if (await fs.type(testFile) != FileSystemEntityType.file) {
+    if (await globals.fs.type(testFile) != FileSystemEntityType.file) {
       throwToolExit('Test file not found: $testFile');
     }
 
     String observatoryUri;
     if (argResults['use-existing-app'] == null) {
-      printStatus('Starting application: $targetFile');
+      globals.printStatus('Starting application: $targetFile');
 
       if (getBuildInfo().isRelease) {
         // This is because we need VM service to be able to drive the app.
@@ -155,7 +155,7 @@
       }
       observatoryUri = result.observatoryUri.toString();
     } else {
-      printStatus('Will connect to already running application instance.');
+      globals.printStatus('Will connect to already running application instance.');
       observatoryUri = stringArg('use-existing-app');
     }
 
@@ -178,9 +178,9 @@
       throwToolExit('CAUGHT EXCEPTION: $error\n$stackTrace');
     } finally {
       if (boolArg('keep-app-running') ?? (argResults['use-existing-app'] != null)) {
-        printStatus('Leaving the application running.');
+        globals.printStatus('Leaving the application running.');
       } else {
-        printStatus('Stopping application instance.');
+        globals.printStatus('Stopping application instance.');
         await appStopper(this);
       }
     }
@@ -195,28 +195,28 @@
 
     // If the --driver argument wasn't provided, then derive the value from
     // the target file.
-    String appFile = fs.path.normalize(targetFile);
+    String appFile = globals.fs.path.normalize(targetFile);
 
     // This command extends `flutter run` and therefore CWD == package dir
-    final String packageDir = fs.currentDirectory.path;
+    final String packageDir = globals.fs.currentDirectory.path;
 
     // Make appFile path relative to package directory because we are looking
     // for the corresponding test file relative to it.
-    if (!fs.path.isRelative(appFile)) {
-      if (!fs.path.isWithin(packageDir, appFile)) {
-        printError(
+    if (!globals.fs.path.isRelative(appFile)) {
+      if (!globals.fs.path.isWithin(packageDir, appFile)) {
+        globals.printError(
           'Application file $appFile is outside the package directory $packageDir'
         );
         return null;
       }
 
-      appFile = fs.path.relative(appFile, from: packageDir);
+      appFile = globals.fs.path.relative(appFile, from: packageDir);
     }
 
-    final List<String> parts = fs.path.split(appFile);
+    final List<String> parts = globals.fs.path.split(appFile);
 
     if (parts.length < 2) {
-      printError(
+      globals.printError(
         'Application file $appFile must reside in one of the sub-directories '
         'of the package structure, not in the root directory.'
       );
@@ -226,9 +226,9 @@
     // Look for the test file inside `test_driver/` matching the sub-path, e.g.
     // if the application is `lib/foo/bar.dart`, the test file is expected to
     // be `test_driver/foo/bar_test.dart`.
-    final String pathWithNoExtension = fs.path.withoutExtension(fs.path.joinAll(
+    final String pathWithNoExtension = globals.fs.path.withoutExtension(globals.fs.path.joinAll(
       <String>[packageDir, 'test_driver', ...parts.skip(1)]));
-    return '${pathWithNoExtension}_test${fs.path.extension(appFile)}';
+    return '${pathWithNoExtension}_test${globals.fs.path.extension(appFile)}';
   }
 }
 
@@ -237,11 +237,11 @@
 
   if (deviceManager.hasSpecifiedDeviceId) {
     if (devices.isEmpty) {
-      printStatus("No devices found with name or id matching '${deviceManager.specifiedDeviceId}'");
+      globals.printStatus("No devices found with name or id matching '${deviceManager.specifiedDeviceId}'");
       return null;
     }
     if (devices.length > 1) {
-      printStatus("Found ${devices.length} devices with name or id matching '${deviceManager.specifiedDeviceId}':");
+      globals.printStatus("Found ${devices.length} devices with name or id matching '${deviceManager.specifiedDeviceId}':");
       await Device.printDevices(devices);
       return null;
     }
@@ -249,13 +249,13 @@
   }
 
   if (devices.isEmpty) {
-    printError('No devices found.');
+    globals.printError('No devices found.');
     return null;
   } else if (devices.length > 1) {
-    printStatus('Found multiple connected devices:');
+    globals.printStatus('Found multiple connected devices:');
     await Device.printDevices(devices);
   }
-  printStatus('Using device ${devices.first.name}.');
+  globals.printStatus('Using device ${devices.first.name}.');
   return devices.first;
 }
 
@@ -269,19 +269,19 @@
 
 Future<LaunchResult> _startApp(DriveCommand command) async {
   final String mainPath = findMainDartFile(command.targetFile);
-  if (await fs.type(mainPath) != FileSystemEntityType.file) {
-    printError('Tried to run $mainPath, but that file does not exist.');
+  if (await globals.fs.type(mainPath) != FileSystemEntityType.file) {
+    globals.printError('Tried to run $mainPath, but that file does not exist.');
     return null;
   }
 
-  printTrace('Stopping previously running application, if any.');
+  globals.printTrace('Stopping previously running application, if any.');
   await appStopper(command);
 
   final ApplicationPackage package = await command.applicationPackages
       .getPackageForPlatform(await command.device.targetPlatform);
 
   if (command.shouldBuild) {
-    printTrace('Installing application package.');
+    globals.printTrace('Installing application package.');
     if (await command.device.isAppInstalled(package)) {
       await command.device.uninstallApp(package);
     }
@@ -293,14 +293,14 @@
     platformArgs['trace-startup'] = command.traceStartup;
   }
 
-  printTrace('Starting application.');
+  globals.printTrace('Starting application.');
 
   // Forward device log messages to the terminal window running the "drive" command.
   command._deviceLogSubscription = command
       .device
       .getLogReader(app: package)
       .logLines
-      .listen(printStatus);
+      .listen(globals.printStatus);
 
   final LaunchResult result = await command.device.startApp(
     package,
@@ -334,10 +334,10 @@
 }
 
 Future<void> _runTests(List<String> testArgs, Map<String, String> environment) async {
-  printTrace('Running driver tests.');
+  globals.printTrace('Running driver tests.');
 
-  PackageMap.globalPackagesPath = fs.path.normalize(fs.path.absolute(PackageMap.globalPackagesPath));
-  final String dartVmPath = fs.path.join(dartSdkPath, 'bin', 'dart');
+  PackageMap.globalPackagesPath = globals.fs.path.normalize(globals.fs.path.absolute(PackageMap.globalPackagesPath));
+  final String dartVmPath = globals.fs.path.join(dartSdkPath, 'bin', 'dart');
   final int result = await processUtils.stream(
     <String>[
       dartVmPath,
@@ -362,7 +362,7 @@
 }
 
 Future<bool> _stopApp(DriveCommand command) async {
-  printTrace('Stopping application.');
+  globals.printTrace('Stopping application.');
   final ApplicationPackage package = await command.applicationPackages.getPackageForPlatform(await command.device.targetPlatform);
   final bool stopped = await command.device.stopApp(package);
   await command._deviceLogSubscription?.cancel();
diff --git a/packages/flutter_tools/lib/src/commands/emulators.dart b/packages/flutter_tools/lib/src/commands/emulators.dart
index ae84aec..320884d 100644
--- a/packages/flutter_tools/lib/src/commands/emulators.dart
+++ b/packages/flutter_tools/lib/src/commands/emulators.dart
@@ -5,11 +5,10 @@
 import 'dart:async';
 
 import '../base/common.dart';
-import '../base/platform.dart';
 import '../base/utils.dart';
 import '../doctor.dart';
 import '../emulator.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 
 class EmulatorsCommand extends FlutterCommand {
@@ -38,7 +37,7 @@
       throwToolExit(
           'Unable to find any emulator sources. Please ensure you have some\n'
               'Android AVD images ' +
-              (platform.isMacOS ? 'or an iOS Simulator ' : '') +
+              (globals.platform.isMacOS ? 'or an iOS Simulator ' : '') +
               'available.',
           exitCode: 1);
     }
@@ -63,7 +62,7 @@
         await emulatorManager.getEmulatorsMatching(id);
 
     if (emulators.isEmpty) {
-      printStatus("No emulator found that matches '$id'.");
+      globals.printStatus("No emulator found that matches '$id'.");
     } else if (emulators.length > 1) {
       _printEmulatorList(
         emulators,
@@ -75,7 +74,7 @@
       }
       catch (e) {
         if (e is String) {
-          printError(e);
+          globals.printError(e);
         } else {
           rethrow;
         }
@@ -88,10 +87,10 @@
         await emulatorManager.createEmulator(name: name);
 
     if (createResult.success) {
-      printStatus("Emulator '${createResult.emulatorName}' created successfully.");
+      globals.printStatus("Emulator '${createResult.emulatorName}' created successfully.");
     } else {
-      printStatus("Failed to create emulator '${createResult.emulatorName}'.\n");
-      printStatus(createResult.error.trim());
+      globals.printStatus("Failed to create emulator '${createResult.emulatorName}'.\n");
+      globals.printStatus(createResult.error.trim());
       _printAdditionalInfo();
     }
   }
@@ -102,7 +101,7 @@
         : await emulatorManager.getEmulatorsMatching(searchText);
 
     if (emulators.isEmpty) {
-      printStatus('No emulators available.');
+      globals.printStatus('No emulators available.');
       _printAdditionalInfo(showCreateInstruction: true);
     } else {
       _printEmulatorList(
@@ -113,7 +112,7 @@
   }
 
   void _printEmulatorList(List<Emulator> emulators, String message) {
-    printStatus('$message\n');
+    globals.printStatus('$message\n');
     Emulator.printEmulators(emulators);
     _printAdditionalInfo(showCreateInstruction: true, showRunInstruction: true);
   }
@@ -122,22 +121,22 @@
     bool showRunInstruction = false,
     bool showCreateInstruction = false,
   }) {
-    printStatus('');
+    globals.printStatus('');
     if (showRunInstruction) {
-      printStatus(
+      globals.printStatus(
           "To run an emulator, run 'flutter emulators --launch <emulator id>'.");
     }
     if (showCreateInstruction) {
-      printStatus(
+      globals.printStatus(
           "To create a new emulator, run 'flutter emulators --create [--name xyz]'.");
     }
 
     if (showRunInstruction || showCreateInstruction) {
-      printStatus('');
+      globals.printStatus('');
     }
     // TODO(dantup): Update this link to flutter.dev if/when we have a better page.
     // That page can then link out to these places if required.
-    printStatus('You can find more information on managing emulators at the links below:\n'
+    globals.printStatus('You can find more information on managing emulators at the links below:\n'
         '  https://developer.android.com/studio/run/managing-avds\n'
         '  https://developer.android.com/studio/command-line/avdmanager');
   }
diff --git a/packages/flutter_tools/lib/src/commands/generate.dart b/packages/flutter_tools/lib/src/commands/generate.dart
index 5cf4fb3..7b23bae 100644
--- a/packages/flutter_tools/lib/src/commands/generate.dart
+++ b/packages/flutter_tools/lib/src/commands/generate.dart
@@ -6,7 +6,7 @@
 import '../cache.dart';
 import '../codegen.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../runner/flutter_command.dart';
 
@@ -28,7 +28,7 @@
     codegenDaemon.startBuild();
     await for (CodegenStatus codegenStatus in codegenDaemon.buildResults) {
       if (codegenStatus == CodegenStatus.Failed) {
-        printError('Code generation failed.');
+        globals.printError('Code generation failed.');
         break;
       }
       if (codegenStatus ==CodegenStatus.Succeeded) {
@@ -48,12 +48,12 @@
       try {
         final List<Object> errorData = json.decode(errorFile.readAsStringSync()) as List<Object>;
         final List<Object> stackData = errorData[1] as List<Object>;
-        printError(errorData.first as String);
-        printError(stackData[0] as String);
-        printError(stackData[1] as String);
-        printError(StackTrace.fromString(stackData[2] as String).toString());
+        globals.printError(errorData.first as String);
+        globals.printError(stackData[0] as String);
+        globals.printError(stackData[1] as String);
+        globals.printError(StackTrace.fromString(stackData[2] as String).toString());
       } catch (err) {
-        printError('Error reading error in ${errorFile.path}');
+        globals.printError('Error reading error in ${errorFile.path}');
       }
     }
     return const FlutterCommandResult(ExitStatus.fail);
diff --git a/packages/flutter_tools/lib/src/commands/ide_config.dart b/packages/flutter_tools/lib/src/commands/ide_config.dart
index e343c69..fd1c6fc 100644
--- a/packages/flutter_tools/lib/src/commands/ide_config.dart
+++ b/packages/flutter_tools/lib/src/commands/ide_config.dart
@@ -7,7 +7,7 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 import '../template.dart';
 
@@ -64,7 +64,7 @@
 
   static const String _ideName = 'intellij';
   Directory get _templateDirectory {
-    return fs.directory(fs.path.join(
+    return globals.fs.directory(globals.fs.path.join(
       Cache.flutterRoot,
       'packages',
       'flutter_tools',
@@ -74,7 +74,7 @@
   }
 
   Directory get _createTemplatesDirectory {
-    return fs.directory(fs.path.join(
+    return globals.fs.directory(globals.fs.path.join(
       Cache.flutterRoot,
       'packages',
       'flutter_tools',
@@ -82,16 +82,16 @@
     ));
   }
 
-  Directory get _flutterRoot => fs.directory(fs.path.absolute(Cache.flutterRoot));
+  Directory get _flutterRoot => globals.fs.directory(globals.fs.path.absolute(Cache.flutterRoot));
 
   // Returns true if any entire path element is equal to dir.
   bool _hasDirectoryInPath(FileSystemEntity entity, String dir) {
     String path = entity.absolute.path;
-    while (path.isNotEmpty && fs.path.dirname(path) != path) {
-      if (fs.path.basename(path) == dir) {
+    while (path.isNotEmpty && globals.fs.path.dirname(path) != path) {
+      if (globals.fs.path.basename(path) == dir) {
         return true;
       }
-      path = fs.path.dirname(path);
+      path = globals.fs.path.dirname(path);
     }
     return false;
   }
@@ -127,7 +127,7 @@
     final Set<String> manifest = <String>{};
     final Iterable<File> flutterFiles = _flutterRoot.listSync(recursive: true).whereType<File>();
     for (File srcFile in flutterFiles) {
-      final String relativePath = fs.path.relative(srcFile.path, from: _flutterRoot.absolute.path);
+      final String relativePath = globals.fs.path.relative(srcFile.path, from: _flutterRoot.absolute.path);
 
       // Skip template files in both the ide_templates and templates
       // directories to avoid copying onto themselves.
@@ -148,30 +148,30 @@
         continue;
       }
 
-      final File finalDestinationFile = fs.file(fs.path.absolute(
+      final File finalDestinationFile = globals.fs.file(globals.fs.path.absolute(
           _templateDirectory.absolute.path, '$relativePath${Template.copyTemplateExtension}'));
       final String relativeDestination =
-          fs.path.relative(finalDestinationFile.path, from: _flutterRoot.absolute.path);
+          globals.fs.path.relative(finalDestinationFile.path, from: _flutterRoot.absolute.path);
       if (finalDestinationFile.existsSync()) {
         if (_fileIsIdentical(srcFile, finalDestinationFile)) {
-          printTrace('  $relativeDestination (identical)');
+          globals.printTrace('  $relativeDestination (identical)');
           manifest.add('$relativePath${Template.copyTemplateExtension}');
           continue;
         }
         if (boolArg('overwrite')) {
           finalDestinationFile.deleteSync();
-          printStatus('  $relativeDestination (overwritten)');
+          globals.printStatus('  $relativeDestination (overwritten)');
         } else {
-          printTrace('  $relativeDestination (existing - skipped)');
+          globals.printTrace('  $relativeDestination (existing - skipped)');
           manifest.add('$relativePath${Template.copyTemplateExtension}');
           continue;
         }
       } else {
-        printStatus('  $relativeDestination (added)');
+        globals.printStatus('  $relativeDestination (added)');
       }
-      final Directory finalDestinationDir = fs.directory(finalDestinationFile.dirname);
+      final Directory finalDestinationDir = globals.fs.directory(finalDestinationFile.dirname);
       if (!finalDestinationDir.existsSync()) {
-        printTrace("  ${finalDestinationDir.path} doesn't exist, creating.");
+        globals.printTrace("  ${finalDestinationDir.path} doesn't exist, creating.");
         finalDestinationDir.createSync(recursive: true);
       }
       srcFile.copySync(finalDestinationFile.path);
@@ -187,24 +187,24 @@
     // them.
     final Iterable<File> templateFiles = _templateDirectory.listSync(recursive: true).whereType<File>();
     for (File templateFile in templateFiles) {
-      final String relativePath = fs.path.relative(
+      final String relativePath = globals.fs.path.relative(
         templateFile.absolute.path,
         from: _templateDirectory.absolute.path,
       );
       if (!manifest.contains(relativePath)) {
         templateFile.deleteSync();
         final String relativeDestination =
-            fs.path.relative(templateFile.path, from: _flutterRoot.absolute.path);
-        printStatus('  $relativeDestination (removed)');
+            globals.fs.path.relative(templateFile.path, from: _flutterRoot.absolute.path);
+        globals.printStatus('  $relativeDestination (removed)');
       }
       // If the directory is now empty, then remove it, and do the same for its parent,
       // until we escape to the template directory.
-      Directory parentDir = fs.directory(templateFile.dirname);
+      Directory parentDir = globals.fs.directory(templateFile.dirname);
       while (parentDir.listSync().isEmpty) {
         parentDir.deleteSync();
-        printTrace('  ${fs.path.relative(parentDir.absolute.path)} (empty directory - removed)');
-        parentDir = fs.directory(parentDir.dirname);
-        if (fs.path.isWithin(_templateDirectory.absolute.path, parentDir.absolute.path)) {
+        globals.printTrace('  ${globals.fs.path.relative(parentDir.absolute.path)} (empty directory - removed)');
+        parentDir = globals.fs.directory(parentDir.dirname);
+        if (globals.fs.path.isWithin(_templateDirectory.absolute.path, parentDir.absolute.path)) {
           break;
         }
       }
@@ -222,9 +222,9 @@
       return null;
     }
 
-    final String flutterRoot = fs.path.absolute(Cache.flutterRoot);
-    final String dirPath = fs.path.normalize(
-      fs.directory(fs.path.absolute(Cache.flutterRoot)).absolute.path,
+    final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot);
+    final String dirPath = globals.fs.path.normalize(
+      globals.fs.directory(globals.fs.path.absolute(Cache.flutterRoot)).absolute.path,
     );
 
     final String error = _validateFlutterDir(dirPath, flutterRoot: flutterRoot);
@@ -232,15 +232,15 @@
       throwToolExit(error);
     }
 
-    printStatus('Updating IDE configuration for Flutter tree at $dirPath...');
+    globals.printStatus('Updating IDE configuration for Flutter tree at $dirPath...');
     int generatedCount = 0;
     generatedCount += _renderTemplate(_ideName, dirPath, <String, dynamic>{
       'withRootModule': boolArg('with-root-module'),
     });
 
-    printStatus('Wrote $generatedCount files.');
-    printStatus('');
-    printStatus('Your IntelliJ configuration is now up to date. It is prudent to '
+    globals.printStatus('Wrote $generatedCount files.');
+    globals.printStatus('');
+    globals.printStatus('Your IntelliJ configuration is now up to date. It is prudent to '
         'restart IntelliJ, if running.');
 
     return null;
@@ -249,7 +249,7 @@
   int _renderTemplate(String templateName, String dirPath, Map<String, dynamic> context) {
     final Template template = Template(_templateDirectory, _templateDirectory);
     return template.render(
-      fs.directory(dirPath),
+      globals.fs.directory(dirPath),
       context,
       overwriteExisting: boolArg('overwrite'),
     );
@@ -259,7 +259,7 @@
 /// Return null if the flutter root directory is a valid destination. Return a
 /// validation message if we should disallow the directory.
 String _validateFlutterDir(String dirPath, { String flutterRoot }) {
-  final FileSystemEntityType type = fs.typeSync(dirPath);
+  final FileSystemEntityType type = globals.fs.typeSync(dirPath);
 
   if (type != FileSystemEntityType.notFound) {
     switch (type) {
diff --git a/packages/flutter_tools/lib/src/commands/inject_plugins.dart b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
index 72aad34..285670d 100644
--- a/packages/flutter_tools/lib/src/commands/inject_plugins.dart
+++ b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../plugins.dart';
 import '../project.dart';
 import '../runner/flutter_command.dart';
@@ -33,9 +33,9 @@
     await injectPlugins(project, checkProjects: true);
     final bool result = hasPlugins(project);
     if (result) {
-      printStatus('GeneratedPluginRegistrants successfully written.');
+      globals.printStatus('GeneratedPluginRegistrants successfully written.');
     } else {
-      printStatus('This project does not use plugins, no GeneratedPluginRegistrants have been created.');
+      globals.printStatus('This project does not use plugins, no GeneratedPluginRegistrants have been created.');
     }
 
     return null;
diff --git a/packages/flutter_tools/lib/src/commands/install.dart b/packages/flutter_tools/lib/src/commands/install.dart
index 4ca851d..1a04de9 100644
--- a/packages/flutter_tools/lib/src/commands/install.dart
+++ b/packages/flutter_tools/lib/src/commands/install.dart
@@ -8,7 +8,7 @@
 import '../base/common.dart';
 import '../cache.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 
 class InstallCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts {
@@ -39,7 +39,7 @@
 
     Cache.releaseLockEarly();
 
-    printStatus('Installing $package to $device...');
+    globals.printStatus('Installing $package to $device...');
 
     if (!await installApp(device, package)) {
       throwToolExit('Install failed');
@@ -55,9 +55,9 @@
   }
 
   if (uninstall && await device.isAppInstalled(package)) {
-    printStatus('Uninstalling old version...');
+    globals.printStatus('Uninstalling old version...');
     if (!await device.uninstallApp(package)) {
-      printError('Warning: uninstalling old version failed');
+      globals.printError('Warning: uninstalling old version failed');
     }
   }
 
diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart
index a38b614..8fefada 100644
--- a/packages/flutter_tools/lib/src/commands/logs.dart
+++ b/packages/flutter_tools/lib/src/commands/logs.dart
@@ -8,7 +8,7 @@
 import '../base/io.dart';
 import '../cache.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 
 class LogsCommand extends FlutterCommand {
@@ -50,13 +50,13 @@
 
     Cache.releaseLockEarly();
 
-    printStatus('Showing $logReader logs:');
+    globals.printStatus('Showing $logReader logs:');
 
     final Completer<int> exitCompleter = Completer<int>();
 
     // Start reading.
     final StreamSubscription<String> subscription = logReader.logLines.listen(
-      (String message) => printStatus(message, wrap: false),
+      (String message) => globals.printStatus(message, wrap: false),
       onDone: () {
         exitCompleter.complete(0);
       },
@@ -68,7 +68,7 @@
     // When terminating, close down the log reader.
     ProcessSignal.SIGINT.watch().listen((ProcessSignal signal) {
       subscription.cancel();
-      printStatus('');
+      globals.printStatus('');
       exitCompleter.complete(0);
     });
     ProcessSignal.SIGTERM.watch().listen((ProcessSignal signal) {
diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart
index dbcc92b..d9a6dd2 100644
--- a/packages/flutter_tools/lib/src/commands/precache.dart
+++ b/packages/flutter_tools/lib/src/commands/precache.dart
@@ -6,7 +6,7 @@
 
 import '../cache.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 import '../version.dart';
 
@@ -60,10 +60,10 @@
   @override
   Future<FlutterCommandResult> runCommand() async {
     if (boolArg('all-platforms')) {
-      cache.includeAllPlatforms = true;
+      globals.cache.includeAllPlatforms = true;
     }
     if (boolArg('use-unsigned-mac-binaries')) {
-      cache.useUnsignedMacBinaries = true;
+      globals.cache.useUnsignedMacBinaries = true;
     }
     final Set<DevelopmentArtifact> requiredArtifacts = <DevelopmentArtifact>{};
     for (DevelopmentArtifact artifact in DevelopmentArtifact.values) {
@@ -83,10 +83,10 @@
       }
     }
     final bool forceUpdate = boolArg('force');
-    if (forceUpdate || !cache.isUpToDate()) {
-      await cache.updateAll(requiredArtifacts);
+    if (forceUpdate || !globals.cache.isUpToDate()) {
+      await globals.cache.updateAll(requiredArtifacts);
     } else {
-      printStatus('Already up-to-date.');
+      globals.printStatus('Already up-to-date.');
     }
     return null;
   }
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 811761e..0fe5581 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -8,14 +8,13 @@
 
 import '../base/common.dart';
 import '../base/file_system.dart';
-import '../base/terminal.dart';
 import '../base/time.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
 import '../cache.dart';
 import '../device.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import '../resident_runner.dart';
@@ -271,7 +270,7 @@
         final Iterable<File> swiftFiles = iosProject.hostAppRoot
             .listSync(recursive: true, followLinks: false)
             .whereType<File>()
-            .where((File file) => fs.path.extension(file.path) == '.swift');
+            .where((File file) => globals.fs.path.extension(file.path) == '.swift');
         hostLanguage.add(swiftFiles.isNotEmpty ? 'swift' : 'objc');
       }
     }
@@ -395,11 +394,11 @@
       try {
         final String applicationBinaryPath = stringArg('use-application-binary');
         app = await daemon.appDomain.startApp(
-          devices.first, fs.currentDirectory.path, targetFile, route,
+          devices.first, globals.fs.currentDirectory.path, targetFile, route,
           _createDebuggingOptions(), hotMode,
           applicationBinary: applicationBinaryPath == null
               ? null
-              : fs.file(applicationBinaryPath),
+              : globals.fs.file(applicationBinaryPath),
           trackWidgetCreation: boolArg('track-widget-creation'),
           projectRootPath: stringArg('project-root'),
           packagesFilePath: globalResults['packages'] as String,
@@ -420,7 +419,7 @@
         endTimeOverride: appStartedTime,
       );
     }
-    terminal.usesTerminalUi = true;
+    globals.terminal.usesTerminalUi = true;
 
     if (argResults['dart-flags'] != null && !FlutterVersion.instance.isMaster) {
       throw UsageException('--dart-flags is not available on the stable '
@@ -429,7 +428,7 @@
 
     for (Device device in devices) {
       if (!device.supportsFastStart && boolArg('fast-start')) {
-        printStatus(
+        globals.printStatus(
           'Using --fast-start option with device ${device.name}, but this device '
           'does not support it. Overriding the setting to false.'
         );
@@ -438,12 +437,12 @@
         if (await device.supportsHardwareRendering) {
           final bool enableSoftwareRendering = boolArg('enable-software-rendering') == true;
           if (enableSoftwareRendering) {
-            printStatus(
+            globals.printStatus(
               'Using software rendering with device ${device.name}. You may get better performance '
               'with hardware mode by configuring hardware rendering for your device.'
             );
           } else {
-            printStatus(
+            globals.printStatus(
               'Using hardware rendering with device ${device.name}. If you get graphics artifacts, '
               'consider enabling software rendering with "--enable-software-rendering".'
             );
@@ -501,7 +500,7 @@
         benchmarkMode: boolArg('benchmark'),
         applicationBinary: applicationBinaryPath == null
             ? null
-            : fs.file(applicationBinaryPath),
+            : globals.fs.file(applicationBinaryPath),
         projectRootPath: stringArg('project-root'),
         packagesFilePath: globalResults['packages'] as String,
         dillOutputPath: stringArg('output-dill'),
@@ -528,7 +527,7 @@
         awaitFirstFrameWhenTracing: awaitFirstFrameWhenTracing,
         applicationBinary: applicationBinaryPath == null
             ? null
-            : fs.file(applicationBinaryPath),
+            : globals.fs.file(applicationBinaryPath),
         ipv6: ipv6,
         stayResident: stayResident,
       );
diff --git a/packages/flutter_tools/lib/src/commands/screenshot.dart b/packages/flutter_tools/lib/src/commands/screenshot.dart
index 8f9b05b..47ec354 100644
--- a/packages/flutter_tools/lib/src/commands/screenshot.dart
+++ b/packages/flutter_tools/lib/src/commands/screenshot.dart
@@ -9,7 +9,7 @@
 import '../base/utils.dart';
 import '../convert.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 import '../vmservice.dart';
 
@@ -91,7 +91,7 @@
   Future<FlutterCommandResult> runCommand() async {
     File outputFile;
     if (argResults.wasParsed(_kOut)) {
-      outputFile = fs.file(stringArg(_kOut));
+      outputFile = globals.fs.file(stringArg(_kOut));
     }
 
     switch (stringArg(_kType)) {
@@ -110,7 +110,7 @@
   }
 
   Future<void> runScreenshot(File outputFile) async {
-    outputFile ??= getUniqueFile(fs.currentDirectory, 'flutter', 'png');
+    outputFile ??= getUniqueFile(globals.fs.currentDirectory, 'flutter', 'png');
     try {
       await device.takeScreenshot(outputFile);
     } catch (error) {
@@ -121,7 +121,7 @@
 
   Future<void> runSkia(File outputFile) async {
     final Map<String, dynamic> skp = await _invokeVmServiceRpc('_flutter.screenshotSkp');
-    outputFile ??= getUniqueFile(fs.currentDirectory, 'flutter', 'skp');
+    outputFile ??= getUniqueFile(globals.fs.currentDirectory, 'flutter', 'skp');
     final IOSink sink = outputFile.openWrite();
     sink.add(base64.decode(skp['skp'] as String));
     await sink.close();
@@ -131,7 +131,7 @@
 
   Future<void> runRasterizer(File outputFile) async {
     final Map<String, dynamic> response = await _invokeVmServiceRpc('_flutter.screenshot');
-    outputFile ??= getUniqueFile(fs.currentDirectory, 'flutter', 'png');
+    outputFile ??= getUniqueFile(globals.fs.currentDirectory, 'flutter', 'png');
     final IOSink sink = outputFile.openWrite();
     sink.add(base64.decode(response['screenshot'] as String));
     await sink.close();
@@ -159,6 +159,6 @@
 
   void _showOutputFileInfo(File outputFile) {
     final int sizeKB = (outputFile.lengthSync()) ~/ 1024;
-    printStatus('Screenshot written to ${fs.path.relative(outputFile.path)} (${sizeKB}kB).');
+    globals.printStatus('Screenshot written to ${globals.fs.path.relative(outputFile.path)} (${sizeKB}kB).');
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/shell_completion.dart b/packages/flutter_tools/lib/src/commands/shell_completion.dart
index 27dfdc2..7cf89e5 100644
--- a/packages/flutter_tools/lib/src/commands/shell_completion.dart
+++ b/packages/flutter_tools/lib/src/commands/shell_completion.dart
@@ -9,6 +9,7 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 
 class ShellCompletionCommand extends FlutterCommand {
@@ -52,7 +53,7 @@
       return null;
     }
 
-    final File outputFile = fs.file(argResults.rest.first);
+    final File outputFile = globals.fs.file(argResults.rest.first);
     if (outputFile.existsSync() && !boolArg('overwrite')) {
       throwToolExit(
         'Output file ${outputFile.path} already exists, will not overwrite. '
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index bedf99a..21e2e0f 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -8,14 +8,13 @@
 import '../asset.dart';
 import '../base/common.dart';
 import '../base/file_system.dart';
-import '../base/platform.dart';
 import '../build_info.dart';
 import '../bundle.dart';
 import '../cache.dart';
 import '../codegen.dart';
 import '../dart/pub.dart';
 import '../devfs.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../runner/flutter_command.dart';
 import '../test/coverage_collector.dart';
@@ -90,7 +89,7 @@
       )
       ..addOption('concurrency',
         abbr: 'j',
-        defaultsTo: math.max<int>(1, platform.numberOfProcessors - 2).toString(),
+        defaultsTo: math.max<int>(1, globals.platform.numberOfProcessors - 2).toString(),
         help: 'The number of concurrent test processes to run.',
         valueHelp: 'jobs',
       )
@@ -135,8 +134,8 @@
 
   @override
   Future<FlutterCommandResult> runCommand() async {
-    await cache.updateAll(await requiredArtifacts);
-    if (!fs.isFileSync('pubspec.yaml')) {
+    await globals.cache.updateAll(await requiredArtifacts);
+    if (!globals.fs.isFileSync('pubspec.yaml')) {
       throwToolExit(
         'Error: No pubspec.yaml file found in the current working directory.\n'
         'Run this command from the root of your project. Test files must be '
@@ -155,7 +154,7 @@
       await _buildTestAsset();
     }
 
-    List<String> files = argResults.rest.map<String>((String testPath) => fs.path.absolute(testPath)).toList();
+    List<String> files = argResults.rest.map<String>((String testPath) => globals.fs.path.absolute(testPath)).toList();
 
     final bool startPaused = boolArg('start-paused');
     if (startPaused && files.length != 1) {
@@ -176,7 +175,7 @@
     if (files.isEmpty) {
       // We don't scan the entire package, only the test/ subdirectory, so that
       // files with names like like "hit_test.dart" don't get run.
-      workDir = fs.directory('test');
+      workDir = globals.fs.directory('test');
       if (!workDir.existsSync()) {
         throwToolExit('Test directory "${workDir.path}" not found.');
       }
@@ -190,8 +189,8 @@
     } else {
       files = <String>[
         for (String path in files)
-          if (fs.isDirectorySync(path))
-            ..._findTests(fs.directory(path))
+          if (globals.fs.isDirectorySync(path))
+            ..._findTests(globals.fs.directory(path))
           else
             path,
       ];
@@ -281,18 +280,18 @@
       throwToolExit('Error: Failed to build asset bundle');
     }
     if (_needRebuild(assetBundle.entries)) {
-      await writeBundle(fs.directory(fs.path.join('build', 'unit_test_assets')),
+      await writeBundle(globals.fs.directory(globals.fs.path.join('build', 'unit_test_assets')),
           assetBundle.entries);
     }
   }
 
   bool _needRebuild(Map<String, DevFSContent> entries) {
-    final File manifest = fs.file(fs.path.join('build', 'unit_test_assets', 'AssetManifest.json'));
+    final File manifest = globals.fs.file(globals.fs.path.join('build', 'unit_test_assets', 'AssetManifest.json'));
     if (!manifest.existsSync()) {
       return true;
     }
     final DateTime lastModified = manifest.lastModifiedSync();
-    final File pub = fs.file('pubspec.yaml');
+    final File pub = globals.fs.file('pubspec.yaml');
     if (pub.lastModifiedSync().isAfter(lastModified)) {
       return true;
     }
@@ -311,6 +310,6 @@
 Iterable<String> _findTests(Directory directory) {
   return directory.listSync(recursive: true, followLinks: false)
       .where((FileSystemEntity entity) => entity.path.endsWith('_test.dart') &&
-      fs.isFileSync(entity.path))
-      .map((FileSystemEntity entity) => fs.path.absolute(entity.path));
+      globals.fs.isFileSync(entity.path))
+      .map((FileSystemEntity entity) => globals.fs.path.absolute(entity.path));
 }
diff --git a/packages/flutter_tools/lib/src/commands/unpack.dart b/packages/flutter_tools/lib/src/commands/unpack.dart
index 5f2fec2..e2c228d 100644
--- a/packages/flutter_tools/lib/src/commands/unpack.dart
+++ b/packages/flutter_tools/lib/src/commands/unpack.dart
@@ -7,7 +7,7 @@
 import '../base/file_system.dart';
 import '../build_info.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 
 /// The directory in the Flutter cache for each platform's artifacts.
@@ -73,14 +73,14 @@
   Future<FlutterCommandResult> runCommand() async {
     final String targetName = stringArg('target-platform');
     final String targetDirectory = stringArg('cache-dir');
-    if (!fs.directory(targetDirectory).existsSync()) {
-      fs.directory(targetDirectory).createSync(recursive: true);
+    if (!globals.fs.directory(targetDirectory).existsSync()) {
+      globals.fs.directory(targetDirectory).createSync(recursive: true);
     }
     final TargetPlatform targetPlatform = getTargetPlatformForName(targetName);
     final ArtifactUnpacker flutterArtifactFetcher = ArtifactUnpacker(targetPlatform);
     bool success = true;
-    if (artifacts is LocalEngineArtifacts) {
-      final LocalEngineArtifacts localEngineArtifacts = artifacts as LocalEngineArtifacts;
+    if (globals.artifacts is LocalEngineArtifacts) {
+      final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
       success = flutterArtifactFetcher.copyLocalBuildArtifacts(
         localEngineArtifacts.engineOutPath,
         targetDirectory,
@@ -124,9 +124,9 @@
         throwToolExit('Unsupported target platform: $platform');
     }
     final String targetHash =
-        readHashFileIfPossible(Cache.instance.getStampFileFor(cacheStamp));
+        readHashFileIfPossible(globals.cache.getStampFileFor(cacheStamp));
     if (targetHash == null) {
-      printError('Failed to find engine stamp file');
+      globals.printError('Failed to find engine stamp file');
       return false;
     }
 
@@ -134,7 +134,7 @@
       final String currentHash = _lastCopiedHash(targetDirectory);
       if (currentHash == null || targetHash != currentHash) {
         // Copy them to the target directory.
-        final String flutterCacheDirectory = fs.path.join(
+        final String flutterCacheDirectory = globals.fs.path.join(
           Cache.flutterRoot,
           'bin',
           'cache',
@@ -146,13 +146,13 @@
           return false;
         }
         _setLastCopiedHash(targetDirectory, targetHash);
-        printTrace('Copied artifacts for version $targetHash.');
+        globals.printTrace('Copied artifacts for version $targetHash.');
       } else {
-        printTrace('Artifacts for version $targetHash already present.');
+        globals.printTrace('Artifacts for version $targetHash already present.');
       }
     } catch (error, stackTrace) {
-      printError(stackTrace.toString());
-      printError(error.toString());
+      globals.printError(stackTrace.toString());
+      globals.printError(error.toString());
       return false;
     }
     return true;
@@ -179,30 +179,30 @@
   bool _copyArtifactFiles(String sourceDirectory, String targetDirectory) {
     final List<String> artifactFiles = artifactFilesByPlatform[platform];
     if (artifactFiles == null) {
-      printError('Unsupported platform: $platform.');
+      globals.printError('Unsupported platform: $platform.');
       return false;
     }
 
     try {
-      fs.directory(targetDirectory).createSync(recursive: true);
+      globals.fs.directory(targetDirectory).createSync(recursive: true);
       for (final String entityName in artifactFiles) {
-        final String sourcePath = fs.path.join(sourceDirectory, entityName);
-        final String targetPath = fs.path.join(targetDirectory, entityName);
+        final String sourcePath = globals.fs.path.join(sourceDirectory, entityName);
+        final String targetPath = globals.fs.path.join(targetDirectory, entityName);
         if (entityName.endsWith('/')) {
           copyDirectorySync(
-            fs.directory(sourcePath),
-            fs.directory(targetPath),
+            globals.fs.directory(sourcePath),
+            globals.fs.directory(targetPath),
           );
         } else {
-          fs.file(sourcePath)
-            .copySync(fs.path.join(targetDirectory, entityName));
+          globals.fs.file(sourcePath)
+            .copySync(globals.fs.path.join(targetDirectory, entityName));
         }
       }
 
-      printTrace('Copied artifacts from $sourceDirectory.');
+      globals.printTrace('Copied artifacts from $sourceDirectory.');
     } catch (e, stackTrace) {
-      printError(e.message as String);
-      printError(stackTrace.toString());
+      globals.printError(e.message as String);
+      globals.printError(stackTrace.toString());
       return false;
     }
     return true;
@@ -211,7 +211,7 @@
   /// Returns a File object for the file containing the last copied hash
   /// in [directory].
   File _lastCopiedHashFile(String directory) {
-    return fs.file(fs.path.join(directory, '.last_artifact_version'));
+    return globals.fs.file(globals.fs.path.join(directory, '.last_artifact_version'));
   }
 
   /// Returns the hash of the artifacts last copied to [directory], or null if
@@ -220,11 +220,11 @@
     // Sanity check that at least one file is present; this won't catch every
     // case, but handles someone deleting all the non-hidden cached files to
     // force fresh copy.
-    final String artifactFilePath = fs.path.join(
+    final String artifactFilePath = globals.fs.path.join(
       directory,
       artifactFilesByPlatform[platform].first,
     );
-    if (!fs.file(artifactFilePath).existsSync()) {
+    if (!globals.fs.file(artifactFilePath).existsSync()) {
       return null;
     }
     final File hashFile = _lastCopiedHashFile(directory);
diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart
index b7a3857..169e276 100644
--- a/packages/flutter_tools/lib/src/commands/update_packages.dart
+++ b/packages/flutter_tools/lib/src/commands/update_packages.dart
@@ -11,10 +11,9 @@
 import '../base/file_system.dart';
 import '../base/logger.dart';
 import '../base/net.dart';
-import '../base/platform.dart';
 import '../cache.dart';
 import '../dart/pub.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 
 /// Map from package name to package version, used to artificially pin a pub
@@ -89,17 +88,17 @@
   final bool hidden;
 
   Future<void> _downloadCoverageData() async {
-    final Status status = logger.startProgress(
+    final Status status = globals.logger.startProgress(
       'Downloading lcov data for package:flutter...',
       timeout: timeoutConfiguration.slowOperation,
     );
-    final String urlBase = platform.environment['FLUTTER_STORAGE_BASE_URL'] ?? 'https://storage.googleapis.com';
+    final String urlBase = globals.platform.environment['FLUTTER_STORAGE_BASE_URL'] ?? 'https://storage.googleapis.com';
     final List<int> data = await fetchUrl(Uri.parse('$urlBase/flutter_infra/flutter/coverage/lcov.info'));
-    final String coverageDir = fs.path.join(Cache.flutterRoot, 'packages/flutter/coverage');
-    fs.file(fs.path.join(coverageDir, 'lcov.base.info'))
+    final String coverageDir = globals.fs.path.join(Cache.flutterRoot, 'packages/flutter/coverage');
+    globals.fs.file(globals.fs.path.join(coverageDir, 'lcov.base.info'))
       ..createSync(recursive: true)
       ..writeAsBytesSync(data, flush: true);
-    fs.file(fs.path.join(coverageDir, 'lcov.info'))
+    globals.fs.file(globals.fs.path.join(coverageDir, 'lcov.info'))
       ..createSync(recursive: true)
       ..writeAsBytesSync(data, flush: true);
     status.stop();
@@ -127,14 +126,14 @@
       // ensure we only get flutter/packages
       packages.retainWhere((Directory directory) {
         return consumerPackages.any((String package) {
-          return directory.path.endsWith('packages${fs.path.separator}$package');
+          return directory.path.endsWith('packages${globals.fs.path.separator}$package');
         });
       });
     }
 
     if (isVerifyOnly) {
       bool needsUpdate = false;
-      printStatus('Verifying pubspecs...');
+      globals.printStatus('Verifying pubspecs...');
       for (Directory directory in packages) {
         PubspecYaml pubspec;
         try {
@@ -142,11 +141,11 @@
         } on String catch (message) {
           throwToolExit(message);
         }
-        printTrace('Reading pubspec.yaml from ${directory.path}');
+        globals.printTrace('Reading pubspec.yaml from ${directory.path}');
         if (pubspec.checksum.value == null) {
           // If the checksum is invalid or missing, we can just ask them run to run
           // upgrade again to compute it.
-          printError(
+          globals.printError(
             'Warning: pubspec in ${directory.path} has out of date dependencies. '
             'Please run "flutter update-packages --force-upgrade" to update them correctly.'
           );
@@ -163,14 +162,14 @@
         if (checksum != pubspec.checksum.value) {
           // If the checksum doesn't match, they may have added or removed some dependencies.
           // we need to run update-packages to recapture the transitive deps.
-          printError(
+          globals.printError(
             'Warning: pubspec in ${directory.path} has invalid dependencies. '
             'Please run "flutter update-packages --force-upgrade" to update them correctly.'
           );
           needsUpdate = true;
         } else {
           // everything is correct in the pubspec.
-          printTrace('pubspec in ${directory.path} is up to date!');
+          globals.printTrace('pubspec in ${directory.path} is up to date!');
         }
       }
       if (needsUpdate) {
@@ -180,12 +179,12 @@
           exitCode: 1,
         );
       }
-      printStatus('All pubspecs were up to date.');
+      globals.printStatus('All pubspecs were up to date.');
       return null;
     }
 
     if (upgrade || isPrintPaths || isPrintTransitiveClosure) {
-      printStatus('Upgrading packages...');
+      globals.printStatus('Upgrading packages...');
       // This feature attempts to collect all the packages used across all the
       // pubspec.yamls in the repo (including via transitive dependencies), and
       // find the latest version of each that can be used while keeping each
@@ -196,7 +195,7 @@
       final Map<String, PubspecDependency> dependencies = <String, PubspecDependency>{};
       final Set<String> specialDependencies = <String>{};
       for (Directory directory in packages) { // these are all the directories with pubspec.yamls we care about
-        printTrace('Reading pubspec.yaml from: ${directory.path}');
+        globals.printTrace('Reading pubspec.yaml from: ${directory.path}');
         PubspecYaml pubspec;
         try {
           pubspec = PubspecYaml(directory); // this parses the pubspec.yaml
@@ -242,7 +241,7 @@
       // pub tool will attempt to bring these dependencies up to the most recent
       // possible versions while honoring all their constraints.
       final PubDependencyTree tree = PubDependencyTree(); // object to collect results
-      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_update_packages.');
+      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_update_packages.');
       try {
         final File fakePackage = _pubspecFor(tempDir);
         fakePackage.createSync();
@@ -288,7 +287,7 @@
 
       if (isPrintTransitiveClosure) {
         tree._dependencyTree.forEach((String from, Set<String> to) {
-          printStatus('$from -> $to');
+          globals.printStatus('$from -> $to');
         });
         return null;
       }
@@ -327,7 +326,7 @@
     await _downloadCoverageData();
 
     final double seconds = timer.elapsedMilliseconds / 1000.0;
-    printStatus('\nRan \'pub\' $count time${count == 1 ? "" : "s"} and fetched coverage data in ${seconds.toStringAsFixed(1)}s.');
+    globals.printStatus('\nRan \'pub\' $count time${count == 1 ? "" : "s"} and fetched coverage data in ${seconds.toStringAsFixed(1)}s.');
 
     return null;
   }
@@ -373,11 +372,11 @@
           buf.write(' <- ');
         }
       }
-      printStatus(buf.toString(), wrap: false);
+      globals.printStatus(buf.toString(), wrap: false);
     }
 
     if (paths.isEmpty) {
-      printStatus('No paths found from $from to $to');
+      globals.printStatus('No paths found from $from to $to');
     }
   }
 }
@@ -1048,8 +1047,8 @@
     }
 
     if (_kind == DependencyKind.path &&
-        !fs.path.isWithin(fs.path.join(Cache.flutterRoot, 'bin'), _lockTarget) &&
-        fs.path.isWithin(Cache.flutterRoot, _lockTarget)) {
+        !globals.fs.path.isWithin(globals.fs.path.join(Cache.flutterRoot, 'bin'), _lockTarget) &&
+        globals.fs.path.isWithin(Cache.flutterRoot, _lockTarget)) {
       return true;
     }
 
@@ -1065,8 +1064,8 @@
     assert(kind == DependencyKind.unknown);
     if (line.startsWith(_pathPrefix)) {
       // We're a path dependency; remember the (absolute) path.
-      _lockTarget = fs.path.canonicalize(
-          fs.path.absolute(fs.path.dirname(pubspecPath), line.substring(_pathPrefix.length, line.length))
+      _lockTarget = globals.fs.path.canonicalize(
+          globals.fs.path.absolute(globals.fs.path.dirname(pubspecPath), line.substring(_pathPrefix.length, line.length))
       );
       _kind = DependencyKind.path;
     } else if (line.startsWith(_sdkPrefix)) {
@@ -1135,7 +1134,7 @@
 
 /// Generates the File object for the pubspec.yaml file of a given Directory.
 File _pubspecFor(Directory directory) {
-  return fs.file(fs.path.join(directory.path, 'pubspec.yaml'));
+  return globals.fs.file(globals.fs.path.join(directory.path, 'pubspec.yaml'));
 }
 
 /// Generates the source of a fake pubspec.yaml file given a list of
@@ -1147,7 +1146,7 @@
   result.writeln('dependencies:');
   overrides.writeln('dependency_overrides:');
   if (_kManuallyPinnedDependencies.isNotEmpty) {
-    printStatus('WARNING: the following packages use hard-coded version constraints:');
+    globals.printStatus('WARNING: the following packages use hard-coded version constraints:');
     final Set<String> allTransitive = <String>{
       for (PubspecDependency dependency in dependencies)
         dependency.name,
@@ -1155,12 +1154,12 @@
     for (String package in _kManuallyPinnedDependencies.keys) {
       // Don't add pinned dependency if it is not in the set of all transitive dependencies.
       if (!allTransitive.contains(package)) {
-        printStatus('Skipping $package because it was not transitive');
+        globals.printStatus('Skipping $package because it was not transitive');
         continue;
       }
       final String version = _kManuallyPinnedDependencies[package];
       result.writeln('  $package: $version');
-      printStatus('  - $package: $version');
+      globals.printStatus('  - $package: $version');
     }
   }
   for (PubspecDependency dependency in dependencies) {
diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart
index 10f236e..03a2b36 100644
--- a/packages/flutter_tools/lib/src/commands/upgrade.dart
+++ b/packages/flutter_tools/lib/src/commands/upgrade.dart
@@ -7,14 +7,12 @@
 import 'package:meta/meta.dart';
 
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../cache.dart';
 import '../dart/pub.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../persistent_tool_state.dart';
 import '../runner/flutter_command.dart';
 import '../version.dart';
@@ -119,8 +117,8 @@
     final bool alreadyUpToDate = await attemptFastForward(flutterVersion);
     if (alreadyUpToDate) {
       // If the upgrade was a no op, then do not continue with the second half.
-      printStatus('Flutter is already up to date on channel ${flutterVersion.channel}');
-      printStatus('$flutterVersion');
+      globals.printStatus('Flutter is already up to date on channel ${flutterVersion.channel}');
+      globals.printStatus('$flutterVersion');
     } else {
       await flutterUpgradeContinue();
     }
@@ -129,14 +127,14 @@
   Future<void> flutterUpgradeContinue() async {
     final int code = await processUtils.stream(
       <String>[
-        fs.path.join('bin', 'flutter'),
+        globals.fs.path.join('bin', 'flutter'),
         'upgrade',
         '--continue',
         '--no-version-check',
       ],
       workingDirectory: Cache.flutterRoot,
       allowReentrantFlutter: true,
-      environment: Map<String, String>.of(platform.environment),
+      environment: Map<String, String>.of(globals.platform.environment),
     );
     if (code != 0) {
       throwToolExit(null, exitCode: code);
@@ -227,7 +225,7 @@
   /// If the user is on a deprecated channel, attempts to migrate them off of
   /// it.
   Future<void> upgradeChannel(FlutterVersion flutterVersion) async {
-    printStatus('Upgrading Flutter from ${Cache.flutterRoot}...');
+    globals.printStatus('Upgrading Flutter from ${Cache.flutterRoot}...');
     await ChannelCommand.upgradeChannel();
   }
 
@@ -255,7 +253,7 @@
       alreadyUpToDate = newFlutterVersion.channel == oldFlutterVersion.channel &&
         newFlutterVersion.frameworkRevision == oldFlutterVersion.frameworkRevision;
     } catch (e) {
-      printTrace('Failed to determine FlutterVersion after upgrade fast-forward: $e');
+      globals.printTrace('Failed to determine FlutterVersion after upgrade fast-forward: $e');
     }
     return alreadyUpToDate;
   }
@@ -266,15 +264,15 @@
   /// shell script re-entrantly here so that it will download the updated
   /// Dart and so forth if necessary.
   Future<void> precacheArtifacts() async {
-    printStatus('');
-    printStatus('Upgrading engine...');
+    globals.printStatus('');
+    globals.printStatus('Upgrading engine...');
     final int code = await processUtils.stream(
       <String>[
-        fs.path.join('bin', 'flutter'), '--no-color', '--no-version-check', 'precache',
+        globals.fs.path.join('bin', 'flutter'), '--no-color', '--no-version-check', 'precache',
       ],
       workingDirectory: Cache.flutterRoot,
       allowReentrantFlutter: true,
-      environment: Map<String, String>.of(platform.environment),
+      environment: Map<String, String>.of(globals.platform.environment),
     );
     if (code != 0) {
       throwToolExit(null, exitCode: code);
@@ -283,22 +281,22 @@
 
   /// Update the user's packages.
   Future<void> updatePackages(FlutterVersion flutterVersion) async {
-    printStatus('');
-    printStatus(flutterVersion.toString());
+    globals.printStatus('');
+    globals.printStatus(flutterVersion.toString());
     final String projectRoot = findProjectRoot();
     if (projectRoot != null) {
-      printStatus('');
+      globals.printStatus('');
       await pub.get(context: PubContext.pubUpgrade, directory: projectRoot, upgrade: true, checkLastModified: false);
     }
   }
 
   /// Run flutter doctor in case requirements have changed.
   Future<void> runDoctor() async {
-    printStatus('');
-    printStatus('Running flutter doctor...');
+    globals.printStatus('');
+    globals.printStatus('Running flutter doctor...');
     await processUtils.stream(
       <String>[
-        fs.path.join('bin', 'flutter'), '--no-version-check', 'doctor',
+        globals.fs.path.join('bin', 'flutter'), '--no-version-check', 'doctor',
       ],
       workingDirectory: Cache.flutterRoot,
       allowReentrantFlutter: true,
diff --git a/packages/flutter_tools/lib/src/commands/version.dart b/packages/flutter_tools/lib/src/commands/version.dart
index e4f758d..dbba34a 100644
--- a/packages/flutter_tools/lib/src/commands/version.dart
+++ b/packages/flutter_tools/lib/src/commands/version.dart
@@ -5,14 +5,13 @@
 import 'dart:async';
 
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/os.dart';
 import '../base/process.dart';
 import '../base/version.dart';
 import '../cache.dart';
 import '../dart/pub.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 import '../version.dart';
 
@@ -57,12 +56,12 @@
   Future<FlutterCommandResult> runCommand() async {
     final List<String> tags = await getTags();
     if (argResults.rest.isEmpty) {
-      tags.forEach(printStatus);
+      tags.forEach(globals.printStatus);
       return const FlutterCommandResult(ExitStatus.success);
     }
     final String version = argResults.rest[0].replaceFirst('v', '');
     if (!tags.contains('v$version')) {
-      printError('There is no version: $version');
+      globals.printError('There is no version: $version');
     }
 
     // check min supported version
@@ -74,7 +73,7 @@
     bool withForce = false;
     if (targetVersion < minSupportedVersion) {
       if (!boolArg('force')) {
-        printError(
+        globals.printError(
           'Version command is not supported in $targetVersion and it is supported since version $minSupportedVersion'
           'which means if you switch to version $minSupportedVersion then you can not use version command.'
           'If you really want to switch to version $targetVersion, please use `--force` flag: `flutter version --force $targetVersion`.'
@@ -96,16 +95,16 @@
 
     final FlutterVersion flutterVersion = FlutterVersion();
 
-    printStatus('Switching Flutter to version ${flutterVersion.frameworkVersion}${withForce ? ' with force' : ''}');
+    globals.printStatus('Switching Flutter to version ${flutterVersion.frameworkVersion}${withForce ? ' with force' : ''}');
 
     // Check for and download any engine and pkg/ updates.
     // We run the 'flutter' shell script re-entrantly here
     // so that it will download the updated Dart and so forth
     // if necessary.
-    printStatus('');
-    printStatus('Downloading engine...');
+    globals.printStatus('');
+    globals.printStatus('Downloading engine...');
     int code = await processUtils.stream(<String>[
-      fs.path.join('bin', 'flutter'),
+      globals.fs.path.join('bin', 'flutter'),
       '--no-color',
       'precache',
     ], workingDirectory: Cache.flutterRoot, allowReentrantFlutter: true);
@@ -114,12 +113,12 @@
       throwToolExit(null, exitCode: code);
     }
 
-    printStatus('');
-    printStatus(flutterVersion.toString());
+    globals.printStatus('');
+    globals.printStatus(flutterVersion.toString());
 
     final String projectRoot = findProjectRoot();
     if (projectRoot != null && shouldRunPub) {
-      printStatus('');
+      globals.printStatus('');
       await pub.get(
         context: PubContext.pubUpgrade,
         directory: projectRoot,
@@ -129,11 +128,11 @@
     }
 
     // Run a doctor check in case system requirements have changed.
-    printStatus('');
-    printStatus('Running flutter doctor...');
+    globals.printStatus('');
+    globals.printStatus('Running flutter doctor...');
     code = await processUtils.stream(
       <String>[
-        fs.path.join('bin', 'flutter'),
+        globals.fs.path.join('bin', 'flutter'),
         'doctor',
       ],
       workingDirectory: Cache.flutterRoot,
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index 3e5cf3c..30a03bb 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -10,16 +10,13 @@
 import 'artifacts.dart';
 import 'base/common.dart';
 import 'base/context.dart';
-import 'base/file_system.dart';
 import 'base/io.dart';
-import 'base/platform.dart';
-import 'base/process_manager.dart';
 import 'base/terminal.dart';
 import 'build_info.dart';
 import 'codegen.dart';
 import 'convert.dart';
 import 'dart/package_map.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'project.dart';
 
 KernelCompilerFactory get kernelCompilerFactory => context.get<KernelCompilerFactory>();
@@ -91,7 +88,7 @@
 
 /// Handles stdin/stdout communication with the frontend server.
 class StdoutHandler {
-  StdoutHandler({this.consumer = printError}) {
+  StdoutHandler({this.consumer = globals.printError}) {
     reset();
   }
 
@@ -179,7 +176,7 @@
           sources.remove(Uri.parse(message.substring(1)));
           break;
         default:
-          printTrace('Unexpected prefix for $message uri - ignoring');
+          globals.printTrace('Unexpected prefix for $message uri - ignoring');
       }
     }
   }
@@ -199,8 +196,8 @@
 /// Converts filesystem paths to package URIs.
 class PackageUriMapper {
   PackageUriMapper(String scriptPath, String packagesPath, String fileSystemScheme, List<String> fileSystemRoots) {
-    final Map<String, Uri> packageMap = PackageMap(fs.path.absolute(packagesPath)).map;
-    final String scriptUri = Uri.file(scriptPath, windows: platform.isWindows).toString();
+    final Map<String, Uri> packageMap = PackageMap(globals.fs.path.absolute(packagesPath)).map;
+    final String scriptUri = Uri.file(scriptPath, windows: globals.platform.isWindows).toString();
     for (String packageName in packageMap.keys) {
       final String prefix = packageMap[packageName].toString();
       // Only perform a multi-root mapping if there are multiple roots.
@@ -210,7 +207,7 @@
         && prefix.contains(fileSystemScheme)) {
         _packageName = packageName;
         _uriPrefixes = fileSystemRoots
-          .map((String name) => Uri.file(name, windows: platform.isWindows).toString())
+          .map((String name) => Uri.file(name, windows:globals.platform.isWindows).toString())
           .toList();
         return;
       }
@@ -229,7 +226,7 @@
     if (_packageName == null) {
       return null;
     }
-    final String scriptUri = Uri.file(scriptPath, windows: platform.isWindows).toString();
+    final String scriptUri = Uri.file(scriptPath, windows: globals.platform.isWindows).toString();
     for (String uriPrefix in _uriPrefixes) {
       if (scriptUri.startsWith(uriPrefix)) {
         return Uri.parse('package:$_packageName/${scriptUri.substring(uriPrefix.length)}');
@@ -290,15 +287,15 @@
     String platformDill,
     @required List<String> dartDefines,
   }) async {
-    final String frontendServer = artifacts.getArtifactPath(
+    final String frontendServer = globals.artifacts.getArtifactPath(
       Artifact.frontendServerSnapshotForEngineDartSdk
     );
     // This is a URI, not a file path, so the forward slash is correct even on Windows.
     if (!sdkRoot.endsWith('/')) {
       sdkRoot = '$sdkRoot/';
     }
-    final String engineDartPath = artifacts.getArtifactPath(Artifact.engineDartBinary);
-    if (!processManager.canRun(engineDartPath)) {
+    final String engineDartPath = globals.artifacts.getArtifactPath(Artifact.engineDartBinary);
+    if (!globals.processManager.canRun(engineDartPath)) {
       throwToolExit('Unable to find Dart binary at $engineDartPath');
     }
     Uri mainUri;
@@ -307,8 +304,8 @@
     }
     // TODO(jonahwilliams): The output file must already exist, but this seems
     // unnecessary.
-    if (outputFilePath != null && !fs.isFileSync(outputFilePath)) {
-      fs.file(outputFilePath).createSync(recursive: true);
+    if (outputFilePath != null && !globals.fs.isFileSync(outputFilePath)) {
+      globals.fs.file(outputFilePath).createSync(recursive: true);
     }
     final List<String> command = <String>[
       engineDartPath,
@@ -359,18 +356,18 @@
       mainUri?.toString() ?? mainPath,
     ];
 
-    printTrace(command.join(' '));
-    final Process server = await processManager
+    globals.printTrace(command.join(' '));
+    final Process server = await globals.processManager
       .start(command)
       .catchError((dynamic error, StackTrace stack) {
-        printError('Failed to start frontend server $error, $stack');
+        globals.printError('Failed to start frontend server $error, $stack');
       });
 
     final StdoutHandler _stdoutHandler = StdoutHandler();
 
     server.stderr
       .transform<String>(utf8.decoder)
-      .listen(printError);
+      .listen(globals.printError);
     server.stdout
       .transform<String>(utf8.decoder)
       .transform<String>(const LineSplitter())
@@ -520,7 +517,7 @@
     this.packagesPath,
     this.fileSystemRoots,
     this.fileSystemScheme,
-    CompilerMessageConsumer compilerMessageConsumer = printError,
+    CompilerMessageConsumer compilerMessageConsumer = globals.printError,
     this.initializeFromDill,
     this.targetModel = TargetModel.flutter,
     this.unsafePackageSerialization,
@@ -610,13 +607,13 @@
         ? _mapFilename(request.mainPath, packageUriMapper) + ' '
         : '';
     _server.stdin.writeln('recompile $mainUri$inputKey');
-    printTrace('<- recompile $mainUri$inputKey');
+    globals.printTrace('<- recompile $mainUri$inputKey');
     for (Uri fileUri in request.invalidatedFiles) {
       _server.stdin.writeln(_mapFileUri(fileUri.toString(), packageUriMapper));
-      printTrace('${_mapFileUri(fileUri.toString(), packageUriMapper)}');
+      globals.printTrace('${_mapFileUri(fileUri.toString(), packageUriMapper)}');
     }
     _server.stdin.writeln(inputKey);
-    printTrace('<- $inputKey');
+    globals.printTrace('<- $inputKey');
 
     return _stdoutHandler.compilerOutput.future;
   }
@@ -643,11 +640,11 @@
     String outputPath,
     String packagesFilePath,
   ) async {
-    final String frontendServer = artifacts.getArtifactPath(
+    final String frontendServer = globals.artifacts.getArtifactPath(
       Artifact.frontendServerSnapshotForEngineDartSdk
     );
     final List<String> command = <String>[
-      artifacts.getArtifactPath(Artifact.engineDartBinary),
+      globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
       frontendServer,
       '--sdk-root',
       sdkRoot,
@@ -690,8 +687,8 @@
       if ((experimentalFlags != null) && experimentalFlags.isNotEmpty)
         '--enable-experiment=${experimentalFlags.join(',')}',
     ];
-    printTrace(command.join(' '));
-    _server = await processManager.start(command);
+    globals.printTrace(command.join(' '));
+    _server = await globals.processManager.start(command);
     _server.stdout
       .transform<String>(utf8.decoder)
       .transform<String>(const LineSplitter())
@@ -709,7 +706,7 @@
     _server.stderr
       .transform<String>(utf8.decoder)
       .transform<String>(const LineSplitter())
-      .listen((String message) { printError(message); });
+      .listen((String message) { globals.printError(message); });
 
     unawaited(_server.exitCode.then((int code) {
       if (code != 0) {
@@ -718,7 +715,7 @@
     }));
 
     _server.stdin.writeln('compile $scriptUri');
-    printTrace('<- compile $scriptUri');
+    globals.printTrace('<- compile $scriptUri');
 
     return _stdoutHandler.compilerOutput.future;
   }
@@ -771,7 +768,7 @@
   void accept() {
     if (_compileRequestNeedsConfirmation) {
       _server.stdin.writeln('accept');
-      printTrace('<- accept');
+      globals.printTrace('<- accept');
     }
     _compileRequestNeedsConfirmation = false;
   }
@@ -793,7 +790,7 @@
     }
     _stdoutHandler.reset(expectSources: false);
     _server.stdin.writeln('reject');
-    printTrace('<- reject');
+    globals.printTrace('<- reject');
     _compileRequestNeedsConfirmation = false;
     return _stdoutHandler.compilerOutput.future;
   }
@@ -801,7 +798,7 @@
   @override
   void reset() {
     _server?.stdin?.writeln('reset');
-    printTrace('<- reset');
+    globals.printTrace('<- reset');
   }
 
   String _mapFilename(String filename, PackageUriMapper packageUriMapper) {
@@ -835,8 +832,8 @@
         }
       }
     }
-    if (platform.isWindows && fileSystemRoots != null && fileSystemRoots.length > 1) {
-      return Uri.file(filename, windows: platform.isWindows).toString();
+    if (globals.platform.isWindows && fileSystemRoots != null && fileSystemRoots.length > 1) {
+      return Uri.file(filename, windows: globals.platform.isWindows).toString();
     }
     return null;
   }
@@ -847,7 +844,7 @@
     if (_server == null) {
       return 0;
     }
-    printTrace('killing pid ${_server.pid}');
+    globals.printTrace('killing pid ${_server.pid}');
     _server.kill();
     return _server.exitCode;
   }
diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart
index 6fdaf3a..e90cc72 100644
--- a/packages/flutter_tools/lib/src/context_runner.dart
+++ b/packages/flutter_tools/lib/src/context_runner.dart
@@ -17,7 +17,6 @@
 import 'base/io.dart';
 import 'base/logger.dart';
 import 'base/os.dart';
-import 'base/platform.dart';
 import 'base/process.dart';
 import 'base/signals.dart';
 import 'base/time.dart';
@@ -35,6 +34,7 @@
 import 'fuchsia/fuchsia_device.dart' show FuchsiaDeviceTools;
 import 'fuchsia/fuchsia_sdk.dart' show FuchsiaSdk, FuchsiaArtifacts;
 import 'fuchsia/fuchsia_workflow.dart' show FuchsiaWorkflow;
+import 'globals.dart' as globals;
 import 'ios/devices.dart' show IOSDeploy;
 import 'ios/ios_workflow.dart';
 import 'ios/mac.dart';
@@ -101,7 +101,7 @@
       IOSWorkflow: () => const IOSWorkflow(),
       KernelCompilerFactory: () => const KernelCompilerFactory(),
       LinuxWorkflow: () => const LinuxWorkflow(),
-      Logger: () => platform.isWindows ? WindowsStdoutLogger() : StdoutLogger(),
+      Logger: () => globals.platform.isWindows ? WindowsStdoutLogger() : StdoutLogger(),
       MacOSWorkflow: () => const MacOSWorkflow(),
       MDnsObservatoryDiscovery: () => MDnsObservatoryDiscovery(),
       OperatingSystemUtils: () => OperatingSystemUtils(),
diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart
index 50ffbdc..85b77fe 100644
--- a/packages/flutter_tools/lib/src/dart/analysis.dart
+++ b/packages/flutter_tools/lib/src/dart/analysis.dart
@@ -6,15 +6,11 @@
 import 'dart:math' as math;
 
 import '../base/common.dart';
-import '../base/file_system.dart' hide IOSink;
-import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
 import '../base/terminal.dart';
 import '../base/utils.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 class AnalysisServer {
   AnalysisServer(this.sdkPath, this.directories);
@@ -33,9 +29,9 @@
 
   Future<void> start() async {
     final String snapshot =
-        fs.path.join(sdkPath, 'bin/snapshots/analysis_server.dart.snapshot');
+        globals.fs.path.join(sdkPath, 'bin/snapshots/analysis_server.dart.snapshot');
     final List<String> command = <String>[
-      fs.path.join(sdkPath, 'bin', 'dart'),
+      globals.fs.path.join(sdkPath, 'bin', 'dart'),
       snapshot,
       '--disable-server-feature-completion',
       '--disable-server-feature-search',
@@ -43,14 +39,14 @@
       sdkPath,
     ];
 
-    printTrace('dart ${command.skip(1).join(' ')}');
-    _process = await processManager.start(command);
+    globals.printTrace('dart ${command.skip(1).join(' ')}');
+    _process = await globals.processManager.start(command);
     // This callback hookup can't throw.
     unawaited(_process.exitCode.whenComplete(() => _process = null));
 
     final Stream<String> errorStream =
         _process.stderr.transform<String>(utf8.decoder).transform<String>(const LineSplitter());
-    errorStream.listen(printError);
+    errorStream.listen(globals.printError);
 
     final Stream<String> inStream =
         _process.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter());
@@ -77,11 +73,11 @@
       'params': params,
     });
     _process.stdin.writeln(message);
-    printTrace('==> $message');
+    globals.printTrace('==> $message');
   }
 
   void _handleServerResponse(String line) {
-    printTrace('<== $line');
+    globals.printTrace('<== $line');
 
     final dynamic response = json.decode(line);
 
@@ -102,10 +98,10 @@
       } else if (response['error'] != null) {
         // Fields are 'code', 'message', and 'stackTrace'.
         final Map<String, dynamic> error = castStringKeyedMap(response['error']);
-        printError(
+        globals.printError(
             'Error response from the server: ${error['code']} ${error['message']}');
         if (error['stackTrace'] != null) {
-          printError(error['stackTrace'] as String);
+          globals.printError(error['stackTrace'] as String);
         }
       }
     }
@@ -121,9 +117,9 @@
 
   void _handleServerError(Map<String, dynamic> error) {
     // Fields are 'isFatal', 'message', and 'stackTrace'.
-    printError('Error from the analysis server: ${error['message']}');
+    globals.printError('Error from the analysis server: ${error['message']}');
     if (error['stackTrace'] != null) {
-      printError(error['stackTrace'] as String);
+      globals.printError(error['stackTrace'] as String);
     }
     _didServerErrorOccur = true;
   }
@@ -164,7 +160,7 @@
     'ERROR': _AnalysisSeverity.error,
   };
 
-  static final String _separator = platform.isWindows ? '-' : '•';
+  static final String _separator = globals.platform.isWindows ? '-' : '•';
 
   // "severity":"INFO","type":"TODO","location":{
   //   "file":"/Users/.../lib/test.dart","offset":362,"length":72,"startLine":15,"startColumn":4
@@ -175,9 +171,9 @@
   String get colorSeverity {
     switch(_severityLevel) {
       case _AnalysisSeverity.error:
-        return terminal.color(severity, TerminalColor.red);
+        return globals.terminal.color(severity, TerminalColor.red);
       case _AnalysisSeverity.warning:
-        return terminal.color(severity, TerminalColor.yellow);
+        return globals.terminal.color(severity, TerminalColor.yellow);
       case _AnalysisSeverity.info:
       case _AnalysisSeverity.none:
         return severity;
@@ -228,7 +224,7 @@
     final String padding = ' ' * math.max(0, 7 - severity.length);
     return '$padding${colorSeverity.toLowerCase()} $_separator '
         '$messageSentenceFragment $_separator '
-        '${fs.path.relative(file)}:$startLine:$startColumn $_separator '
+        '${globals.fs.path.relative(file)}:$startLine:$startColumn $_separator '
         '$code';
   }
 
diff --git a/packages/flutter_tools/lib/src/dart/package_map.dart b/packages/flutter_tools/lib/src/dart/package_map.dart
index f7453c5..ef6b6df 100644
--- a/packages/flutter_tools/lib/src/dart/package_map.dart
+++ b/packages/flutter_tools/lib/src/dart/package_map.dart
@@ -4,15 +4,14 @@
 
 import 'package:package_config/packages_file.dart' as packages_file;
 
-import '../base/file_system.dart';
-import '../base/platform.dart';
+import '../globals.dart' as globals;
 
 const String kPackagesFileName = '.packages';
 
 Map<String, Uri> _parse(String packagesPath) {
-  final List<int> source = fs.file(packagesPath).readAsBytesSync();
+  final List<int> source = globals.fs.file(packagesPath).readAsBytesSync();
   return packages_file.parse(source,
-      Uri.file(packagesPath, windows: platform.isWindows));
+      Uri.file(packagesPath, windows: globals.platform.isWindows));
 }
 
 class PackageMap {
@@ -20,7 +19,7 @@
 
   static String get globalPackagesPath => _globalPackagesPath ?? kPackagesFileName;
 
-  static String get globalGeneratedPackagesPath => fs.path.setExtension(globalPackagesPath, '.generated');
+  static String get globalGeneratedPackagesPath => globals.fs.path.setExtension(globalPackagesPath, '.generated');
 
   static set globalPackagesPath(String value) {
     _globalPackagesPath = value;
@@ -55,17 +54,17 @@
     if (packageBase == null) {
       return null;
     }
-    final String packageRelativePath = fs.path.joinAll(pathSegments);
-    return packageBase.resolveUri(fs.path.toUri(packageRelativePath));
+    final String packageRelativePath = globals.fs.path.joinAll(pathSegments);
+    return packageBase.resolveUri(globals.fs.path.toUri(packageRelativePath));
   }
 
   String checkValid() {
-    if (fs.isFileSync(packagesPath)) {
+    if (globals.fs.isFileSync(packagesPath)) {
       return null;
     }
     String message = '$packagesPath does not exist.';
-    final String pubspecPath = fs.path.absolute(fs.path.dirname(packagesPath), 'pubspec.yaml');
-    if (fs.isFileSync(pubspecPath)) {
+    final String pubspecPath = globals.fs.path.absolute(globals.fs.path.dirname(packagesPath), 'pubspec.yaml');
+    if (globals.fs.isFileSync(pubspecPath)) {
       message += '\nDid you run "flutter pub get" in this directory?';
     } else {
       message += '\nDid you run this command from the same directory as your pubspec.yaml file?';
diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart
index 81dc46e..375fdd3 100644
--- a/packages/flutter_tools/lib/src/dart/pub.dart
+++ b/packages/flutter_tools/lib/src/dart/pub.dart
@@ -11,11 +11,10 @@
 import '../base/file_system.dart';
 import '../base/io.dart' as io;
 import '../base/logger.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../base/utils.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../reporting/reporting.dart';
 import '../runner/flutter_command.dart';
 import 'sdk.dart';
@@ -73,7 +72,7 @@
   if (pubSpecYaml.lastModifiedSync().isAfter(dotPackagesLastModified)) {
     return true;
   }
-  final File flutterToolsStamp = Cache.instance.getStampFileFor('flutter_tools');
+  final File flutterToolsStamp = globals.cache.getStampFileFor('flutter_tools');
   if (flutterToolsStamp.existsSync() &&
       flutterToolsStamp.lastModifiedSync().isAfter(dotPackagesLastModified)) {
     return true;
@@ -146,10 +145,10 @@
     bool checkLastModified = true,
     bool skipPubspecYamlCheck = false,
   }) async {
-    directory ??= fs.currentDirectory.path;
+    directory ??= globals.fs.currentDirectory.path;
 
-    final File pubSpecYaml = fs.file(fs.path.join(directory, 'pubspec.yaml'));
-    final File dotPackages = fs.file(fs.path.join(directory, '.packages'));
+    final File pubSpecYaml = globals.fs.file(globals.fs.path.join(directory, 'pubspec.yaml'));
+    final File dotPackages = globals.fs.file(globals.fs.path.join(directory, '.packages'));
 
     if (!skipPubspecYamlCheck && !pubSpecYaml.existsSync()) {
       if (!skipIfAbsent) {
@@ -162,8 +161,8 @@
 
     if (!checkLastModified || _shouldRunPubGet(pubSpecYaml: pubSpecYaml, dotPackages: dotPackages)) {
       final String command = upgrade ? 'upgrade' : 'get';
-      final Status status = logger.startProgress(
-        'Running "flutter pub $command" in ${fs.path.basename(directory)}...',
+      final Status status = globals.logger.startProgress(
+        'Running "flutter pub $command" in ${globals.fs.path.basename(directory)}...',
         timeout: timeoutConfiguration.slowOperation,
       );
       final bool verbose = FlutterCommand.current != null && FlutterCommand.current.globalResults['verbose'] as bool;
@@ -200,8 +199,8 @@
     // file to be more recently modified.
     final DateTime now = DateTime.now();
     if (now.isBefore(originalPubspecYamlModificationTime)) {
-      printError(
-        'Warning: File "${fs.path.absolute(pubSpecYaml.path)}" was created in the future. '
+      globals.printError(
+        'Warning: File "${globals.fs.path.absolute(pubSpecYaml.path)}" was created in the future. '
         'Optimizations that rely on comparing time stamps will be unreliable. Check your '
         'system clock for accuracy.\n'
         'The timestamp was: $originalPubspecYamlModificationTime\n'
@@ -211,12 +210,12 @@
       dotPackages.setLastModifiedSync(now);
       final DateTime newDotPackagesTimestamp = dotPackages.lastModifiedSync();
       if (newDotPackagesTimestamp.isBefore(originalPubspecYamlModificationTime)) {
-        printError(
-          'Warning: Failed to set timestamp of "${fs.path.absolute(dotPackages.path)}". '
+        globals.printError(
+          'Warning: Failed to set timestamp of "${globals.fs.path.absolute(dotPackages.path)}". '
           'Tried to set timestamp to $now, but new timestamp is $newDotPackagesTimestamp.'
         );
         if (newDotPackagesTimestamp.isAfter(now)) {
-          printError('Maybe the file was concurrently modified?');
+          globals.printError('Maybe the file was concurrently modified?');
         }
       }
     }
@@ -272,7 +271,7 @@
       }
       assert(message != null);
       versionSolvingFailed = false;
-      printStatus('$failureMessage ($message) -- attempting retry $attempts in $duration second${ duration == 1 ? "" : "s"}...');
+      globals.printStatus('$failureMessage ($message) -- attempting retry $attempts in $duration second${ duration == 1 ? "" : "s"}...');
       await Future<void>.delayed(Duration(seconds: duration));
       if (duration < 64) {
         duration *= 2;
@@ -366,7 +365,7 @@
 String _getPubEnvironmentValue(PubContext pubContext) {
   // DO NOT update this function without contacting kevmoo.
   // We have server-side tooling that assumes the values are consistent.
-  final String existing = platform.environment[_pubEnvironmentKey];
+  final String existing = globals.platform.environment[_pubEnvironmentKey];
   final List<String> values = <String>[
     if (existing != null && existing.isNotEmpty) existing,
     if (isRunningOnBot) 'flutter_bot',
@@ -377,13 +376,13 @@
 }
 
 String _getRootPubCacheIfAvailable() {
-  if (platform.environment.containsKey(_pubCacheEnvironmentKey)) {
-    return platform.environment[_pubCacheEnvironmentKey];
+  if (globals.platform.environment.containsKey(_pubCacheEnvironmentKey)) {
+    return globals.platform.environment[_pubCacheEnvironmentKey];
   }
 
-  final String cachePath = fs.path.join(Cache.flutterRoot, '.pub-cache');
-  if (fs.directory(cachePath).existsSync()) {
-    printTrace('Using $cachePath for the pub cache.');
+  final String cachePath = globals.fs.path.join(Cache.flutterRoot, '.pub-cache');
+  if (globals.fs.directory(cachePath).existsSync()) {
+    globals.printTrace('Using $cachePath for the pub cache.');
     return cachePath;
   }
 
diff --git a/packages/flutter_tools/lib/src/dart/sdk.dart b/packages/flutter_tools/lib/src/dart/sdk.dart
index 995a0a3..446766f 100644
--- a/packages/flutter_tools/lib/src/dart/sdk.dart
+++ b/packages/flutter_tools/lib/src/dart/sdk.dart
@@ -2,13 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '../base/file_system.dart';
-import '../base/platform.dart';
 import '../cache.dart';
+import '../globals.dart' as globals;
 
 /// Locate the Dart SDK.
 String get dartSdkPath {
-  return fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'dart-sdk');
+  return globals.fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'dart-sdk');
 }
 
 /// The required Dart language flags
@@ -18,5 +17,6 @@
 /// ==> `pub.bat`. The default SDK location can be overridden with a specified
 /// [sdkLocation].
 String sdkBinaryName(String name, { String sdkLocation }) {
-  return fs.path.absolute(fs.path.join(sdkLocation ?? dartSdkPath, 'bin', platform.isWindows ? '$name.bat' : name));
+  return globals.fs.path.absolute(
+    globals.fs.path.join(sdkLocation ?? dartSdkPath, 'bin', globals.platform.isWindows ? '$name.bat' : name));
 }
diff --git a/packages/flutter_tools/lib/src/desktop_device.dart b/packages/flutter_tools/lib/src/desktop_device.dart
index 944f3db..0922824 100644
--- a/packages/flutter_tools/lib/src/desktop_device.dart
+++ b/packages/flutter_tools/lib/src/desktop_device.dart
@@ -10,12 +10,11 @@
 import 'base/common.dart';
 import 'base/io.dart';
 import 'base/os.dart';
-import 'base/process_manager.dart';
 import 'build_info.dart';
 import 'cache.dart';
 import 'convert.dart';
 import 'device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'protocol_discovery.dart';
 
 /// A partial implementation of Device for desktop-class devices to inherit
@@ -95,11 +94,11 @@
     final BuildMode buildMode = debuggingOptions?.buildInfo?.mode;
     final String executable = executablePathForDevice(package, buildMode);
     if (executable == null) {
-      printError('Unable to find executable to run');
+      globals.printError('Unable to find executable to run');
       return LaunchResult.failed();
     }
 
-    final Process process = await processManager.start(<String>[
+    final Process process = await globals.processManager.start(<String>[
       executable,
     ]);
     _runningProcesses.add(process);
@@ -119,7 +118,7 @@
       onAttached(package, buildMode, process);
       return LaunchResult.succeeded(observatoryUri: observatoryUri);
     } catch (error) {
-      printError('Error waiting for a debug connection: $error');
+      globals.printError('Error waiting for a debug connection: $error');
       return LaunchResult.failed();
     } finally {
       await observatoryDiscovery.cancel();
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index 1e329e8..3400c82 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -17,7 +17,7 @@
 import 'compile.dart';
 import 'convert.dart' show base64, utf8;
 import 'dart/package_map.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'vmservice.dart';
 
 class DevFSConfig {
@@ -68,7 +68,7 @@
     }
     if (file is Link) {
       // The link target.
-      return fs.file(file.resolveSymbolicLinksSync());
+      return globals.fs.file(file.resolveSymbolicLinksSync());
     }
     return file as File;
   }
@@ -89,7 +89,7 @@
     if (_fileStat != null && _fileStat.type == FileSystemEntityType.link) {
       // Resolve, stat, and maybe cache the symlink target.
       final String resolved = file.resolveSymbolicLinksSync();
-      final File linkTarget = fs.file(resolved);
+      final File linkTarget = globals.fs.file(resolved);
       // Stat the link target.
       final FileStat fileStat = linkTarget.statSync();
       if (fileStat.type == FileSystemEntityType.notFound) {
@@ -100,7 +100,7 @@
       }
     }
     if (_fileStat == null) {
-      printError('Unable to get status of file "${file.path}": file not found.');
+      globals.printError('Unable to get status of file "${file.path}": file not found.');
     }
   }
 
@@ -252,7 +252,7 @@
         },
       );
     } catch (error) {
-      printTrace('DevFS: Failed to write $deviceUri: $error');
+      globals.printTrace('DevFS: Failed to write $deviceUri: $error');
     }
   }
 }
@@ -316,15 +316,15 @@
         await request.addStream(contents);
         final HttpClientResponse response = await request.close();
         response.listen((_) => null,
-            onError: (dynamic error) { printTrace('error: $error'); },
+            onError: (dynamic error) { globals.printTrace('error: $error'); },
             cancelOnError: true);
         break;
       } catch (error, trace) {
         if (!_completer.isCompleted) {
-          printTrace('Error writing "$deviceUri" to DevFS: $error');
+          globals.printTrace('Error writing "$deviceUri" to DevFS: $error');
           if (retry > 0) {
             retry--;
-            printTrace('trying again in a few - $retry more attempts left');
+            globals.printTrace('trying again in a few - $retry more attempts left');
             await Future<void>.delayed(const Duration(milliseconds: 500));
             continue;
           }
@@ -382,7 +382,7 @@
     String packagesFilePath,
   }) : _operations = ServiceProtocolDevFSOperations(serviceProtocol),
        _httpWriter = _DevFSHttpWriter(fsName, serviceProtocol),
-       _packagesFilePath = packagesFilePath ?? fs.path.join(rootDirectory.path, kPackagesFileName);
+       _packagesFilePath = packagesFilePath ?? globals.fs.path.join(rootDirectory.path, kPackagesFileName);
 
   DevFS.operations(
     this._operations,
@@ -390,7 +390,7 @@
     this.rootDirectory, {
     String packagesFilePath,
   }) : _httpWriter = null,
-       _packagesFilePath = packagesFilePath ?? fs.path.join(rootDirectory.path, kPackagesFileName);
+       _packagesFilePath = packagesFilePath ?? globals.fs.path.join(rootDirectory.path, kPackagesFileName);
 
   final DevFSOperations _operations;
   final _DevFSHttpWriter _httpWriter;
@@ -415,7 +415,7 @@
   }
 
   Future<Uri> create() async {
-    printTrace('DevFS: Creating new filesystem on the device ($_baseUri)');
+    globals.printTrace('DevFS: Creating new filesystem on the device ($_baseUri)');
     try {
       _baseUri = await _operations.create(fsName);
     } on rpc.RpcException catch (rpcException) {
@@ -423,18 +423,18 @@
       if (rpcException.code != 1001) {
         rethrow;
       }
-      printTrace('DevFS: Creating failed. Destroying and trying again');
+      globals.printTrace('DevFS: Creating failed. Destroying and trying again');
       await destroy();
       _baseUri = await _operations.create(fsName);
     }
-    printTrace('DevFS: Created new filesystem on the device ($_baseUri)');
+    globals.printTrace('DevFS: Created new filesystem on the device ($_baseUri)');
     return _baseUri;
   }
 
   Future<void> destroy() async {
-    printTrace('DevFS: Deleting filesystem on the device ($_baseUri)');
+    globals.printTrace('DevFS: Deleting filesystem on the device ($_baseUri)');
     await _operations.destroy(fsName);
-    printTrace('DevFS: Deleted filesystem on the device ($_baseUri)');
+    globals.printTrace('DevFS: Deleted filesystem on the device ($_baseUri)');
   }
 
   /// Updates files on the device.
@@ -465,12 +465,12 @@
 
     int syncedBytes = 0;
     if (bundle != null && !skipAssets) {
-      printTrace('Scanning asset files');
+      globals.printTrace('Scanning asset files');
       // We write the assets into the AssetBundle working dir so that they
       // are in the same location in DevFS and the iOS simulator.
       final String assetDirectory = getAssetBuildDirectory();
       bundle.entries.forEach((String archivePath, DevFSContent content) {
-        final Uri deviceUri = fs.path.toUri(fs.path.join(assetDirectory, archivePath));
+        final Uri deviceUri = globals.fs.path.toUri(globals.fs.path.join(assetDirectory, archivePath));
         if (deviceUri.path.startsWith(assetBuildDirPrefix)) {
           archivePath = deviceUri.path.substring(assetBuildDirPrefix.length);
         }
@@ -488,7 +488,7 @@
     if (fullRestart) {
       generator.reset();
     }
-    printTrace('Compiling dart to kernel with ${invalidatedFiles.length} updated files');
+    globals.printTrace('Compiling dart to kernel with ${invalidatedFiles.length} updated files');
     final CompilerOutput compilerOutput = await generator.recompile(
       mainPath,
       invalidatedFiles,
@@ -508,32 +508,32 @@
     if (!bundleFirstUpload) {
       final String compiledBinary = compilerOutput?.outputFilename;
       if (compiledBinary != null && compiledBinary.isNotEmpty) {
-        final Uri entryUri = fs.path.toUri(projectRootPath != null
-          ? fs.path.relative(pathToReload, from: projectRootPath)
+        final Uri entryUri = globals.fs.path.toUri(projectRootPath != null
+          ? globals.fs.path.relative(pathToReload, from: projectRootPath)
           : pathToReload,
         );
-        final DevFSFileContent content = DevFSFileContent(fs.file(compiledBinary));
+        final DevFSFileContent content = DevFSFileContent(globals.fs.file(compiledBinary));
         syncedBytes += content.size;
         dirtyEntries[entryUri] = content;
       }
     }
-    printTrace('Updating files');
+    globals.printTrace('Updating files');
     if (dirtyEntries.isNotEmpty) {
       try {
         await _httpWriter.write(dirtyEntries);
       } on SocketException catch (socketException, stackTrace) {
-        printTrace('DevFS sync failed. Lost connection to device: $socketException');
+        globals.printTrace('DevFS sync failed. Lost connection to device: $socketException');
         throw DevFSException('Lost connection to device.', socketException, stackTrace);
       } catch (exception, stackTrace) {
-        printError('Could not update files on device: $exception');
+        globals.printError('Could not update files on device: $exception');
         throw DevFSException('Sync failed', exception, stackTrace);
       }
     }
-    printTrace('DevFS: Sync finished');
+    globals.printTrace('DevFS: Sync finished');
     return UpdateFSReport(success: true, syncedBytes: syncedBytes,
          invalidatedSourcesCount: invalidatedFiles.length);
   }
 }
 
 /// Converts a platform-specific file path to a platform-independent URL path.
-String _asUriPath(String filePath) => fs.path.toUri(filePath).path + '/';
+String _asUriPath(String filePath) => globals.fs.path.toUri(filePath).path + '/';
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 452d471..d7ac151 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -16,7 +16,7 @@
 import 'base/utils.dart';
 import 'build_info.dart';
 import 'fuchsia/fuchsia_device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'ios/devices.dart';
 import 'ios/simulators.dart';
 import 'linux/linux_device.dart';
@@ -269,7 +269,7 @@
         final List<Device> devices = await pollingGetDevices().timeout(_pollingTimeout);
         _items.updateWithNewList(devices);
       } on TimeoutException {
-        printTrace('Device poll timed out. Will retry.');
+        globals.printTrace('Device poll timed out. Will retry.');
       }
       _timer = _initTimer();
     });
@@ -489,7 +489,7 @@
   }
 
   static Future<void> printDevices(List<Device> devices) async {
-    await descriptions(devices).forEach(printStatus);
+    await descriptions(devices).forEach(globals.printStatus);
   }
 
   /// Clean up resources allocated by device
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index e7ecb7c..ccaf690 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -13,7 +13,6 @@
 import 'base/file_system.dart';
 import 'base/logger.dart';
 import 'base/os.dart';
-import 'base/platform.dart';
 import 'base/process.dart';
 import 'base/terminal.dart';
 import 'base/user_messages.dart';
@@ -22,7 +21,7 @@
 import 'cache.dart';
 import 'device.dart';
 import 'fuchsia/fuchsia_workflow.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'intellij/intellij.dart';
 import 'ios/ios_workflow.dart';
 import 'ios/plist_parser.dart';
@@ -170,7 +169,7 @@
 
   /// Print a summary of the state of the tooling, as well as how to get more info.
   Future<void> summary() async {
-    printStatus(await _summaryText());
+    globals.printStatus(await _summaryText());
   }
 
   Future<String> _summaryText() async {
@@ -234,7 +233,7 @@
   }
 
   Future<bool> checkRemoteArtifacts(String engineRevision) async {
-    return Cache.instance.areRemoteArtifactsAvailable(engineVersion: engineRevision);
+    return globals.cache.areRemoteArtifactsAvailable(engineVersion: engineRevision);
   }
 
   /// Print information about the state of installed tooling.
@@ -244,7 +243,7 @@
     }
 
     if (!verbose) {
-      printStatus('Doctor summary (to see all details, run flutter doctor -v):');
+      globals.printStatus('Doctor summary (to see all details, run flutter doctor -v):');
     }
     bool doctorResult = true;
     int issues = 0;
@@ -285,10 +284,10 @@
 
       final String leadingBox = showColor ? result.coloredLeadingBox : result.leadingBox;
       if (result.statusInfo != null) {
-        printStatus('$leadingBox ${validator.title} (${result.statusInfo})',
+        globals.printStatus('$leadingBox ${validator.title} (${result.statusInfo})',
             hangingIndent: result.leadingBox.length + 1);
       } else {
-        printStatus('$leadingBox ${validator.title}',
+        globals.printStatus('$leadingBox ${validator.title}',
             hangingIndent: result.leadingBox.length + 1);
       }
 
@@ -298,7 +297,7 @@
           int indent = 4;
           final String indicator = showColor ? message.coloredIndicator : message.indicator;
           for (String line in '$indicator ${message.message}'.split('\n')) {
-            printStatus(line, hangingIndent: hangingIndent, indent: indent, emphasis: true);
+            globals.printStatus(line, hangingIndent: hangingIndent, indent: indent, emphasis: true);
             // Only do hanging indent for the first line.
             hangingIndent = 0;
             indent = 6;
@@ -306,19 +305,21 @@
         }
       }
       if (verbose) {
-        printStatus('');
+        globals.printStatus('');
       }
     }
 
     // Make sure there's always one line before the summary even when not verbose.
     if (!verbose) {
-      printStatus('');
+      globals.printStatus('');
     }
 
     if (issues > 0) {
-      printStatus('${showColor ? terminal.color('!', TerminalColor.yellow) : '!'} Doctor found issues in $issues categor${issues > 1 ? "ies" : "y"}.', hangingIndent: 2);
+      globals.printStatus('${showColor ? globals.terminal.color('!', TerminalColor.yellow) : '!'}'
+        ' Doctor found issues in $issues categor${issues > 1 ? "ies" : "y"}.', hangingIndent: 2);
     } else {
-      printStatus('${showColor ? terminal.color('•', TerminalColor.green) : '•'} No issues found!', hangingIndent: 2);
+      globals.printStatus('${showColor ? globals.terminal.color('•', TerminalColor.green) : '•'}'
+        ' No issues found!', hangingIndent: 2);
     }
 
     return doctorResult;
@@ -500,14 +501,14 @@
     assert(type != null);
     switch (type) {
       case ValidationType.crash:
-        return terminal.color(leadingBox, TerminalColor.red);
+        return globals.terminal.color(leadingBox, TerminalColor.red);
       case ValidationType.missing:
-        return terminal.color(leadingBox, TerminalColor.red);
+        return globals.terminal.color(leadingBox, TerminalColor.red);
       case ValidationType.installed:
-        return terminal.color(leadingBox, TerminalColor.green);
+        return globals.terminal.color(leadingBox, TerminalColor.green);
       case ValidationType.notAvailable:
       case ValidationType.partial:
-        return terminal.color(leadingBox, TerminalColor.yellow);
+        return globals.terminal.color(leadingBox, TerminalColor.yellow);
     }
     return null;
   }
@@ -556,11 +557,11 @@
   String get coloredIndicator {
     switch (type) {
       case ValidationMessageType.error:
-        return terminal.color(indicator, TerminalColor.red);
+        return globals.terminal.color(indicator, TerminalColor.red);
       case ValidationMessageType.hint:
-        return terminal.color(indicator, TerminalColor.yellow);
+        return globals.terminal.color(indicator, TerminalColor.yellow);
       case ValidationMessageType.information:
-        return terminal.color(indicator, TerminalColor.green);
+        return globals.terminal.color(indicator, TerminalColor.green);
     }
     return null;
   }
@@ -613,13 +614,13 @@
     }
 
     final String genSnapshotPath =
-      artifacts.getArtifactPath(Artifact.genSnapshot);
+      globals.artifacts.getArtifactPath(Artifact.genSnapshot);
 
     // Check that the binaries we downloaded for this platform actually run on it.
     if (!_genSnapshotRuns(genSnapshotPath)) {
       final StringBuffer buf = StringBuffer();
       buf.writeln(userMessages.flutterBinariesDoNotRun);
-      if (platform.isLinux) {
+      if (globals.platform.isLinux) {
         buf.writeln(userMessages.flutterBinariesLinuxRepairCommands);
       }
       messages.add(ValidationMessage.error(buf.toString()));
@@ -627,7 +628,8 @@
     }
 
     return ValidationResult(valid, messages,
-      statusInfo: userMessages.flutterStatusInfo(versionChannel, frameworkVersion, os.name, platform.localeName),
+      statusInfo: userMessages.flutterStatusInfo(
+        versionChannel, frameworkVersion, os.name, globals.platform.localeName),
     );
   }
 }
@@ -668,10 +670,10 @@
   static final Version kMinIdeaVersion = Version(2017, 1, 0);
 
   static Iterable<DoctorValidator> get installedValidators {
-    if (platform.isLinux || platform.isWindows) {
+    if (globals.platform.isLinux || globals.platform.isWindows) {
       return IntelliJValidatorOnLinuxAndWindows.installed;
     }
-    if (platform.isMacOS) {
+    if (globals.platform.isMacOS) {
       return IntelliJValidatorOnMac.installed;
     }
     return <DoctorValidator>[];
@@ -751,20 +753,20 @@
       validators.add(validator);
     }
 
-    for (FileSystemEntity dir in fs.directory(homeDirPath).listSync()) {
+    for (FileSystemEntity dir in globals.fs.directory(homeDirPath).listSync()) {
       if (dir is Directory) {
-        final String name = fs.path.basename(dir.path);
+        final String name = globals.fs.path.basename(dir.path);
         IntelliJValidator._idToTitle.forEach((String id, String title) {
           if (name.startsWith('.$id')) {
             final String version = name.substring(id.length + 1);
             String installPath;
             try {
-              installPath = fs.file(fs.path.join(dir.path, 'system', '.home')).readAsStringSync();
+              installPath = globals.fs.file(globals.fs.path.join(dir.path, 'system', '.home')).readAsStringSync();
             } catch (e) {
               // ignored
             }
-            if (installPath != null && fs.isDirectorySync(installPath)) {
-              final String pluginsPath = fs.path.join(dir.path, 'config', 'plugins');
+            if (installPath != null && globals.fs.isDirectorySync(installPath)) {
+              final String pluginsPath = globals.fs.path.join(dir.path, 'config', 'plugins');
               addValidator(title, version, installPath, pluginsPath);
             }
           }
@@ -788,10 +790,10 @@
 
   static Iterable<DoctorValidator> get installed {
     final List<DoctorValidator> validators = <DoctorValidator>[];
-    final List<String> installPaths = <String>['/Applications', fs.path.join(homeDirPath, 'Applications')];
+    final List<String> installPaths = <String>['/Applications', globals.fs.path.join(homeDirPath, 'Applications')];
 
     void checkForIntelliJ(Directory dir) {
-      final String name = fs.path.basename(dir.path);
+      final String name = globals.fs.path.basename(dir.path);
       _dirNameToId.forEach((String dirName, String id) {
         if (name == dirName) {
           final String title = IntelliJValidator._idToTitle[id];
@@ -802,7 +804,7 @@
 
     try {
       final Iterable<Directory> installDirs = installPaths
-              .map<Directory>((String installPath) => fs.directory(installPath))
+              .map<Directory>((String installPath) => globals.fs.directory(installPath))
               .map<List<FileSystemEntity>>((Directory dir) => dir.existsSync() ? dir.listSync() : <FileSystemEntity>[])
               .expand<FileSystemEntity>((List<FileSystemEntity> mappedDirs) => mappedDirs)
               .whereType<Directory>();
@@ -830,7 +832,7 @@
   @override
   String get version {
     if (_version == null) {
-      final String plistFile = fs.path.join(installPath, 'Contents', 'Info.plist');
+      final String plistFile = globals.fs.path.join(installPath, 'Contents', 'Info.plist');
       _version = PlistParser.instance.getValueFromFile(
         plistFile,
         PlistParser.kCFBundleShortVersionStringKey,
@@ -845,7 +847,7 @@
     final List<String> split = version.split('.');
     final String major = split[0];
     final String minor = split[1];
-    return fs.path.join(homeDirPath, 'Library', 'Application Support', '$id$major.$minor');
+    return globals.fs.path.join(homeDirPath, 'Library', 'Application Support', '$id$major.$minor');
   }
 }
 
diff --git a/packages/flutter_tools/lib/src/emulator.dart b/packages/flutter_tools/lib/src/emulator.dart
index 49fec92..d29f281 100644
--- a/packages/flutter_tools/lib/src/emulator.dart
+++ b/packages/flutter_tools/lib/src/emulator.dart
@@ -10,7 +10,7 @@
 import 'base/context.dart';
 import 'base/process.dart';
 import 'device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'ios/ios_emulators.dart';
 
 EmulatorManager get emulatorManager => context.get<EmulatorManager>();
@@ -280,7 +280,7 @@
   }
 
   static void printEmulators(List<Emulator> emulators) {
-    descriptions(emulators).forEach(printStatus);
+    descriptions(emulators).forEach(globals.printStatus);
   }
 }
 
diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart
index e2b3de0..0f5b038 100644
--- a/packages/flutter_tools/lib/src/features.dart
+++ b/packages/flutter_tools/lib/src/features.dart
@@ -4,9 +4,8 @@
 
 import 'package:meta/meta.dart';
 
-import 'base/config.dart';
 import 'base/context.dart';
-import 'base/platform.dart';
+import 'globals.dart' as globals;
 import 'version.dart';
 
 /// The current [FeatureFlags] implementation.
@@ -53,13 +52,13 @@
     }
     bool isEnabled = featureSetting.enabledByDefault;
     if (feature.configSetting != null) {
-      final bool configOverride = Config.instance.getValue(feature.configSetting) as bool;
+      final bool configOverride = globals.config.getValue(feature.configSetting) as bool;
       if (configOverride != null) {
         isEnabled = configOverride;
       }
     }
     if (feature.environmentOverride != null) {
-      if (platform.environment[feature.environmentOverride]?.toLowerCase() == 'true') {
+      if (globals.platform.environment[feature.environmentOverride]?.toLowerCase() == 'true') {
         isEnabled = true;
       }
     }
diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart
index ab2c280..f3351a3 100644
--- a/packages/flutter_tools/lib/src/flutter_manifest.dart
+++ b/packages/flutter_tools/lib/src/flutter_manifest.dart
@@ -10,7 +10,7 @@
 import 'base/user_messages.dart';
 import 'base/utils.dart';
 import 'cache.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'plugins.dart';
 
 /// A wrapper around the `flutter` section in the `pubspec.yaml` file.
@@ -27,10 +27,10 @@
 
   /// Returns null on invalid manifest. Returns empty manifest on missing file.
   static FlutterManifest createFromPath(String path) {
-    if (path == null || !fs.isFileSync(path)) {
+    if (path == null || !globals.fs.isFileSync(path)) {
       return _createFromYaml(null);
     }
-    final String manifest = fs.file(path).readAsStringSync();
+    final String manifest = globals.fs.file(path).readAsStringSync();
     return createFromString(manifest);
   }
 
@@ -91,7 +91,7 @@
       version = Version.parse(verStr);
     } on Exception {
       if (!_hasShowInvalidVersionMsg) {
-        printStatus(userMessages.invalidVersionSettingHintMessage(verStr), emphasis: true);
+        globals.printStatus(userMessages.invalidVersionSettingHintMessage(verStr), emphasis: true);
         _hasShowInvalidVersionMsg = true;
       }
     }
@@ -199,14 +199,14 @@
     final List<Uri> results = <Uri>[];
     for (Object asset in assets) {
       if (asset is! String || asset == null || asset == '') {
-        printError('Asset manifest contains a null or empty uri.');
+        globals.printError('Asset manifest contains a null or empty uri.');
         continue;
       }
       final String stringAsset = asset as String;
       try {
         results.add(Uri.parse(Uri.encodeFull(stringAsset)));
       } on FormatException {
-        printError('Asset manifest contains invalid uri: $asset.');
+        globals.printError('Asset manifest contains invalid uri: $asset.');
       }
     }
     return results;
@@ -229,11 +229,11 @@
       final YamlList fontFiles = fontFamily['fonts'] as YamlList;
       final String familyName = fontFamily['family'] as String;
       if (familyName == null) {
-        printError('Warning: Missing family name for font.', emphasis: true);
+        globals.printError('Warning: Missing family name for font.', emphasis: true);
         continue;
       }
       if (fontFiles == null) {
-        printError('Warning: No fonts specified for font $familyName', emphasis: true);
+        globals.printError('Warning: No fonts specified for font $familyName', emphasis: true);
         continue;
       }
 
@@ -241,7 +241,7 @@
       for (Map<dynamic, dynamic> fontFile in fontFiles.cast<Map<dynamic, dynamic>>()) {
         final String asset = fontFile['asset'] as String;
         if (asset == null) {
-          printError('Warning: Missing asset in fonts for $familyName', emphasis: true);
+          globals.printError('Warning: Missing asset in fonts for $familyName', emphasis: true);
           continue;
         }
 
@@ -307,14 +307,14 @@
 
 @visibleForTesting
 String buildSchemaDir(FileSystem fs) {
-  return fs.path.join(
-    fs.path.absolute(Cache.flutterRoot), 'packages', 'flutter_tools', 'schema',
+  return globals.fs.path.join(
+    globals.fs.path.absolute(Cache.flutterRoot), 'packages', 'flutter_tools', 'schema',
   );
 }
 
 @visibleForTesting
 String buildSchemaPath(FileSystem fs) {
-  return fs.path.join(
+  return globals.fs.path.join(
     buildSchemaDir(fs),
     'pubspec_yaml.json',
   );
@@ -352,8 +352,8 @@
   }
 
   if (errors.isNotEmpty) {
-    printStatus('Error detected in pubspec.yaml:', emphasis: true);
-    printError(errors.join('\n'));
+    globals.printStatus('Error detected in pubspec.yaml:', emphasis: true);
+    globals.printError(errors.join('\n'));
     return false;
   }
 
diff --git a/packages/flutter_tools/lib/src/fuchsia/application_package.dart b/packages/flutter_tools/lib/src/fuchsia/application_package.dart
index f7571b2..4626cc0 100644
--- a/packages/flutter_tools/lib/src/fuchsia/application_package.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/application_package.dart
@@ -7,7 +7,7 @@
 import '../application_package.dart';
 import '../base/file_system.dart';
 import '../build_info.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 
 abstract class FuchsiaApp extends ApplicationPackage {
@@ -29,9 +29,9 @@
   ///
   /// [applicationBinary] is the path to the .far archive.
   factory FuchsiaApp.fromPrebuiltApp(FileSystemEntity applicationBinary) {
-    final FileSystemEntityType entityType = fs.typeSync(applicationBinary.path);
+    final FileSystemEntityType entityType = globals.fs.typeSync(applicationBinary.path);
     if (entityType != FileSystemEntityType.file) {
-      printError('File "${applicationBinary.path}" does not exist or is not a .far file. Use far archive.');
+      globals.printError('File "${applicationBinary.path}" does not exist or is not a .far file. Use far archive.');
       return null;
     }
     return PrebuiltFuchsiaApp(
@@ -56,7 +56,7 @@
   final String _farArchive;
 
   @override
-  File farArchive(BuildMode buildMode) => fs.file(_farArchive);
+  File farArchive(BuildMode buildMode) => globals.fs.file(_farArchive);
 
   @override
   String get name => _farArchive;
@@ -72,9 +72,9 @@
   File farArchive(BuildMode buildMode) {
     // TODO(zra): Distinguish among build modes.
     final String outDir = getFuchsiaBuildDirectory();
-    final String pkgDir = fs.path.join(outDir, 'pkg');
+    final String pkgDir = globals.fs.path.join(outDir, 'pkg');
     final String appName = project.project.manifest.appName;
-    return fs.file(fs.path.join(pkgDir, '$appName-0.far'));
+    return globals.fs.file(globals.fs.path.join(pkgDir, '$appName-0.far'));
   }
 
   @override
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
index 3e8f6f0..24f1419 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
@@ -18,7 +18,7 @@
 import '../bundle.dart';
 import '../convert.dart';
 import '../devfs.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 
@@ -28,14 +28,14 @@
 Future<void> _timedBuildStep(String name, Future<void> Function() action) async {
   final Stopwatch sw = Stopwatch()..start();
   await action();
-  printTrace('$name: ${sw.elapsedMilliseconds} ms.');
+  globals.printTrace('$name: ${sw.elapsedMilliseconds} ms.');
   flutterUsage.sendTiming('build', name, Duration(milliseconds: sw.elapsedMilliseconds));
 }
 
 Future<void> _validateCmxFile(FuchsiaProject fuchsiaProject) async {
   final String appName = fuchsiaProject.project.manifest.appName;
-  final String cmxPath = fs.path.join(fuchsiaProject.meta.path, '$appName.cmx');
-  final File cmxFile = fs.file(cmxPath);
+  final String cmxPath = globals.fs.path.join(fuchsiaProject.meta.path, '$appName.cmx');
+  final File cmxFile = globals.fs.file(cmxPath);
   if (!await cmxFile.exists()) {
     throwToolExit('The Fuchsia build requires a .cmx file at $cmxPath for the app: $appName.');
   }
@@ -55,7 +55,7 @@
   String runnerPackageSource = FuchsiaPackageServer.toolHost,
 }) async {
   await _validateCmxFile(fuchsiaProject);
-  final Directory outDir = fs.directory(getFuchsiaBuildDirectory());
+  final Directory outDir = globals.fs.directory(getFuchsiaBuildDirectory());
   if (!outDir.existsSync()) {
     outDir.createSync(recursive: true);
   }
@@ -83,14 +83,14 @@
 ) async {
   final String outDir = getFuchsiaBuildDirectory();
   final String appName = fuchsiaProject.project.manifest.appName;
-  final String dilPath = fs.path.join(outDir, '$appName.dil');
+  final String dilPath = globals.fs.path.join(outDir, '$appName.dil');
 
-  final String vmSnapshotData = fs.path.join(outDir, 'vm_data.aotsnapshot');
-  final String vmSnapshotInstructions = fs.path.join(outDir, 'vm_instructions.aotsnapshot');
-  final String snapshotData = fs.path.join(outDir, 'data.aotsnapshot');
-  final String snapshotInstructions = fs.path.join(outDir, 'instructions.aotsnapshot');
+  final String vmSnapshotData = globals.fs.path.join(outDir, 'vm_data.aotsnapshot');
+  final String vmSnapshotInstructions = globals.fs.path.join(outDir, 'vm_instructions.aotsnapshot');
+  final String snapshotData = globals.fs.path.join(outDir, 'data.aotsnapshot');
+  final String snapshotInstructions = globals.fs.path.join(outDir, 'instructions.aotsnapshot');
 
-  final String genSnapshot = artifacts.getArtifactPath(
+  final String genSnapshot = globals.artifacts.getArtifactPath(
     Artifact.genSnapshot,
     platform: targetPlatform,
     mode: buildInfo.mode,
@@ -109,7 +109,7 @@
     dilPath,
   ];
   int result;
-  final Status status = logger.startProgress(
+  final Status status = globals.logger.startProgress(
     'Compiling Fuchsia application to native code...',
     timeout: null,
   );
@@ -138,13 +138,13 @@
 
   final Map<String, DevFSContent> assetEntries =
       Map<String, DevFSContent>.from(assets.entries);
-  await writeBundle(fs.directory(assetDir), assetEntries);
+  await writeBundle(globals.fs.directory(assetDir), assetEntries);
 
   final String appName = fuchsiaProject.project.manifest.appName;
   final String outDir = getFuchsiaBuildDirectory();
-  final String assetManifest = fs.path.join(outDir, '${appName}_pkgassets');
+  final String assetManifest = globals.fs.path.join(outDir, '${appName}_pkgassets');
 
-  final File destFile = fs.file(assetManifest);
+  final File destFile = globals.fs.file(assetManifest);
   await destFile.create(recursive: true);
   final IOSink outFile = destFile.openWrite();
 
@@ -193,29 +193,29 @@
   String runnerPackageSource,
 ) async {
   final String outDir = getFuchsiaBuildDirectory();
-  final String pkgDir = fs.path.join(outDir, 'pkg');
+  final String pkgDir = globals.fs.path.join(outDir, 'pkg');
   final String appName = fuchsiaProject.project.manifest.appName;
-  final String pkgassets = fs.path.join(outDir, '${appName}_pkgassets');
-  final String packageManifest = fs.path.join(pkgDir, 'package_manifest');
-  final String devKeyPath = fs.path.join(pkgDir, 'development.key');
+  final String pkgassets = globals.fs.path.join(outDir, '${appName}_pkgassets');
+  final String packageManifest = globals.fs.path.join(pkgDir, 'package_manifest');
+  final String devKeyPath = globals.fs.path.join(pkgDir, 'development.key');
 
-  final Directory pkg = fs.directory(pkgDir);
+  final Directory pkg = globals.fs.directory(pkgDir);
   if (!pkg.existsSync()) {
     pkg.createSync(recursive: true);
   }
 
   final File srcCmx =
-      fs.file(fs.path.join(fuchsiaProject.meta.path, '$appName.cmx'));
-  final File dstCmx = fs.file(fs.path.join(outDir, '$appName.cmx'));
+      globals.fs.file(globals.fs.path.join(fuchsiaProject.meta.path, '$appName.cmx'));
+  final File dstCmx = globals.fs.file(globals.fs.path.join(outDir, '$appName.cmx'));
   _rewriteCmx(buildInfo.mode, runnerPackageSource, srcCmx, dstCmx);
 
-  final File manifestFile = fs.file(packageManifest);
+  final File manifestFile = globals.fs.file(packageManifest);
 
   if (buildInfo.usesAot) {
-    final String vmSnapshotData = fs.path.join(outDir, 'vm_data.aotsnapshot');
-    final String vmSnapshotInstructions = fs.path.join(outDir, 'vm_instructions.aotsnapshot');
-    final String snapshotData = fs.path.join(outDir, 'data.aotsnapshot');
-    final String snapshotInstructions = fs.path.join(outDir, 'instructions.aotsnapshot');
+    final String vmSnapshotData = globals.fs.path.join(outDir, 'vm_data.aotsnapshot');
+    final String vmSnapshotInstructions = globals.fs.path.join(outDir, 'vm_instructions.aotsnapshot');
+    final String snapshotData = globals.fs.path.join(outDir, 'data.aotsnapshot');
+    final String snapshotInstructions = globals.fs.path.join(outDir, 'instructions.aotsnapshot');
     manifestFile.writeAsStringSync(
       'data/$appName/vm_snapshot_data.bin=$vmSnapshotData\n');
     manifestFile.writeAsStringSync(
@@ -228,11 +228,11 @@
       'data/$appName/isolate_snapshot_instructions.bin=$snapshotInstructions\n',
       mode: FileMode.append);
   } else {
-    final String dilpmanifest = fs.path.join(outDir, '$appName.dilpmanifest');
-    manifestFile.writeAsStringSync(fs.file(dilpmanifest).readAsStringSync());
+    final String dilpmanifest = globals.fs.path.join(outDir, '$appName.dilpmanifest');
+    manifestFile.writeAsStringSync(globals.fs.file(dilpmanifest).readAsStringSync());
   }
 
-  manifestFile.writeAsStringSync(fs.file(pkgassets).readAsStringSync(),
+  manifestFile.writeAsStringSync(globals.fs.file(pkgassets).readAsStringSync(),
       mode: FileMode.append);
   manifestFile.writeAsStringSync('meta/$appName.cmx=${dstCmx.path}\n',
       mode: FileMode.append);
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart
index 292edf8..0c1e825 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart
@@ -4,7 +4,7 @@
 
 import '../base/common.dart';
 import '../base/process.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'fuchsia_sdk.dart';
 
 // Usage: dev_finder <flags> <subcommand> <subcommand args>
@@ -34,7 +34,7 @@
     ];
     final RunResult result = await processUtils.run(command);
     if (result.exitCode != 0) {
-      printError('dev_finder failed: ${result.stderr}');
+      globals.printError('dev_finder failed: ${result.stderr}');
       return null;
     }
     return result.stdout.split('\n');
@@ -61,7 +61,7 @@
     ];
     final RunResult result = await processUtils.run(command);
     if (result.exitCode != 0) {
-      printError('dev_finder failed: ${result.stderr}');
+      globals.printError('dev_finder failed: ${result.stderr}');
       return null;
     }
     return result.stdout.trim();
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 204bdde..5ae5a89 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -14,13 +14,11 @@
 import '../base/io.dart';
 import '../base/logger.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../base/time.dart';
 import '../build_info.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../vmservice.dart';
 
@@ -141,7 +139,7 @@
   FuchsiaDevices() : super('Fuchsia devices');
 
   @override
-  bool get supportsPlatform => platform.isLinux || platform.isMacOS;
+  bool get supportsPlatform => globals.platform.isLinux || globals.platform.isMacOS;
 
   @override
   bool get canListAnything => fuchsiaWorkflow.canListDevices;
@@ -248,32 +246,32 @@
       local: true,
     );
     if (host == null) {
-      printError('Failed to resolve host for Fuchsia device');
+      globals.printError('Failed to resolve host for Fuchsia device');
       return LaunchResult.failed();
     }
     final int port = await os.findFreePort();
     if (port == 0) {
-      printError('Failed to find a free port');
+      globals.printError('Failed to find a free port');
       return LaunchResult.failed();
     }
 
     // Try Start with a fresh package repo in case one was left over from a
     // previous run.
     final Directory packageRepo =
-        fs.directory(fs.path.join(getFuchsiaBuildDirectory(), '.pkg-repo'));
+        globals.fs.directory(globals.fs.path.join(getFuchsiaBuildDirectory(), '.pkg-repo'));
     try {
       if (packageRepo.existsSync()) {
         packageRepo.deleteSync(recursive: true);
       }
       packageRepo.createSync(recursive: true);
     } catch (e) {
-      printError('Failed to create Fuchisa package repo directory '
+      globals.printError('Failed to create Fuchisa package repo directory '
                  'at ${packageRepo.path}: $e');
       return LaunchResult.failed();
     }
 
     final String appName = FlutterProject.current().manifest.appName;
-    final Status status = logger.startProgress(
+    final Status status = globals.logger.startProgress(
       'Starting Fuchsia application $appName...',
       timeout: null,
     );
@@ -284,11 +282,11 @@
       // package server. This is to avoid relying on amber correctly using
       // multiple package servers, support for which is in flux.
       if (!await fuchsiaDeviceTools.amberCtl.getUp(this, 'tiles')) {
-        printError('Failed to get amber to prefetch tiles');
+        globals.printError('Failed to get amber to prefetch tiles');
         return LaunchResult.failed();
       }
       if (!await fuchsiaDeviceTools.amberCtl.getUp(this, 'tiles_ctl')) {
-        printError('Failed to get amber to prefetch tiles_ctl');
+        globals.printError('Failed to get amber to prefetch tiles_ctl');
         return LaunchResult.failed();
       }
 
@@ -297,7 +295,7 @@
       fuchsiaPackageServer = FuchsiaPackageServer(
           packageRepo.path, packageServerName, host, port);
       if (!await fuchsiaPackageServer.start()) {
-        printError('Failed to start the Fuchsia package server');
+        globals.printError('Failed to start the Fuchsia package server');
         return LaunchResult.failed();
       }
 
@@ -305,24 +303,24 @@
       final File farArchive = package.farArchive(
           debuggingOptions.buildInfo.mode);
       if (!await fuchsiaPackageServer.addPackage(farArchive)) {
-        printError('Failed to add package to the package server');
+        globals.printError('Failed to add package to the package server');
         return LaunchResult.failed();
       }
 
       // Serve the flutter_runner.
-      final File flutterRunnerArchive = fs.file(artifacts.getArtifactPath(
+      final File flutterRunnerArchive = globals.fs.file(globals.artifacts.getArtifactPath(
         Artifact.fuchsiaFlutterRunner,
         platform: await targetPlatform,
         mode: debuggingOptions.buildInfo.mode,
       ));
       if (!await fuchsiaPackageServer.addPackage(flutterRunnerArchive)) {
-        printError('Failed to add flutter_runner package to the package server');
+        globals.printError('Failed to add flutter_runner package to the package server');
         return LaunchResult.failed();
       }
 
       // Teach the package controller about the package server.
       if (!await fuchsiaDeviceTools.amberCtl.addRepoCfg(this, fuchsiaPackageServer)) {
-        printError('Failed to teach amber about the package server');
+        globals.printError('Failed to teach amber about the package server');
         return LaunchResult.failed();
       }
       serverRegistered = true;
@@ -344,27 +342,27 @@
       }
       if (!await fuchsiaDeviceTools.amberCtl.pkgCtlResolve(
           this, fuchsiaPackageServer, flutterRunnerName)) {
-        printError('Failed to get pkgctl to prefetch the flutter_runner');
+        globals.printError('Failed to get pkgctl to prefetch the flutter_runner');
         return LaunchResult.failed();
       }
 
       // Tell the package controller to prefetch the app.
       if (!await fuchsiaDeviceTools.amberCtl.pkgCtlResolve(
           this, fuchsiaPackageServer, appName)) {
-        printError('Failed to get pkgctl to prefetch the package');
+        globals.printError('Failed to get pkgctl to prefetch the package');
         return LaunchResult.failed();
       }
 
       // Ensure tiles_ctl is started, and start the app.
       if (!await FuchsiaTilesCtl.ensureStarted(this)) {
-        printError('Failed to ensure that tiles is started on the device');
+        globals.printError('Failed to ensure that tiles is started on the device');
         return LaunchResult.failed();
       }
 
       // Instruct tiles_ctl to start the app.
       final String fuchsiaUrl = 'fuchsia-pkg://$packageServerName/$appName#meta/$appName.cmx';
       if (!await fuchsiaDeviceTools.tilesCtl.add(this, fuchsiaUrl, <String>[])) {
-        printError('Failed to add the app to tiles');
+        globals.printError('Failed to add the app to tiles');
         return LaunchResult.failed();
       }
     } finally {
@@ -374,23 +372,23 @@
         await fuchsiaDeviceTools.amberCtl.pkgCtlRepoRemove(this, fuchsiaPackageServer);
       }
       // Shutdown the package server and delete the package repo;
-      printTrace('Shutting down the tool\'s package server.');
+      globals.printTrace('Shutting down the tool\'s package server.');
       fuchsiaPackageServer?.stop();
-      printTrace('Removing the tool\'s package repo: at ${packageRepo.path}');
+      globals.printTrace('Removing the tool\'s package repo: at ${packageRepo.path}');
       try {
         packageRepo.deleteSync(recursive: true);
       } catch (e) {
-        printError('Failed to remove Fuchsia package repo directory '
+        globals.printError('Failed to remove Fuchsia package repo directory '
                    'at ${packageRepo.path}: $e.');
       }
       status.cancel();
     }
 
     if (debuggingOptions.buildInfo.mode.isRelease) {
-      printTrace('App succesfully started in a release mode.');
+      globals.printTrace('App succesfully started in a release mode.');
       return LaunchResult.succeeded();
     }
-    printTrace('App started in a non-release mode. Setting up vmservice connection.');
+    globals.printTrace('App started in a non-release mode. Setting up vmservice connection.');
 
     // In a debug or profile build, try to find the observatory uri.
     final FuchsiaIsolateDiscoveryProtocol discovery =
@@ -408,7 +406,7 @@
     final int appKey = await FuchsiaTilesCtl.findAppKey(this, app.id);
     if (appKey != -1) {
       if (!await fuchsiaDeviceTools.tilesCtl.remove(this, appKey)) {
-        printError('tiles_ctl remove on ${app.id} failed.');
+        globals.printError('tiles_ctl remove on ${app.id} failed.');
         return false;
       }
     }
@@ -420,7 +418,7 @@
   Future<TargetPlatform> _queryTargetPlatform() async {
     final RunResult result = await shell('uname -m');
     if (result.exitCode != 0) {
-      printError('Could not determine Fuchsia target platform type:\n$result\n'
+      globals.printError('Could not determine Fuchsia target platform type:\n$result\n'
                  'Defaulting to arm64.');
       return TargetPlatform.fuchsia_arm64;
     }
@@ -431,7 +429,7 @@
       case 'x86_64':
         return TargetPlatform.fuchsia_x64;
       default:
-        printError('Unknown Fuchsia target platform "$machine". '
+        globals.printError('Unknown Fuchsia target platform "$machine". '
                    'Defaulting to arm64.');
         return TargetPlatform.fuchsia_arm64;
     }
@@ -445,12 +443,12 @@
     const String versionPath = '/pkgfs/packages/build-info/0/data/version';
     final RunResult catResult = await shell('cat $versionPath');
     if (catResult.exitCode != 0) {
-      printTrace('Failed to cat $versionPath: ${catResult.stderr}');
+      globals.printTrace('Failed to cat $versionPath: ${catResult.stderr}');
       return 'Fuchsia';
     }
     final String version = catResult.stdout.trim();
     if (version.isEmpty) {
-      printTrace('$versionPath was empty');
+      globals.printTrace('$versionPath was empty');
       return 'Fuchsia';
     }
     return 'Fuchsia $version';
@@ -579,7 +577,7 @@
           }
         }
       } on SocketException catch (err) {
-        printTrace('Failed to connect to $port: $err');
+        globals.printTrace('Failed to connect to $port: $err');
       }
     }
     throwToolExit('No ports found running $isolateName');
@@ -624,7 +622,7 @@
     if (_uri != null) {
       return _uri;
     }
-    _status ??= logger.startProgress(
+    _status ??= globals.logger.startProgress(
       'Waiting for a connection from $_isolateName on ${_device.name}...',
       timeout: null, // could take an arbitrary amount of time
     );
@@ -660,7 +658,7 @@
           service = await _vmServiceConnector(uri);
           _ports[port] = service;
         } on SocketException catch (err) {
-          printTrace('Failed to connect to $localPort: $err');
+          globals.printTrace('Failed to connect to $localPort: $err');
           continue;
         }
       }
@@ -716,7 +714,7 @@
       await device._resolvedIp,
       'true',
     ];
-    final Process process = await processManager.start(command);
+    final Process process = await globals.processManager.start(command);
     unawaited(process.exitCode.then((int exitCode) {
       if (exitCode != 0) {
         throwToolExit('Failed to forward port:$devicePort');
@@ -747,7 +745,7 @@
       '${forwardedPort.hostPort}:$_ipv4Loopback:${forwardedPort.devicePort}',
       await device._resolvedIp,
     ];
-    final ProcessResult result = await processManager.run(command);
+    final ProcessResult result = await globals.processManager.run(command);
     if (result.exitCode != 0) {
       throwToolExit('Unforward command failed: $result');
     }
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart
index dfa7f77..8e76ec0 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart
@@ -6,11 +6,10 @@
 
 import '../artifacts.dart';
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../base/logger.dart';
 import '../base/process.dart';
 import '../build_info.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 
 /// This is a simple wrapper around the custom kernel compiler from the Fuchsia
@@ -31,22 +30,22 @@
     final String outDir = getFuchsiaBuildDirectory();
     final String appName = fuchsiaProject.project.manifest.appName;
     final String fsRoot = fuchsiaProject.project.directory.path;
-    final String relativePackagesFile = fs.path.relative(packagesFile, from: fsRoot);
-    final String manifestPath = fs.path.join(outDir, '$appName.dilpmanifest');
-    final String kernelCompiler = artifacts.getArtifactPath(
+    final String relativePackagesFile = globals.fs.path.relative(packagesFile, from: fsRoot);
+    final String manifestPath = globals.fs.path.join(outDir, '$appName.dilpmanifest');
+    final String kernelCompiler = globals.artifacts.getArtifactPath(
       Artifact.fuchsiaKernelCompiler,
       platform: TargetPlatform.fuchsia_arm64,  // This file is not arch-specific.
       mode: buildInfo.mode,
     );
-    if (!fs.isFileSync(kernelCompiler)) {
+    if (!globals.fs.isFileSync(kernelCompiler)) {
       throwToolExit('Fuchisa kernel compiler not found at "$kernelCompiler"');
     }
-    final String platformDill = artifacts.getArtifactPath(
+    final String platformDill = globals.artifacts.getArtifactPath(
       Artifact.platformKernelDill,
       platform: TargetPlatform.fuchsia_arm64,  // This file is not arch-specific.
       mode: buildInfo.mode,
     );
-    if (!fs.isFileSync(platformDill)) {
+    if (!globals.fs.isFileSync(platformDill)) {
       throwToolExit('Fuchisa platform file not found at "$platformDill"');
     }
     List<String> flags = <String>[
@@ -55,7 +54,7 @@
       '--filesystem-scheme', 'main-root',
       '--filesystem-root', fsRoot,
       '--packages', '$multiRootScheme:///$relativePackagesFile',
-      '--output', fs.path.join(outDir, '$appName.dil'),
+      '--output', globals.fs.path.join(outDir, '$appName.dil'),
       '--component-name', appName,
 
       // AOT/JIT:
@@ -85,11 +84,11 @@
     ];
 
     final List<String> command = <String>[
-      artifacts.getArtifactPath(Artifact.engineDartBinary),
+      globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
       kernelCompiler,
       ...flags,
     ];
-    final Status status = logger.startProgress(
+    final Status status = globals.logger.startProgress(
       'Building Fuchsia application...',
       timeout: null,
     );
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
index 0a18b4b..9400470 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
@@ -7,7 +7,7 @@
 import '../base/io.dart';
 import '../base/process.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 import 'fuchsia_sdk.dart';
 
@@ -121,11 +121,11 @@
     process.stdout
         .transform(utf8.decoder)
         .transform(const LineSplitter())
-        .listen(printTrace);
+        .listen(globals.printTrace);
     process.stderr
         .transform(utf8.decoder)
         .transform(const LineSplitter())
-        .listen(printError);
+        .listen(globals.printError);
     return process;
   }
 
@@ -200,12 +200,12 @@
   /// be spawned, and true otherwise.
   Future<bool> start() async {
     if (_process != null) {
-      printError('$this already started!');
+      globals.printError('$this already started!');
       return false;
     }
     // initialize a new repo.
     if (!await fuchsiaSdk.fuchsiaPM.newrepo(_repo)) {
-      printError('Failed to create a new package server repo');
+      globals.printError('Failed to create a new package server repo');
       return false;
     }
     _process = await fuchsiaSdk.fuchsiaPM.serve(_repo, _host, _port);
@@ -213,7 +213,7 @@
     unawaited(_process.exitCode.whenComplete(() {
       // If _process is null, then the server was stopped deliberately.
       if (_process != null) {
-        printError('Error running Fuchsia pm tool "serve" command');
+        globals.printError('Error running Fuchsia pm tool "serve" command');
       }
     }));
     return true;
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
index f916660..ba91b5f 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
@@ -7,11 +7,8 @@
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
-import '../cache.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 import 'fuchsia_dev_finder.dart';
 import 'fuchsia_kernel_compiler.dart';
@@ -66,8 +63,8 @@
       });
       if (fuchsiaArtifacts.sshConfig == null ||
           !fuchsiaArtifacts.sshConfig.existsSync()) {
-        printError('Cannot read device logs: No ssh config.');
-        printError('Have you set FUCHSIA_SSH_CONFIG or FUCHSIA_BUILD_DIR?');
+        globals.printError('Cannot read device logs: No ssh config.');
+        globals.printError('Have you set FUCHSIA_SSH_CONFIG or FUCHSIA_BUILD_DIR?');
         return null;
       }
       const String remoteCommand = 'log_listener --clock Local';
@@ -78,7 +75,7 @@
         id,
         remoteCommand,
       ];
-      processManager.start(cmd).then((Process newProcess) {
+      globals.processManager.start(cmd).then((Process newProcess) {
         if (controller.isClosed) {
           return;
         }
@@ -90,7 +87,7 @@
       });
       return controller.stream;
     } catch (exception) {
-      printTrace('$exception');
+      globals.printTrace('$exception');
     }
     return const Stream<String>.empty();
   }
@@ -112,7 +109,7 @@
   /// FUCHSIA_SSH_CONFIG) to find the ssh configuration needed to talk to
   /// a device.
   factory FuchsiaArtifacts.find() {
-    if (!platform.isLinux && !platform.isMacOS) {
+    if (!globals.platform.isLinux && !globals.platform.isMacOS) {
       // Don't try to find the artifacts on platforms that are not supported.
       return FuchsiaArtifacts();
     }
@@ -120,17 +117,17 @@
     // relative to it. Next, if FUCHSIA_SSH_CONFIG is defined, then use it.
     // TODO(zra): Consider passing the ssh config path in with a flag.
     File sshConfig;
-    if (platform.environment.containsKey(_kFuchsiaBuildDir)) {
-      sshConfig = fs.file(fs.path.join(
-          platform.environment[_kFuchsiaBuildDir], 'ssh-keys', 'ssh_config'));
-    } else if (platform.environment.containsKey(_kFuchsiaSshConfig)) {
-      sshConfig = fs.file(platform.environment[_kFuchsiaSshConfig]);
+    if (globals.platform.environment.containsKey(_kFuchsiaBuildDir)) {
+      sshConfig = globals.fs.file(globals.fs.path.join(
+          globals.platform.environment[_kFuchsiaBuildDir], 'ssh-keys', 'ssh_config'));
+    } else if (globals.platform.environment.containsKey(_kFuchsiaSshConfig)) {
+      sshConfig = globals.fs.file(globals.platform.environment[_kFuchsiaSshConfig]);
     }
 
-    final String fuchsia = Cache.instance.getArtifactDirectory('fuchsia').path;
-    final String tools = fs.path.join(fuchsia, 'tools');
-    final File devFinder = fs.file(fs.path.join(tools, 'dev_finder'));
-    final File pm = fs.file(fs.path.join(tools, 'pm'));
+    final String fuchsia = globals.cache.getArtifactDirectory('fuchsia').path;
+    final String tools = globals.fs.path.join(fuchsia, 'tools');
+    final File devFinder = globals.fs.file(globals.fs.path.join(tools, 'dev_finder'));
+    final File pm = globals.fs.file(globals.fs.path.join(tools, 'pm'));
 
     return FuchsiaArtifacts(
       sshConfig: sshConfig,
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_workflow.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_workflow.dart
index e6759d9..61edab9 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_workflow.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_workflow.dart
@@ -3,8 +3,8 @@
 // found in the LICENSE file.
 
 import '../base/context.dart';
-import '../base/platform.dart';
 import '../doctor.dart';
+import '../globals.dart' as globals;
 import 'fuchsia_sdk.dart';
 
 /// The [FuchsiaWorkflow] instance.
@@ -17,7 +17,7 @@
 class FuchsiaWorkflow implements Workflow {
 
   @override
-  bool get appliesToHostPlatform => platform.isLinux || platform.isMacOS;
+  bool get appliesToHostPlatform => globals.platform.isLinux || globals.platform.isMacOS;
 
   @override
   bool get canListDevices {
diff --git a/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart b/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart
index 73f9009..5357a9f 100644
--- a/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import '../base/process.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 import 'fuchsia_device.dart';
 
@@ -23,7 +23,7 @@
     final FuchsiaTilesCtl tilesCtl = fuchsiaDeviceTools.tilesCtl;
     final Map<int, String> runningApps = await tilesCtl.list(device);
     if (runningApps == null) {
-      printTrace('tiles_ctl is not running');
+      globals.printTrace('tiles_ctl is not running');
       return -1;
     }
     for (MapEntry<int, String> entry in runningApps.entries) {
diff --git a/packages/flutter_tools/lib/src/globals.dart b/packages/flutter_tools/lib/src/globals.dart
index 51f95dc..777b844 100644
--- a/packages/flutter_tools/lib/src/globals.dart
+++ b/packages/flutter_tools/lib/src/globals.dart
@@ -2,17 +2,43 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
+
 import 'artifacts.dart';
 import 'base/config.dart';
 import 'base/context.dart';
+import 'base/error_handling_file_system.dart';
+import 'base/file_system.dart';
 import 'base/logger.dart';
 import 'base/terminal.dart';
 import 'cache.dart';
 
 Logger get logger => context.get<Logger>();
-Cache get cache => Cache.instance;
-Config get config => Config.instance;
-Artifacts get artifacts => Artifacts.instance;
+Cache get cache => context.get<Cache>();
+Config get config => context.get<Config>();
+Artifacts get artifacts => context.get<Artifacts>();
+
+const FileSystem _kLocalFs = LocalFileSystem();
+
+/// Currently active implementation of the file system.
+///
+/// By default it uses local disk-based implementation. Override this in tests
+/// with [MemoryFileSystem].
+FileSystem get fs => ErrorHandlingFileSystem(
+  context.get<FileSystem>() ?? _kLocalFs,
+);
+
+
+const ProcessManager _kLocalProcessManager = LocalProcessManager();
+
+/// The active process manager.
+ProcessManager get processManager => context.get<ProcessManager>() ?? _kLocalProcessManager;
+
+const Platform _kLocalPlatform = LocalPlatform();
+
+Platform get platform => context.get<Platform>() ?? _kLocalPlatform;
+
 
 /// Display an error level message to the user. Commands should use this if they
 /// fail in some way.
@@ -72,3 +98,9 @@
 /// Use this for verbose tracing output. Users can turn this output on in order
 /// to help diagnose issues with the toolchain or with their setup.
 void printTrace(String message) => logger.printTrace(message);
+
+AnsiTerminal get terminal {
+  return context?.get<AnsiTerminal>() ?? _defaultAnsiTerminal;
+}
+
+final AnsiTerminal _defaultAnsiTerminal = AnsiTerminal();
diff --git a/packages/flutter_tools/lib/src/intellij/intellij.dart b/packages/flutter_tools/lib/src/intellij/intellij.dart
index 5d17917..aa2fd20 100644
--- a/packages/flutter_tools/lib/src/intellij/intellij.dart
+++ b/packages/flutter_tools/lib/src/intellij/intellij.dart
@@ -4,10 +4,10 @@
 
 import 'package:archive/archive.dart';
 
-import '../base/file_system.dart';
 import '../base/version.dart';
 import '../convert.dart';
 import '../doctor.dart';
+import '../globals.dart' as globals;
 
 class IntelliJPlugins {
   IntelliJPlugins(this.pluginsPath);
@@ -45,22 +45,22 @@
   }
 
   bool _hasPackage(String packageName) {
-    final String packagePath = fs.path.join(pluginsPath, packageName);
+    final String packagePath = globals.fs.path.join(pluginsPath, packageName);
     if (packageName.endsWith('.jar')) {
-      return fs.isFileSync(packagePath);
+      return globals.fs.isFileSync(packagePath);
     }
-    return fs.isDirectorySync(packagePath);
+    return globals.fs.isDirectorySync(packagePath);
   }
 
   String _readPackageVersion(String packageName) {
     final String jarPath = packageName.endsWith('.jar')
-        ? fs.path.join(pluginsPath, packageName)
-        : fs.path.join(pluginsPath, packageName, 'lib', '$packageName.jar');
+        ? globals.fs.path.join(pluginsPath, packageName)
+        : globals.fs.path.join(pluginsPath, packageName, 'lib', '$packageName.jar');
     // TODO(danrubel): look for a better way to extract a single 2K file from the zip
     // rather than reading the entire file into memory.
     try {
       final Archive archive =
-          ZipDecoder().decodeBytes(fs.file(jarPath).readAsBytesSync());
+          ZipDecoder().decodeBytes(globals.fs.file(jarPath).readAsBytesSync());
       final ArchiveFile file = archive.findFile('META-INF/plugin.xml');
       final String content = utf8.decode(file.content as List<int>);
       const String versionStartTag = '<version>';
diff --git a/packages/flutter_tools/lib/src/ios/bitcode.dart b/packages/flutter_tools/lib/src/ios/bitcode.dart
index 135c094..2ec0f48 100644
--- a/packages/flutter_tools/lib/src/ios/bitcode.dart
+++ b/packages/flutter_tools/lib/src/ios/bitcode.dart
@@ -5,23 +5,23 @@
 import '../artifacts.dart';
 import '../base/common.dart';
 import '../base/context.dart';
-import '../base/file_system.dart';
 import '../base/process.dart';
 import '../base/version.dart';
 import '../build_info.dart';
+import '../globals.dart' as globals;
 import '../ios/plist_parser.dart';
 import '../macos/xcode.dart';
 
 const bool kBitcodeEnabledDefault = false;
 
 Future<void> validateBitcode(BuildMode buildMode, TargetPlatform targetPlatform) async {
-  final Artifacts artifacts = Artifacts.instance;
-  final String flutterFrameworkPath = artifacts.getArtifactPath(
+  final Artifacts localArtifacts = globals.artifacts;
+  final String flutterFrameworkPath = localArtifacts.getArtifactPath(
     Artifact.flutterFramework,
     mode: buildMode,
     platform: targetPlatform,
   );
-  if (!fs.isDirectorySync(flutterFrameworkPath)) {
+  if (!globals.fs.isDirectorySync(flutterFrameworkPath)) {
     throwToolExit('Flutter.framework not found at $flutterFrameworkPath');
   }
   final Xcode xcode = context.get<Xcode>();
@@ -29,7 +29,7 @@
   final RunResult clangResult = await xcode.clang(<String>['--version']);
   final String clangVersion = clangResult.stdout.split('\n').first;
   final String engineClangVersion = PlistParser.instance.getValueFromFile(
-    fs.path.join(flutterFrameworkPath, 'Info.plist'),
+    globals.fs.path.join(flutterFrameworkPath, 'Info.plist'),
     'ClangVersion',
   );
   final Version engineClangSemVer = _parseVersionFromClang(engineClangVersion);
diff --git a/packages/flutter_tools/lib/src/ios/code_signing.dart b/packages/flutter_tools/lib/src/ios/code_signing.dart
index 0826400..fe375d4 100644
--- a/packages/flutter_tools/lib/src/ios/code_signing.dart
+++ b/packages/flutter_tools/lib/src/ios/code_signing.dart
@@ -10,9 +10,8 @@
 import '../base/common.dart';
 import '../base/io.dart';
 import '../base/process.dart';
-import '../base/terminal.dart';
 import '../convert.dart' show utf8;
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 /// User message when no development certificates are found in the keychain.
 ///
@@ -106,7 +105,7 @@
   // If the user already has it set in the project build settings itself,
   // continue with that.
   if (isNotEmpty(buildSettings['DEVELOPMENT_TEAM'])) {
-    printStatus(
+    globals.printStatus(
       'Automatically signing iOS for device deployment using specified development '
       'team in Xcode project: ${buildSettings['DEVELOPMENT_TEAM']}'
     );
@@ -134,7 +133,7 @@
       throwOnError: true,
     )).stdout.trim();
   } on ProcessException catch (error) {
-    printTrace('Unexpected failure from find-identity: $error.');
+    globals.printTrace('Unexpected failure from find-identity: $error.');
     return null;
   }
 
@@ -156,7 +155,7 @@
     return null;
   }
 
-  printStatus('Signing iOS app for device deployment using developer identity: "$signingIdentity"');
+  globals.printStatus('Signing iOS app for device deployment using developer identity: "$signingIdentity"');
 
   final String signingCertificateId =
       _securityFindIdentityCertificateCnExtractionPattern
@@ -175,7 +174,7 @@
       throwOnError: true,
     )).stdout.trim();
   } on ProcessException catch (error) {
-    printTrace('Couldn\'t find the certificate: $error.');
+    globals.printTrace('Couldn\'t find the certificate: $error.');
     return null;
   }
 
@@ -202,7 +201,7 @@
 Future<String> _chooseSigningIdentity(List<String> validCodeSigningIdentities) async {
   // The user has no valid code signing identities.
   if (validCodeSigningIdentities.isEmpty) {
-    printError(noCertificatesInstruction, emphasis: true);
+    globals.printError(noCertificatesInstruction, emphasis: true);
     throwToolExit('No development certificates available to code sign app for device deployment');
   }
 
@@ -211,34 +210,34 @@
   }
 
   if (validCodeSigningIdentities.length > 1) {
-    final String savedCertChoice = config.getValue('ios-signing-cert') as String;
+    final String savedCertChoice = globals.config.getValue('ios-signing-cert') as String;
 
     if (savedCertChoice != null) {
       if (validCodeSigningIdentities.contains(savedCertChoice)) {
-        printStatus('Found saved certificate choice "$savedCertChoice". To clear, use "flutter config".');
+        globals.printStatus('Found saved certificate choice "$savedCertChoice". To clear, use "flutter config".');
         return savedCertChoice;
       } else {
-        printError('Saved signing certificate "$savedCertChoice" is not a valid development certificate');
+        globals.printError('Saved signing certificate "$savedCertChoice" is not a valid development certificate');
       }
     }
 
     // If terminal UI can't be used, just attempt with the first valid certificate
     // since we can't ask the user.
-    if (!terminal.usesTerminalUi) {
+    if (!globals.terminal.usesTerminalUi) {
       return validCodeSigningIdentities.first;
     }
 
     final int count = validCodeSigningIdentities.length;
-    printStatus(
+    globals.printStatus(
       'Multiple valid development certificates available (your choice will be saved):',
       emphasis: true,
     );
     for (int i=0; i<count; i++) {
-      printStatus('  ${i+1}) ${validCodeSigningIdentities[i]}', emphasis: true);
+      globals.printStatus('  ${i+1}) ${validCodeSigningIdentities[i]}', emphasis: true);
     }
-    printStatus('  a) Abort', emphasis: true);
+    globals.printStatus('  a) Abort', emphasis: true);
 
-    final String choice = await terminal.promptForCharInput(
+    final String choice = await globals.terminal.promptForCharInput(
       List<String>.generate(count, (int number) => '${number + 1}')
           ..add('a'),
       prompt: 'Please select a certificate for code signing',
@@ -250,8 +249,8 @@
       throwToolExit('Aborted. Code signing is required to build a deployable iOS app.');
     } else {
       final String selectedCert = validCodeSigningIdentities[int.parse(choice) - 1];
-      printStatus('Certificate choice "$selectedCert" saved');
-      config.setValue('ios-signing-cert', selectedCert);
+      globals.printStatus('Certificate choice "$selectedCert" saved');
+      globals.config.setValue('ios-signing-cert', selectedCert);
       return selectedCert;
     }
   }
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index 7361c17..5b5fd27 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -13,12 +13,11 @@
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/logger.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../build_info.dart';
 import '../convert.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../mdns_discovery.dart';
 import '../project.dart';
 import '../protocol_discovery.dart';
@@ -40,7 +39,7 @@
     @required String bundlePath,
     @required List<String> launchArguments,
   }) async {
-    final String iosDeployPath = artifacts.getArtifactPath(Artifact.iosDeploy, platform: TargetPlatform.ios);
+    final String iosDeployPath = globals.artifacts.getArtifactPath(Artifact.iosDeploy, platform: TargetPlatform.ios);
     final List<String> launchCommand = <String>[
       iosDeployPath,
       '--id',
@@ -62,9 +61,9 @@
     // python at the front of the path, which may not include package 'six'.
     // Ensure that we pick up the system install of python, which does include
     // it.
-    final Map<String, String> iosDeployEnv = Map<String, String>.from(platform.environment);
+    final Map<String, String> iosDeployEnv = Map<String, String>.from(globals.platform.environment);
     iosDeployEnv['PATH'] = '/usr/bin:${iosDeployEnv['PATH']}';
-    iosDeployEnv.addEntries(<MapEntry<String, String>>[cache.dyLdLibEntry]);
+    iosDeployEnv.addEntries(<MapEntry<String, String>>[globals.cache.dyLdLibEntry]);
 
     return await processUtils.stream(
       launchCommand,
@@ -78,17 +77,17 @@
   String _monitorInstallationFailure(String stdout) {
     // Installation issues.
     if (stdout.contains('Error 0xe8008015') || stdout.contains('Error 0xe8000067')) {
-      printError(noProvisioningProfileInstruction, emphasis: true);
+      globals.printError(noProvisioningProfileInstruction, emphasis: true);
 
     // Launch issues.
     } else if (stdout.contains('e80000e2')) {
-      printError('''
+      globals.printError('''
 ═══════════════════════════════════════════════════════════════════════════════════
 Your device is locked. Unlock your device first before running.
 ═══════════════════════════════════════════════════════════════════════════════════''',
       emphasis: true);
     } else if (stdout.contains('Error 0xe8000022')) {
-      printError('''
+      globals.printError('''
 ═══════════════════════════════════════════════════════════════════════════════════
 Error launching app. Try launching from within Xcode via:
     open ios/Runner.xcworkspace
@@ -106,7 +105,7 @@
   IOSDevices() : super('iOS devices');
 
   @override
-  bool get supportsPlatform => platform.isMacOS;
+  bool get supportsPlatform => globals.platform.isMacOS;
 
   @override
   bool get canListAnything => iosWorkflow.canListDevices;
@@ -124,15 +123,15 @@
           platformType: PlatformType.ios,
           ephemeral: true,
       ) {
-    if (!platform.isMacOS) {
+    if (!globals.platform.isMacOS) {
       assert(false, 'Control of iOS devices or simulators only supported on Mac OS.');
       return;
     }
-    _installerPath = artifacts.getArtifactPath(
+    _installerPath = globals.artifacts.getArtifactPath(
       Artifact.ideviceinstaller,
       platform: TargetPlatform.ios,
     );
-    _iproxyPath = artifacts.getArtifactPath(
+    _iproxyPath = globals.artifacts.getArtifactPath(
       Artifact.iproxy,
       platform: TargetPlatform.ios,
     );
@@ -172,7 +171,7 @@
   bool get supportsStartPaused => false;
 
   static Future<List<IOSDevice>> getAttachedDevices() async {
-    if (!platform.isMacOS) {
+    if (!globals.platform.isMacOS) {
       throw UnsupportedError('Control of iOS devices or simulators only supported on Mac OS.');
     }
     if (!iMobileDevice.isInstalled) {
@@ -192,9 +191,9 @@
         devices.add(IOSDevice(id, name: deviceName, sdkVersion: sdkVersion));
       } on IOSDeviceNotFoundError catch (error) {
         // Unable to find device with given udid. Possibly a network device.
-        printTrace('Error getting attached iOS device: $error');
+        globals.printTrace('Error getting attached iOS device: $error');
       } on IOSDeviceNotTrustedError catch (error) {
-        printTrace('Error getting attached iOS device information: $error');
+        globals.printTrace('Error getting attached iOS device information: $error');
         UsageEvent('device', 'ios-trust-failure').send();
       }
     }
@@ -209,7 +208,7 @@
         <String>[_installerPath, '--list-apps'],
         throwOnError: true,
         environment: Map<String, String>.fromEntries(
-          <MapEntry<String, String>>[cache.dyLdLibEntry],
+          <MapEntry<String, String>>[globals.cache.dyLdLibEntry],
         ),
       );
     } on ProcessException {
@@ -223,9 +222,9 @@
 
   @override
   Future<bool> installApp(IOSApp app) async {
-    final Directory bundle = fs.directory(app.deviceBundlePath);
+    final Directory bundle = globals.fs.directory(app.deviceBundlePath);
     if (!bundle.existsSync()) {
-      printError('Could not find application bundle at ${bundle.path}; have you run "flutter build ios"?');
+      globals.printError('Could not find application bundle at ${bundle.path}; have you run "flutter build ios"?');
       return false;
     }
 
@@ -234,12 +233,12 @@
         <String>[_installerPath, '-i', app.deviceBundlePath],
         throwOnError: true,
         environment: Map<String, String>.fromEntries(
-          <MapEntry<String, String>>[cache.dyLdLibEntry],
+          <MapEntry<String, String>>[globals.cache.dyLdLibEntry],
         ),
       );
       return true;
     } on ProcessException catch (error) {
-      printError(error.message);
+      globals.printError(error.message);
       return false;
     }
   }
@@ -251,12 +250,12 @@
         <String>[_installerPath, '-U', app.id],
         throwOnError: true,
         environment: Map<String, String>.fromEntries(
-          <MapEntry<String, String>>[cache.dyLdLibEntry],
+          <MapEntry<String, String>>[globals.cache.dyLdLibEntry],
         ),
       );
       return true;
     } on ProcessException catch (error) {
-      printError(error.message);
+      globals.printError(error.message);
       return false;
     }
   }
@@ -279,14 +278,14 @@
 
     if (!prebuiltApplication) {
       // TODO(chinmaygarde): Use mainPath, route.
-      printTrace('Building ${package.name} for $id');
+      globals.printTrace('Building ${package.name} for $id');
 
       String cpuArchitecture;
 
       try {
         cpuArchitecture = await iMobileDevice.getInfoForDevice(id, 'CPUArchitecture');
       } on IOSDeviceNotFoundError catch (e) {
-        printError(e.message);
+        globals.printError(e.message);
         return LaunchResult.failed();
       }
 
@@ -301,9 +300,9 @@
           activeArch: iosArch,
       );
       if (!buildResult.success) {
-        printError('Could not build the precompiled application for the device.');
+        globals.printError('Could not build the precompiled application for the device.');
         await diagnoseXcodeBuildFailure(buildResult);
-        printError('');
+        globals.printError('');
         return LaunchResult.failed();
       }
       packageId = buildResult.xcodeBuildExecution?.buildSettings['PRODUCT_BUNDLE_IDENTIFIER'];
@@ -316,9 +315,9 @@
     packageId ??= package.id;
 
     // Step 2: Check that the application exists at the specified path.
-    final Directory bundle = fs.directory(package.deviceBundlePath);
+    final Directory bundle = globals.fs.directory(package.deviceBundlePath);
     if (!bundle.existsSync()) {
-      printError('Could not find the built application bundle at ${bundle.path}.');
+      globals.printError('Could not find the built application bundle at ${bundle.path}.');
       return LaunchResult.failed();
     }
 
@@ -335,7 +334,7 @@
       // "system_debug_ios" integration test in the CI, which simulates a
       // home-screen launch.
       if (debuggingOptions.debuggingEnabled &&
-          platform.environment['FLUTTER_TOOLS_DEBUG_WITHOUT_CHECKED_MODE'] != 'true') ...<String>[
+          globals.platform.environment['FLUTTER_TOOLS_DEBUG_WITHOUT_CHECKED_MODE'] != 'true') ...<String>[
         '--enable-checked-mode',
         '--verify-entry-points',
       ],
@@ -350,14 +349,14 @@
       if (platformArgs['trace-startup'] as bool ?? false) '--trace-startup',
     ];
 
-    final Status installStatus = logger.startProgress(
+    final Status installStatus = globals.logger.startProgress(
         'Installing and launching...',
         timeout: timeoutConfiguration.slowOperation);
     try {
       ProtocolDiscovery observatoryDiscovery;
       if (debuggingOptions.debuggingEnabled) {
         // Debugging is enabled, look for the observatory server port post launch.
-        printTrace('Debugging is enabled, connecting to observatory');
+        globals.printTrace('Debugging is enabled, connecting to observatory');
 
         // TODO(danrubel): The Android device class does something similar to this code below.
         // The various Device subclasses should be refactored and common code moved into the superclass.
@@ -375,10 +374,10 @@
         launchArguments: launchArguments,
       );
       if (installationResult != 0) {
-        printError('Could not install ${bundle.path} on $id.');
-        printError('Try launching Xcode and selecting "Product > Run" to fix the problem:');
-        printError('  open ios/Runner.xcworkspace');
-        printError('');
+        globals.printError('Could not install ${bundle.path} on $id.');
+        globals.printError('Try launching Xcode and selecting "Product > Run" to fix the problem:');
+        globals.printError('  open ios/Runner.xcworkspace');
+        globals.printError('');
         return LaunchResult.failed();
       }
 
@@ -388,7 +387,7 @@
 
       Uri localUri;
       try {
-        printTrace('Application launched on the device. Waiting for observatory port.');
+        globals.printTrace('Application launched on the device. Waiting for observatory port.');
         localUri = await MDnsObservatoryDiscovery.instance.getObservatoryUri(
           packageId,
           this,
@@ -400,21 +399,21 @@
           return LaunchResult.succeeded(observatoryUri: localUri);
         }
       } catch (error) {
-        printError('Failed to establish a debug connection with $id using mdns: $error');
+        globals.printError('Failed to establish a debug connection with $id using mdns: $error');
       }
 
       // Fallback to manual protocol discovery.
       UsageEvent('ios-mdns', 'failure').send();
-      printTrace('mDNS lookup failed, attempting fallback to reading device log.');
+      globals.printTrace('mDNS lookup failed, attempting fallback to reading device log.');
       try {
-        printTrace('Waiting for observatory port.');
+        globals.printTrace('Waiting for observatory port.');
         localUri = await observatoryDiscovery.uri;
         if (localUri != null) {
           UsageEvent('ios-mdns', 'fallback-success').send();
           return LaunchResult.succeeded(observatoryUri: localUri);
         }
       } catch (error) {
-        printError('Failed to establish a debug connection with $id using logs: $error');
+        globals.printError('Failed to establish a debug connection with $id using logs: $error');
       } finally {
         await observatoryDiscovery?.cancel();
       }
@@ -697,7 +696,7 @@
 
     bool connected = false;
     while (!connected) {
-      printTrace('Attempting to forward device port $devicePort to host port $hostPort');
+      globals.printTrace('Attempting to forward device port $devicePort to host port $hostPort');
       // Usage: iproxy LOCAL_TCP_PORT DEVICE_TCP_PORT UDID
       process = await processUtils.start(
         <String>[
@@ -707,7 +706,7 @@
           device.id,
         ],
         environment: Map<String, String>.fromEntries(
-          <MapEntry<String, String>>[cache.dyLdLibEntry],
+          <MapEntry<String, String>>[globals.cache.dyLdLibEntry],
         ),
       );
       // TODO(ianh): This is a flakey race condition, https://github.com/libimobiledevice/libimobiledevice/issues/674
@@ -730,7 +729,7 @@
     final ForwardedPort forwardedPort = ForwardedPort.withContext(
       hostPort, devicePort, process,
     );
-    printTrace('Forwarded port $forwardedPort');
+    globals.printTrace('Forwarded port $forwardedPort');
     _forwardedPorts.add(forwardedPort);
     return hostPort;
   }
@@ -742,7 +741,7 @@
       return;
     }
 
-    printTrace('Unforwarding port $forwardedPort');
+    globals.printTrace('Unforwarding port $forwardedPort');
     forwardedPort.dispose();
   }
 
diff --git a/packages/flutter_tools/lib/src/ios/ios_emulators.dart b/packages/flutter_tools/lib/src/ios/ios_emulators.dart
index 96bc865..0ac58ab 100644
--- a/packages/flutter_tools/lib/src/ios/ios_emulators.dart
+++ b/packages/flutter_tools/lib/src/ios/ios_emulators.dart
@@ -4,18 +4,17 @@
 
 import 'dart:async';
 
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../device.dart';
 import '../emulator.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../macos/xcode.dart';
 import 'ios_workflow.dart';
 import 'simulators.dart';
 
 class IOSEmulators extends EmulatorDiscovery {
   @override
-  bool get supportsPlatform => platform.isMacOS;
+  bool get supportsPlatform => globals.platform.isMacOS;
 
   @override
   bool get canListAnything => iosWorkflow.canListEmulators;
@@ -51,7 +50,7 @@
 
       final RunResult launchResult = await processUtils.run(args);
       if (launchResult.exitCode != 0) {
-        printError('$launchResult');
+        globals.printError('$launchResult');
         return false;
       }
       return true;
diff --git a/packages/flutter_tools/lib/src/ios/ios_workflow.dart b/packages/flutter_tools/lib/src/ios/ios_workflow.dart
index 155a08e..d49a111 100644
--- a/packages/flutter_tools/lib/src/ios/ios_workflow.dart
+++ b/packages/flutter_tools/lib/src/ios/ios_workflow.dart
@@ -3,8 +3,8 @@
 // found in the LICENSE file.
 
 import '../base/context.dart';
-import '../base/platform.dart';
 import '../doctor.dart';
+import '../globals.dart' as globals;
 import '../macos/xcode.dart';
 
 IOSWorkflow get iosWorkflow => context.get<IOSWorkflow>();
@@ -13,7 +13,7 @@
   const IOSWorkflow();
 
   @override
-  bool get appliesToHostPlatform => platform.isMacOS;
+  bool get appliesToHostPlatform => globals.platform.isMacOS;
 
   // We need xcode (+simctl) to list simulator devices, and libimobiledevice to list real devices.
   @override
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 3ac2ecb..7974313 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -14,13 +14,11 @@
 import '../base/io.dart';
 import '../base/logger.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
 import '../flutter_manifest.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../macos/cocoapod_utils.dart';
 import '../macos/xcode.dart';
 import '../project.dart';
@@ -93,11 +91,11 @@
 
 class IMobileDevice {
   IMobileDevice()
-      : _ideviceIdPath = artifacts.getArtifactPath(Artifact.ideviceId, platform: TargetPlatform.ios),
-        _ideviceinfoPath = artifacts.getArtifactPath(Artifact.ideviceinfo, platform: TargetPlatform.ios),
-        _idevicenamePath = artifacts.getArtifactPath(Artifact.idevicename, platform: TargetPlatform.ios),
-        _idevicesyslogPath = artifacts.getArtifactPath(Artifact.idevicesyslog, platform: TargetPlatform.ios),
-        _idevicescreenshotPath = artifacts.getArtifactPath(Artifact.idevicescreenshot, platform: TargetPlatform.ios);
+      : _ideviceIdPath = globals.artifacts.getArtifactPath(Artifact.ideviceId, platform: TargetPlatform.ios),
+        _ideviceinfoPath = globals.artifacts.getArtifactPath(Artifact.ideviceinfo, platform: TargetPlatform.ios),
+        _idevicenamePath = globals.artifacts.getArtifactPath(Artifact.idevicename, platform: TargetPlatform.ios),
+        _idevicesyslogPath = globals.artifacts.getArtifactPath(Artifact.idevicesyslog, platform: TargetPlatform.ios),
+        _idevicescreenshotPath = globals.artifacts.getArtifactPath(Artifact.idevicescreenshot, platform: TargetPlatform.ios);
 
   final String _ideviceIdPath;
   final String _ideviceinfoPath;
@@ -112,7 +110,7 @@
         '-h',
       ],
       environment: Map<String, String>.fromEntries(
-        <MapEntry<String, String>>[cache.dyLdLibEntry]
+        <MapEntry<String, String>>[globals.cache.dyLdLibEntry]
       ),
     );
     return _isInstalled;
@@ -133,7 +131,7 @@
     // If usage info is printed in a hyphenated id, we need to update.
     const String fakeIphoneId = '00008020-001C2D903C42002E';
     final Map<String, String> executionEnv = Map<String, String>.fromEntries(
-      <MapEntry<String, String>>[cache.dyLdLibEntry]
+      <MapEntry<String, String>>[globals.cache.dyLdLibEntry]
     );
     final ProcessResult ideviceResult = (await processUtils.run(
       <String>[
@@ -171,13 +169,13 @@
 
   Future<String> getAvailableDeviceIDs() async {
     try {
-      final ProcessResult result = await processManager.run(
+      final ProcessResult result = await globals.processManager.run(
         <String>[
           _ideviceIdPath,
           '-l',
         ],
         environment: Map<String, String>.fromEntries(
-          <MapEntry<String, String>>[cache.dyLdLibEntry]
+          <MapEntry<String, String>>[globals.cache.dyLdLibEntry]
         ),
       );
       if (result.exitCode != 0) {
@@ -191,7 +189,7 @@
 
   Future<String> getInfoForDevice(String deviceID, String key) async {
     try {
-      final ProcessResult result = await processManager.run(
+      final ProcessResult result = await globals.processManager.run(
         <String>[
           _ideviceinfoPath,
           '-u',
@@ -200,7 +198,7 @@
           key,
         ],
         environment: Map<String, String>.fromEntries(
-          <MapEntry<String, String>>[cache.dyLdLibEntry]
+          <MapEntry<String, String>>[globals.cache.dyLdLibEntry]
         ),
       );
       final String stdout = result.stdout as String;
@@ -240,7 +238,7 @@
         deviceID,
       ],
       environment: Map<String, String>.fromEntries(
-        <MapEntry<String, String>>[cache.dyLdLibEntry]
+        <MapEntry<String, String>>[globals.cache.dyLdLibEntry]
       ),
     );
   }
@@ -254,7 +252,7 @@
       ],
       throwOnError: true,
       environment: Map<String, String>.fromEntries(
-        <MapEntry<String, String>>[cache.dyLdLibEntry]
+        <MapEntry<String, String>>[globals.cache.dyLdLibEntry]
       ),
     );
   }
@@ -280,47 +278,47 @@
 
   final XcodeProjectInfo projectInfo = await xcodeProjectInterpreter.getInfo(app.project.hostAppRoot.path);
   if (!projectInfo.targets.contains('Runner')) {
-    printError('The Xcode project does not define target "Runner" which is needed by Flutter tooling.');
-    printError('Open Xcode to fix the problem:');
-    printError('  open ios/Runner.xcworkspace');
+    globals.printError('The Xcode project does not define target "Runner" which is needed by Flutter tooling.');
+    globals.printError('Open Xcode to fix the problem:');
+    globals.printError('  open ios/Runner.xcworkspace');
     return XcodeBuildResult(success: false);
   }
   final String scheme = projectInfo.schemeFor(buildInfo);
   if (scheme == null) {
-    printError('');
+    globals.printError('');
     if (projectInfo.definesCustomSchemes) {
-      printError('The Xcode project defines schemes: ${projectInfo.schemes.join(', ')}');
-      printError('You must specify a --flavor option to select one of them.');
+      globals.printError('The Xcode project defines schemes: ${projectInfo.schemes.join(', ')}');
+      globals.printError('You must specify a --flavor option to select one of them.');
     } else {
-      printError('The Xcode project does not define custom schemes.');
-      printError('You cannot use the --flavor option.');
+      globals.printError('The Xcode project does not define custom schemes.');
+      globals.printError('You cannot use the --flavor option.');
     }
     return XcodeBuildResult(success: false);
   }
   final String configuration = projectInfo.buildConfigurationFor(buildInfo, scheme);
   if (configuration == null) {
-    printError('');
-    printError('The Xcode project defines build configurations: ${projectInfo.buildConfigurations.join(', ')}');
-    printError('Flutter expects a build configuration named ${XcodeProjectInfo.expectedBuildConfigurationFor(buildInfo, scheme)} or similar.');
-    printError('Open Xcode to fix the problem:');
-    printError('  open ios/Runner.xcworkspace');
-    printError('1. Click on "Runner" in the project navigator.');
-    printError('2. Ensure the Runner PROJECT is selected, not the Runner TARGET.');
+    globals.printError('');
+    globals.printError('The Xcode project defines build configurations: ${projectInfo.buildConfigurations.join(', ')}');
+    globals.printError('Flutter expects a build configuration named ${XcodeProjectInfo.expectedBuildConfigurationFor(buildInfo, scheme)} or similar.');
+    globals.printError('Open Xcode to fix the problem:');
+    globals.printError('  open ios/Runner.xcworkspace');
+    globals.printError('1. Click on "Runner" in the project navigator.');
+    globals.printError('2. Ensure the Runner PROJECT is selected, not the Runner TARGET.');
     if (buildInfo.isDebug) {
-      printError('3. Click the Editor->Add Configuration->Duplicate "Debug" Configuration.');
+      globals.printError('3. Click the Editor->Add Configuration->Duplicate "Debug" Configuration.');
     } else {
-      printError('3. Click the Editor->Add Configuration->Duplicate "Release" Configuration.');
+      globals.printError('3. Click the Editor->Add Configuration->Duplicate "Release" Configuration.');
     }
-    printError('');
-    printError('   If this option is disabled, it is likely you have the target selected instead');
-    printError('   of the project; see:');
-    printError('   https://stackoverflow.com/questions/19842746/adding-a-build-configuration-in-xcode');
-    printError('');
-    printError('   If you have created a completely custom set of build configurations,');
-    printError('   you can set the FLUTTER_BUILD_MODE=${buildInfo.modeName.toLowerCase()}');
-    printError('   in the .xcconfig file for that configuration and run from Xcode.');
-    printError('');
-    printError('4. If you are not using completely custom build configurations, name the newly created configuration ${buildInfo.modeName}.');
+    globals.printError('');
+    globals.printError('   If this option is disabled, it is likely you have the target selected instead');
+    globals.printError('   of the project; see:');
+    globals.printError('   https://stackoverflow.com/questions/19842746/adding-a-build-configuration-in-xcode');
+    globals.printError('');
+    globals.printError('   If you have created a completely custom set of build configurations,');
+    globals.printError('   you can set the FLUTTER_BUILD_MODE=${buildInfo.modeName.toLowerCase()}');
+    globals.printError('   in the .xcconfig file for that configuration and run from Xcode.');
+    globals.printError('');
+    globals.printError('4. If you are not using completely custom build configurations, name the newly created configuration ${buildInfo.modeName}.');
     return XcodeBuildResult(success: false);
   }
 
@@ -329,17 +327,17 @@
   final bool buildNameIsMissing = buildName == null || buildName.isEmpty;
 
   if (buildNameIsMissing) {
-    printStatus('Warning: Missing build name (CFBundleShortVersionString).');
+    globals.printStatus('Warning: Missing build name (CFBundleShortVersionString).');
   }
 
   final String buildNumber = parsedBuildNumber(manifest: manifest, buildInfo: buildInfo);
   final bool buildNumberIsMissing = buildNumber == null || buildNumber.isEmpty;
 
   if (buildNumberIsMissing) {
-    printStatus('Warning: Missing build number (CFBundleVersion).');
+    globals.printStatus('Warning: Missing build number (CFBundleVersion).');
   }
   if (buildNameIsMissing || buildNumberIsMissing) {
-    printError('Action Required: You must set a build name and number in the pubspec.yaml '
+    globals.printError('Action Required: You must set a build name and number in the pubspec.yaml '
       'file version field before submitting to the App Store.');
   }
 
@@ -363,7 +361,7 @@
     '-configuration', configuration,
   ];
 
-  if (logger.isVerbose) {
+  if (globals.logger.isVerbose) {
     // An environment variable to be passed to xcode_backend.sh determining
     // whether to echo back executed commands.
     buildCommands.add('VERBOSE_SCRIPT_LOGGING=YES');
@@ -382,11 +380,11 @@
 
   final List<FileSystemEntity> contents = app.project.hostAppRoot.listSync();
   for (FileSystemEntity entity in contents) {
-    if (fs.path.extension(entity.path) == '.xcworkspace') {
+    if (globals.fs.path.extension(entity.path) == '.xcworkspace') {
       buildCommands.addAll(<String>[
-        '-workspace', fs.path.basename(entity.path),
+        '-workspace', globals.fs.path.basename(entity.path),
         '-scheme', scheme,
-        'BUILD_DIR=${fs.path.absolute(getIosBuildDirectory())}',
+        'BUILD_DIR=${globals.fs.path.absolute(getIosBuildDirectory())}',
       ]);
       break;
     }
@@ -421,8 +419,8 @@
   Directory tempDir;
 
   File scriptOutputPipeFile;
-  if (logger.hasTerminal) {
-    tempDir = fs.systemTempDirectory.createTempSync('flutter_build_log_pipe.');
+  if (globals.logger.hasTerminal) {
+    tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_build_log_pipe.');
     scriptOutputPipeFile = tempDir.childFile('pipe_to_stdout');
     os.makePipe(scriptOutputPipeFile.path);
 
@@ -440,7 +438,7 @@
         } else {
           initialBuildStatus?.cancel();
           initialBuildStatus = null;
-          buildSubStatus = logger.startProgress(
+          buildSubStatus = globals.logger.startProgress(
             line,
             timeout: timeoutConfiguration.slowOperation,
             progressIndicatorPadding: kDefaultStatusPadding - 7,
@@ -463,7 +461,7 @@
   buildCommands.addAll(environmentVariablesAsXcodeBuildSettings());
 
   final Stopwatch sw = Stopwatch()..start();
-  initialBuildStatus = logger.startProgress('Running Xcode build...', timeout: timeoutConfiguration.fastOperation);
+  initialBuildStatus = globals.logger.startProgress('Running Xcode build...', timeout: timeoutConfiguration.fastOperation);
 
   final RunResult buildResult = await _runBuildWithRetries(buildCommands, app);
 
@@ -473,7 +471,7 @@
   buildSubStatus = null;
   initialBuildStatus?.cancel();
   initialBuildStatus = null;
-  printStatus(
+  globals.printStatus(
     'Xcode build done.'.padRight(kDefaultStatusPadding + 1)
         + '${getElapsedAsSeconds(sw.elapsed).padLeft(5)}',
   );
@@ -517,14 +515,14 @@
   }
 
   if (buildResult.exitCode != 0) {
-    printStatus('Failed to build iOS app');
+    globals.printStatus('Failed to build iOS app');
     if (buildResult.stderr.isNotEmpty) {
-      printStatus('Error output from Xcode build:\n↳');
-      printStatus(buildResult.stderr, indent: 4);
+      globals.printStatus('Error output from Xcode build:\n↳');
+      globals.printStatus(buildResult.stderr, indent: 4);
     }
     if (buildResult.stdout.isNotEmpty) {
-      printStatus('Xcode\'s output:\n↳');
-      printStatus(buildResult.stdout, indent: 4);
+      globals.printStatus('Xcode\'s output:\n↳');
+      globals.printStatus(buildResult.stdout, indent: 4);
     }
     return XcodeBuildResult(
       success: false,
@@ -538,24 +536,24 @@
       ),
     );
   } else {
-    final String expectedOutputDirectory = fs.path.join(
+    final String expectedOutputDirectory = globals.fs.path.join(
       buildSettings['TARGET_BUILD_DIR'],
       buildSettings['WRAPPER_NAME'],
     );
 
     String outputDir;
-    if (fs.isDirectorySync(expectedOutputDirectory)) {
+    if (globals.fs.isDirectorySync(expectedOutputDirectory)) {
       // Copy app folder to a place where other tools can find it without knowing
       // the BuildInfo.
       outputDir = expectedOutputDirectory.replaceFirst('/$configuration-', '/');
-      if (fs.isDirectorySync(outputDir)) {
+      if (globals.fs.isDirectorySync(outputDir)) {
         // Previous output directory might have incompatible artifacts
         // (for example, kernel binary files produced from previous run).
-        fs.directory(outputDir).deleteSync(recursive: true);
+        globals.fs.directory(outputDir).deleteSync(recursive: true);
       }
-      copyDirectorySync(fs.directory(expectedOutputDirectory), fs.directory(outputDir));
+      copyDirectorySync(globals.fs.directory(expectedOutputDirectory), globals.fs.directory(outputDir));
     } else {
-      printError('Build succeeded but the expected app at $expectedOutputDirectory not found');
+      globals.printError('Build succeeded but the expected app at $expectedOutputDirectory not found');
     }
     return XcodeBuildResult(
         success: true,
@@ -592,11 +590,11 @@
     }
 
     if (remainingTries > 0) {
-      printStatus('Xcode build failed due to concurrent builds, '
+      globals.printStatus('Xcode build failed due to concurrent builds, '
         'will retry in $buildRetryDelaySeconds seconds.');
       await Future<void>.delayed(Duration(seconds: buildRetryDelaySeconds));
     } else {
-      printStatus(
+      globals.printStatus(
         'Xcode build failed too many times due to concurrent builds, '
         'giving up.');
       break;
@@ -615,8 +613,8 @@
 
 String readGeneratedXcconfig(String appPath) {
   final String generatedXcconfigPath =
-      fs.path.join(fs.currentDirectory.path, appPath, 'Flutter', 'Generated.xcconfig');
-  final File generatedXcconfigFile = fs.file(generatedXcconfigPath);
+      globals.fs.path.join(globals.fs.currentDirectory.path, appPath, 'Flutter', 'Generated.xcconfig');
+  final File generatedXcconfigFile = globals.fs.file(generatedXcconfigPath);
   if (!generatedXcconfigFile.existsSync()) {
     return null;
   }
@@ -638,7 +636,7 @@
       result.stdout?.contains('BCEROR') == true &&
       // May need updating if Xcode changes its outputs.
       result.stdout?.contains('Xcode couldn\'t find a provisioning profile matching') == true) {
-    printError(noProvisioningProfileInstruction, emphasis: true);
+    globals.printError(noProvisioningProfileInstruction, emphasis: true);
     return;
   }
   // Make sure the user has specified one of:
@@ -648,26 +646,26 @@
       result.xcodeBuildExecution.buildForPhysicalDevice &&
       !<String>['DEVELOPMENT_TEAM', 'PROVISIONING_PROFILE'].any(
         result.xcodeBuildExecution.buildSettings.containsKey)) {
-    printError(noDevelopmentTeamInstruction, emphasis: true);
+    globals.printError(noDevelopmentTeamInstruction, emphasis: true);
     return;
   }
   if (result.xcodeBuildExecution != null &&
       result.xcodeBuildExecution.buildForPhysicalDevice &&
       result.xcodeBuildExecution.buildSettings['PRODUCT_BUNDLE_IDENTIFIER']?.contains('com.example') == true) {
-    printError('');
-    printError('It appears that your application still contains the default signing identifier.');
-    printError("Try replacing 'com.example' with your signing id in Xcode:");
-    printError('  open ios/Runner.xcworkspace');
+    globals.printError('');
+    globals.printError('It appears that your application still contains the default signing identifier.');
+    globals.printError("Try replacing 'com.example' with your signing id in Xcode:");
+    globals.printError('  open ios/Runner.xcworkspace');
     return;
   }
   if (result.stdout?.contains('Code Sign error') == true) {
-    printError('');
-    printError('It appears that there was a problem signing your application prior to installation on the device.');
-    printError('');
-    printError('Verify that the Bundle Identifier in your project is your signing id in Xcode');
-    printError('  open ios/Runner.xcworkspace');
-    printError('');
-    printError("Also try selecting 'Product > Build' to fix the problem:");
+    globals.printError('');
+    globals.printError('It appears that there was a problem signing your application prior to installation on the device.');
+    globals.printError('');
+    globals.printError('Verify that the Bundle Identifier in your project is your signing id in Xcode');
+    globals.printError('  open ios/Runner.xcworkspace');
+    globals.printError('');
+    globals.printError("Also try selecting 'Product > Build' to fix the problem:");
     return;
   }
 }
@@ -709,15 +707,15 @@
 const String _xcodeRequirement = 'Xcode $kXcodeRequiredVersionMajor.$kXcodeRequiredVersionMinor or greater is required to develop for iOS.';
 
 bool _checkXcodeVersion() {
-  if (!platform.isMacOS) {
+  if (!globals.platform.isMacOS) {
     return false;
   }
   if (!xcodeProjectInterpreter.isInstalled) {
-    printError('Cannot find "xcodebuild". $_xcodeRequirement');
+    globals.printError('Cannot find "xcodebuild". $_xcodeRequirement');
     return false;
   }
   if (!xcode.isVersionSatisfactory) {
-    printError('Found "${xcodeProjectInterpreter.versionText}". $_xcodeRequirement');
+    globals.printError('Found "${xcodeProjectInterpreter.versionText}". $_xcodeRequirement');
     return false;
   }
   return true;
@@ -736,7 +734,7 @@
     final Match match = oldAssets.firstMatch(line);
     if (match != null) {
       if (printedStatuses.add(match.group(1))) {
-        printStatus('Removing obsolete reference to ${match.group(1)} from ${project.hostAppBundleName}');
+        globals.printStatus('Removing obsolete reference to ${match.group(1)} from ${project.hostAppBundleName}');
       }
     } else {
       buffer.writeln(line);
diff --git a/packages/flutter_tools/lib/src/ios/plist_parser.dart b/packages/flutter_tools/lib/src/ios/plist_parser.dart
index 40d6d1e..8a2bcf3 100644
--- a/packages/flutter_tools/lib/src/ios/plist_parser.dart
+++ b/packages/flutter_tools/lib/src/ios/plist_parser.dart
@@ -8,7 +8,7 @@
 import '../base/process.dart';
 import '../base/utils.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 class PlistParser {
   const PlistParser();
@@ -29,14 +29,14 @@
   Map<String, dynamic> parseFile(String plistFilePath) {
     assert(plistFilePath != null);
     const String executable = '/usr/bin/plutil';
-    if (!fs.isFileSync(executable)) {
+    if (!globals.fs.isFileSync(executable)) {
       throw const FileNotFoundException(executable);
     }
-    if (!fs.isFileSync(plistFilePath)) {
+    if (!globals.fs.isFileSync(plistFilePath)) {
       return const <String, dynamic>{};
     }
 
-    final String normalizedPlistPath = fs.path.absolute(plistFilePath);
+    final String normalizedPlistPath = globals.fs.path.absolute(plistFilePath);
 
     try {
       final List<String> args = <String>[
@@ -48,7 +48,7 @@
       ).stdout.trim();
       return castStringKeyedMap(json.decode(jsonContent));
     } on ProcessException catch (error) {
-      printTrace('$error');
+      globals.printTrace('$error');
       return const <String, dynamic>{};
     }
   }
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index 7f24d01..748d1dc 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -12,15 +12,13 @@
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
 import '../bundle.dart';
 import '../convert.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../macos/xcode.dart';
 import '../project.dart';
 import '../protocol_discovery.dart';
@@ -35,7 +33,7 @@
   IOSSimulators() : super('iOS simulators');
 
   @override
-  bool get supportsPlatform => platform.isMacOS;
+  bool get supportsPlatform => globals.platform.isMacOS;
 
   @override
   bool get canListAnything => iosWorkflow.canListDevices;
@@ -86,10 +84,10 @@
     //   "pairs": { ... },
 
     final List<String> command = <String>[_xcrunPath, 'simctl', 'list', '--json', section.name];
-    printTrace(command.join(' '));
-    final ProcessResult results = await processManager.run(command);
+    globals.printTrace(command.join(' '));
+    final ProcessResult results = await globals.processManager.run(command);
     if (results.exitCode != 0) {
-      printError('Error executing simctl: ${results.exitCode}\n${results.stderr}');
+      globals.printError('Error executing simctl: ${results.exitCode}\n${results.stderr}');
       return <String, Map<String, dynamic>>{};
     }
     try {
@@ -97,13 +95,13 @@
       if (decodeResult is Map<String, dynamic>) {
         return decodeResult;
       }
-      printError('simctl returned unexpected JSON response: ${results.stdout}');
+      globals.printError('simctl returned unexpected JSON response: ${results.stdout}');
       return <String, dynamic>{};
     } on FormatException {
       // We failed to parse the simctl output, or it returned junk.
       // One known message is "Install Started" isn't valid JSON but is
       // returned sometimes.
-      printError('simctl returned non-JSON response: ${results.stdout}');
+      globals.printError('simctl returned non-JSON response: ${results.stdout}');
       return <String, dynamic>{};
     }
   }
@@ -278,7 +276,7 @@
   Map<ApplicationPackage, _IOSSimulatorLogReader> _logReaders;
   _IOSSimulatorDevicePortForwarder _portForwarder;
 
-  String get xcrunPath => fs.path.join('/usr', 'bin', 'xcrun');
+  String get xcrunPath => globals.fs.path.join('/usr', 'bin', 'xcrun');
 
   @override
   Future<bool> isAppInstalled(ApplicationPackage app) {
@@ -311,7 +309,7 @@
 
   @override
   bool isSupported() {
-    if (!platform.isMacOS) {
+    if (!globals.platform.isMacOS) {
       _supportMessage = 'iOS devices require a Mac host machine.';
       return false;
     }
@@ -348,12 +346,12 @@
     bool ipv6 = false,
   }) async {
     if (!prebuiltApplication && package is BuildableIOSApp) {
-      printTrace('Building ${package.name} for $id.');
+      globals.printTrace('Building ${package.name} for $id.');
 
       try {
         await _setupUpdatedApplicationBundle(package, debuggingOptions.buildInfo, mainPath);
       } on ToolExit catch (e) {
-        printError(e.message);
+        globals.printError(e.message);
         return LaunchResult.failed();
       }
     } else {
@@ -394,12 +392,12 @@
       // which should always yield the correct value and does not require
       // parsing the xcodeproj or configuration files.
       // See https://github.com/flutter/flutter/issues/31037 for more information.
-      final String plistPath = fs.path.join(package.simulatorBundlePath, 'Info.plist');
+      final String plistPath = globals.fs.path.join(package.simulatorBundlePath, 'Info.plist');
       final String bundleIdentifier = PlistParser.instance.getValueFromFile(plistPath, PlistParser.kCFBundleIdentifierKey);
 
       await SimControl.instance.launch(id, bundleIdentifier, args);
     } catch (error) {
-      printError('$error');
+      globals.printError('$error');
       return LaunchResult.failed();
     }
 
@@ -409,13 +407,13 @@
 
     // Wait for the service protocol port here. This will complete once the
     // device has printed "Observatory is listening on..."
-    printTrace('Waiting for observatory port to be available...');
+    globals.printTrace('Waiting for observatory port to be available...');
 
     try {
       final Uri deviceUri = await observatoryDiscovery.uri;
       return LaunchResult.succeeded(observatoryUri: deviceUri);
     } catch (error) {
-      printError('Error waiting for a debug connection: $error');
+      globals.printError('Error waiting for a debug connection: $error');
       return LaunchResult.failed();
     } finally {
       await observatoryDiscovery.cancel();
@@ -444,14 +442,14 @@
     }
 
     // Step 2: Assert that the Xcode project was successfully built.
-    final Directory bundle = fs.directory(app.simulatorBundlePath);
+    final Directory bundle = globals.fs.directory(app.simulatorBundlePath);
     final bool bundleExists = bundle.existsSync();
     if (!bundleExists) {
       throwToolExit('Could not find the built application bundle at ${bundle.path}.');
     }
 
     // Step 3: Install the updated bundle to the simulator.
-    await SimControl.instance.install(id, fs.path.absolute(bundle.path));
+    await SimControl.instance.install(id, globals.fs.path.absolute(bundle.path));
   }
 
   @visibleForTesting
@@ -473,9 +471,9 @@
   }
 
   String get logFilePath {
-    return platform.environment.containsKey('IOS_SIMULATOR_LOG_FILE_PATH')
-        ? platform.environment['IOS_SIMULATOR_LOG_FILE_PATH'].replaceAll('%{id}', id)
-        : fs.path.join(homeDirPath, 'Library', 'Logs', 'CoreSimulator', id, 'system.log');
+    return globals.platform.environment.containsKey('IOS_SIMULATOR_LOG_FILE_PATH')
+        ? globals.platform.environment['IOS_SIMULATOR_LOG_FILE_PATH'].replaceAll('%{id}', id)
+        : globals.fs.path.join(homeDirPath, 'Library', 'Logs', 'CoreSimulator', id, 'system.log');
   }
 
   @override
@@ -503,7 +501,7 @@
 
   @override
   void clearLogs() {
-    final File logFile = fs.file(logFilePath);
+    final File logFile = globals.fs.file(logFilePath);
     if (logFile.existsSync()) {
       final RandomAccessFile randomFile = logFile.openSync(mode: FileMode.write);
       randomFile.truncateSync(0);
@@ -513,7 +511,7 @@
 
   Future<void> ensureLogsExists() async {
     if (await sdkMajorVersion < 11) {
-      final File logFile = fs.file(logFilePath);
+      final File logFile = globals.fs.file(logFilePath);
       if (!logFile.existsSync()) {
         logFile.writeAsBytesSync(<int>[]);
       }
@@ -689,7 +687,7 @@
   String _lastLine;
 
   void _onDeviceLine(String line) {
-    printTrace('[DEVICE LOG] $line');
+    globals.printTrace('[DEVICE LOG] $line');
     final Match multi = _lastMessageMultipleRegex.matchAsPrefix(line);
 
     if (multi != null) {
@@ -714,7 +712,7 @@
   }
 
   void _onSystemLine(String line) {
-    printTrace('[SYS LOG] $line');
+    globals.printTrace('[SYS LOG] $line');
     if (!_flutterRunnerRegex.hasMatch(line)) {
       return;
     }
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index 37907ba..ff966cb 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -13,13 +13,12 @@
 import '../base/io.dart';
 import '../base/logger.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
 import '../cache.dart';
 import '../flutter_manifest.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 
@@ -27,12 +26,12 @@
 final RegExp _varExpr = RegExp(r'\$\(([^)]*)\)');
 
 String flutterFrameworkDir(BuildMode mode) {
-  return fs.path.normalize(fs.path.dirname(artifacts.getArtifactPath(
+  return globals.fs.path.normalize(globals.fs.path.dirname(globals.artifacts.getArtifactPath(
       Artifact.flutterFramework, platform: TargetPlatform.ios, mode: mode)));
 }
 
 String flutterMacOSFrameworkDir(BuildMode mode) {
-  return fs.path.normalize(fs.path.dirname(artifacts.getArtifactPath(
+  return globals.fs.path.normalize(globals.fs.path.dirname(globals.artifacts.getArtifactPath(
       Artifact.flutterMacOSFramework, platform: TargetPlatform.darwin_x64, mode: mode)));
 }
 
@@ -155,11 +154,11 @@
 }) {
   final List<String> xcodeBuildSettings = <String>[];
 
-  final String flutterRoot = fs.path.normalize(Cache.flutterRoot);
+  final String flutterRoot = globals.fs.path.normalize(Cache.flutterRoot);
   xcodeBuildSettings.add('FLUTTER_ROOT=$flutterRoot');
 
   // This holds because requiresProjectRoot is true for this command
-  xcodeBuildSettings.add('FLUTTER_APPLICATION_PATH=${fs.path.normalize(project.directory.path)}');
+  xcodeBuildSettings.add('FLUTTER_APPLICATION_PATH=${globals.fs.path.normalize(project.directory.path)}');
 
   // Relative to FLUTTER_APPLICATION_PATH, which is [Directory.current].
   if (targetOverride != null) {
@@ -191,11 +190,11 @@
   final String buildNumber = parsedBuildNumber(manifest: project.manifest, buildInfo: buildInfo) ?? '1';
   xcodeBuildSettings.add('FLUTTER_BUILD_NUMBER=$buildNumber');
 
-  if (artifacts is LocalEngineArtifacts) {
-    final LocalEngineArtifacts localEngineArtifacts = artifacts as LocalEngineArtifacts;
+  if (globals.artifacts is LocalEngineArtifacts) {
+    final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
     final String engineOutPath = localEngineArtifacts.engineOutPath;
-    xcodeBuildSettings.add('FLUTTER_ENGINE=${fs.path.dirname(fs.path.dirname(engineOutPath))}');
-    xcodeBuildSettings.add('LOCAL_ENGINE=${fs.path.basename(engineOutPath)}');
+    xcodeBuildSettings.add('FLUTTER_ENGINE=${globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath))}');
+    xcodeBuildSettings.add('LOCAL_ENGINE=${globals.fs.path.basename(engineOutPath)}');
 
     // Tell Xcode not to build universal binaries for local engines, which are
     // single-architecture.
@@ -226,7 +225,7 @@
   static final RegExp _versionRegex = RegExp(r'Xcode ([0-9.]+)');
 
   void _updateVersion() {
-    if (!platform.isMacOS || !fs.file(_executable).existsSync()) {
+    if (!globals.platform.isMacOS || !globals.fs.file(_executable).existsSync()) {
       return;
     }
     try {
@@ -289,7 +288,7 @@
     final List<String> showBuildSettingsCommand = <String>[
       _executable,
       '-project',
-      fs.path.absolute(projectPath),
+      globals.fs.path.absolute(projectPath),
       '-target',
       target,
       '-showBuildSettings',
@@ -314,7 +313,7 @@
           command: showBuildSettingsCommand.join(' '),
         ).send();
       }
-      printTrace('Unexpected failure to get the build settings: $error.');
+      globals.printTrace('Unexpected failure to get the build settings: $error.');
       return const <String, String>{};
     } finally {
       status.stop();
@@ -331,7 +330,7 @@
       '-quiet',
       'clean',
       ...environmentVariablesAsXcodeBuildSettings()
-    ], workingDirectory: fs.currentDirectory.path);
+    ], workingDirectory: globals.fs.currentDirectory.path);
   }
 
   Future<XcodeProjectInfo> getInfo(String projectPath, {String projectFilename}) async {
@@ -362,7 +361,7 @@
 /// environment without requiring settings changes in the Xcode project.
 List<String> environmentVariablesAsXcodeBuildSettings() {
   const String xcodeBuildSettingPrefix = 'FLUTTER_XCODE_';
-  return platform.environment.entries.where((MapEntry<String, String> mapEntry) {
+  return globals.platform.environment.entries.where((MapEntry<String, String> mapEntry) {
     return mapEntry.key.startsWith(xcodeBuildSettingPrefix);
   }).expand<String>((MapEntry<String, String> mapEntry) {
     // Remove FLUTTER_XCODE_ prefix from the environment variable to get the build setting.
diff --git a/packages/flutter_tools/lib/src/linux/application_package.dart b/packages/flutter_tools/lib/src/linux/application_package.dart
index 398836b..13568eb 100644
--- a/packages/flutter_tools/lib/src/linux/application_package.dart
+++ b/packages/flutter_tools/lib/src/linux/application_package.dart
@@ -7,6 +7,7 @@
 import '../application_package.dart';
 import '../base/file_system.dart';
 import '../build_info.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import 'makefile.dart';
 
@@ -58,7 +59,7 @@
   @override
   String executable(BuildMode buildMode) {
     final String binaryName = makefileExecutableName(project);
-    return fs.path.join(getLinuxBuildDirectory(), getNameForBuildMode(buildMode), binaryName);
+    return globals.fs.path.join(getLinuxBuildDirectory(), getNameForBuildMode(buildMode), binaryName);
   }
 
   @override
diff --git a/packages/flutter_tools/lib/src/linux/build_linux.dart b/packages/flutter_tools/lib/src/linux/build_linux.dart
index 817c4e6..92e896a 100644
--- a/packages/flutter_tools/lib/src/linux/build_linux.dart
+++ b/packages/flutter_tools/lib/src/linux/build_linux.dart
@@ -4,12 +4,11 @@
 
 import '../artifacts.dart';
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../base/logger.dart';
 import '../base/process.dart';
 import '../build_info.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 
@@ -22,11 +21,11 @@
 export FLUTTER_TARGET=$target
 export PROJECT_DIR=${linuxProject.project.directory.path}
 ''');
-  if (artifacts is LocalEngineArtifacts) {
-    final LocalEngineArtifacts localEngineArtifacts = artifacts as LocalEngineArtifacts;
+  if (globals.artifacts is LocalEngineArtifacts) {
+    final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
     final String engineOutPath = localEngineArtifacts.engineOutPath;
-    buffer.writeln('export FLUTTER_ENGINE=${fs.path.dirname(fs.path.dirname(engineOutPath))}');
-    buffer.writeln('export LOCAL_ENGINE=${fs.path.basename(engineOutPath)}');
+    buffer.writeln('export FLUTTER_ENGINE=${globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath))}');
+    buffer.writeln('export LOCAL_ENGINE=${globals.fs.path.basename(engineOutPath)}');
   }
 
   /// Cache flutter configuration files in the linux directory.
@@ -36,17 +35,17 @@
 
   if (!buildInfo.isDebug) {
     const String warning = '🚧 ';
-    printStatus(warning * 20);
-    printStatus('Warning: Only debug is currently implemented for Linux. This is effectively a debug build.');
-    printStatus('See https://github.com/flutter/flutter/issues/38478 for details and updates.');
-    printStatus(warning * 20);
-    printStatus('');
+    globals.printStatus(warning * 20);
+    globals.printStatus('Warning: Only debug is currently implemented for Linux. This is effectively a debug build.');
+    globals.printStatus('See https://github.com/flutter/flutter/issues/38478 for details and updates.');
+    globals.printStatus(warning * 20);
+    globals.printStatus('');
   }
 
   // Invoke make.
   final String buildFlag = getNameForBuildMode(buildInfo.mode ?? BuildMode.release);
   final Stopwatch sw = Stopwatch()..start();
-  final Status status = logger.startProgress(
+  final Status status = globals.logger.startProgress(
     'Building Linux application...',
     timeout: null,
   );
diff --git a/packages/flutter_tools/lib/src/linux/linux_device.dart b/packages/flutter_tools/lib/src/linux/linux_device.dart
index 97a899e..2ab1b61 100644
--- a/packages/flutter_tools/lib/src/linux/linux_device.dart
+++ b/packages/flutter_tools/lib/src/linux/linux_device.dart
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '../base/platform.dart';
 import '../build_info.dart';
 import '../desktop_device.dart';
 import '../device.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import 'application_package.dart';
 import 'build_linux.dart';
@@ -56,7 +56,7 @@
   LinuxDevices() : super('linux devices');
 
   @override
-  bool get supportsPlatform => platform.isLinux;
+  bool get supportsPlatform => globals.platform.isLinux;
 
   @override
   bool get canListAnything => linuxWorkflow.canListDevices;
diff --git a/packages/flutter_tools/lib/src/linux/linux_doctor.dart b/packages/flutter_tools/lib/src/linux/linux_doctor.dart
index 6f45a93..2d5665b 100644
--- a/packages/flutter_tools/lib/src/linux/linux_doctor.dart
+++ b/packages/flutter_tools/lib/src/linux/linux_doctor.dart
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 import '../base/io.dart';
-import '../base/process_manager.dart';
 import '../base/version.dart';
 import '../doctor.dart';
+import '../globals.dart' as globals;
 
 /// A validator that checks for Clang and Make build dependencies
 class LinuxDoctorValidator extends DoctorValidator {
@@ -21,7 +21,7 @@
     /// Check for a minimum version of Clang.
     ProcessResult clangResult;
     try {
-      clangResult = await processManager.run(const <String>[
+      clangResult = await globals.processManager.run(const <String>[
         'clang++',
         '--version',
       ]);
@@ -48,7 +48,7 @@
     // a better idea about what is supported.
     ProcessResult makeResult;
     try {
-      makeResult = await processManager.run(const <String>[
+      makeResult = await globals.processManager.run(const <String>[
         'make',
         '--version',
       ]);
diff --git a/packages/flutter_tools/lib/src/linux/linux_workflow.dart b/packages/flutter_tools/lib/src/linux/linux_workflow.dart
index 964263b..11423d3 100644
--- a/packages/flutter_tools/lib/src/linux/linux_workflow.dart
+++ b/packages/flutter_tools/lib/src/linux/linux_workflow.dart
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 import '../base/context.dart';
-import '../base/platform.dart';
 import '../doctor.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 
 /// The [WindowsWorkflow] instance.
 LinuxWorkflow get linuxWorkflow => context.get<LinuxWorkflow>();
@@ -18,13 +18,13 @@
   const LinuxWorkflow();
 
   @override
-  bool get appliesToHostPlatform => platform.isLinux && featureFlags.isLinuxEnabled;
+  bool get appliesToHostPlatform => globals.platform.isLinux && featureFlags.isLinuxEnabled;
 
   @override
-  bool get canLaunchDevices => platform.isLinux && featureFlags.isLinuxEnabled;
+  bool get canLaunchDevices => globals.platform.isLinux && featureFlags.isLinuxEnabled;
 
   @override
-  bool get canListDevices => platform.isLinux && featureFlags.isLinuxEnabled;
+  bool get canListDevices => globals.platform.isLinux && featureFlags.isLinuxEnabled;
 
   @override
   bool get canListEmulators => false;
diff --git a/packages/flutter_tools/lib/src/macos/application_package.dart b/packages/flutter_tools/lib/src/macos/application_package.dart
index 5727363..5b820fd 100644
--- a/packages/flutter_tools/lib/src/macos/application_package.dart
+++ b/packages/flutter_tools/lib/src/macos/application_package.dart
@@ -8,7 +8,7 @@
 import '../base/file_system.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../ios/plist_parser.dart';
 import '../project.dart';
 
@@ -33,7 +33,7 @@
   /// port over stdout.
   factory MacOSApp.fromPrebuiltApp(FileSystemEntity applicationBinary) {
     final _ExecutableAndId executableAndId = _executableFromBundle(applicationBinary);
-    final Directory applicationBundle = fs.directory(applicationBinary);
+    final Directory applicationBundle = globals.fs.directory(applicationBinary);
     return PrebuiltMacOSApp(
       bundleDir: applicationBundle,
       bundleName: applicationBundle.path,
@@ -44,38 +44,38 @@
 
   /// Look up the executable name for a macOS application bundle.
   static _ExecutableAndId _executableFromBundle(FileSystemEntity applicationBundle) {
-    final FileSystemEntityType entityType = fs.typeSync(applicationBundle.path);
+    final FileSystemEntityType entityType = globals.fs.typeSync(applicationBundle.path);
     if (entityType == FileSystemEntityType.notFound) {
-      printError('File "${applicationBundle.path}" does not exist.');
+      globals.printError('File "${applicationBundle.path}" does not exist.');
       return null;
     }
     Directory bundleDir;
     if (entityType == FileSystemEntityType.directory) {
-      final Directory directory = fs.directory(applicationBundle);
+      final Directory directory = globals.fs.directory(applicationBundle);
       if (!_isBundleDirectory(directory)) {
-        printError('Folder "${applicationBundle.path}" is not an app bundle.');
+        globals.printError('Folder "${applicationBundle.path}" is not an app bundle.');
         return null;
       }
-      bundleDir = fs.directory(applicationBundle);
+      bundleDir = globals.fs.directory(applicationBundle);
     } else {
-      printError('Folder "${applicationBundle.path}" is not an app bundle.');
+      globals.printError('Folder "${applicationBundle.path}" is not an app bundle.');
       return null;
     }
-    final String plistPath = fs.path.join(bundleDir.path, 'Contents', 'Info.plist');
-    if (!fs.file(plistPath).existsSync()) {
-      printError('Invalid prebuilt macOS app. Does not contain Info.plist.');
+    final String plistPath = globals.fs.path.join(bundleDir.path, 'Contents', 'Info.plist');
+    if (!globals.fs.file(plistPath).existsSync()) {
+      globals.printError('Invalid prebuilt macOS app. Does not contain Info.plist.');
       return null;
     }
     final Map<String, dynamic> propertyValues = PlistParser.instance.parseFile(plistPath);
     final String id = propertyValues[PlistParser.kCFBundleIdentifierKey] as String;
     final String executableName = propertyValues[PlistParser.kCFBundleExecutable] as String;
     if (id == null) {
-      printError('Invalid prebuilt macOS app. Info.plist does not contain bundle identifier');
+      globals.printError('Invalid prebuilt macOS app. Info.plist does not contain bundle identifier');
       return null;
     }
-    final String executable = fs.path.join(bundleDir.path, 'Contents', 'MacOS', executableName);
-    if (!fs.file(executable).existsSync()) {
-      printError('Could not find macOS binary at $executable');
+    final String executable = globals.fs.path.join(bundleDir.path, 'Contents', 'MacOS', executableName);
+    if (!globals.fs.file(executable).existsSync()) {
+      globals.printError('Could not find macOS binary at $executable');
     }
     return _ExecutableAndId(executable, id);
   }
@@ -125,10 +125,10 @@
   String applicationBundle(BuildMode buildMode) {
     final File appBundleNameFile = project.nameFile;
     if (!appBundleNameFile.existsSync()) {
-      printError('Unable to find app name. ${appBundleNameFile.path} does not exist');
+      globals.printError('Unable to find app name. ${appBundleNameFile.path} does not exist');
       return null;
     }
-    return fs.path.join(
+    return globals.fs.path.join(
         getMacOSBuildDirectory(),
         'Build',
         'Products',
@@ -142,7 +142,7 @@
     if (directory == null) {
       return null;
     }
-    final _ExecutableAndId executableAndId = MacOSApp._executableFromBundle(fs.directory(directory));
+    final _ExecutableAndId executableAndId = MacOSApp._executableFromBundle(globals.fs.directory(directory));
     return executableAndId?.executable;
   }
 }
diff --git a/packages/flutter_tools/lib/src/macos/build_macos.dart b/packages/flutter_tools/lib/src/macos/build_macos.dart
index 40e3f99..da6de5e 100644
--- a/packages/flutter_tools/lib/src/macos/build_macos.dart
+++ b/packages/flutter_tools/lib/src/macos/build_macos.dart
@@ -7,7 +7,7 @@
 import '../base/logger.dart';
 import '../base/process.dart';
 import '../build_info.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../ios/xcodeproj.dart';
 import '../project.dart';
 import '../reporting/reporting.dart';
@@ -20,7 +20,7 @@
   BuildInfo buildInfo,
   String targetOverride,
 }) async {
-  final Directory flutterBuildDir = fs.directory(getMacOSBuildDirectory());
+  final Directory flutterBuildDir = globals.fs.directory(getMacOSBuildDirectory());
   if (!flutterBuildDir.existsSync()) {
     flutterBuildDir.createSync(recursive: true);
   }
@@ -62,7 +62,7 @@
 
   // Run the Xcode build.
   final Stopwatch sw = Stopwatch()..start();
-  final Status status = logger.startProgress(
+  final Status status = globals.logger.startProgress(
     'Building macOS application...',
     timeout: null,
   );
@@ -76,8 +76,8 @@
       '-configuration', '$configuration',
       '-scheme', 'Runner',
       '-derivedDataPath', flutterBuildDir.absolute.path,
-      'OBJROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Intermediates.noindex')}',
-      'SYMROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Products')}',
+      'OBJROOT=${globals.fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Intermediates.noindex')}',
+      'SYMROOT=${globals.fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Products')}',
       'COMPILER_INDEX_STORE_ENABLE=NO',
       ...environmentVariablesAsXcodeBuildSettings()
     ], trace: true);
diff --git a/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart b/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart
index 5c673d6..8fc4169 100644
--- a/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart
+++ b/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart
@@ -4,9 +4,9 @@
 
 import 'dart:async';
 
-import '../base/file_system.dart';
 import '../base/fingerprint.dart';
 import '../build_info.dart';
+import '../globals.dart' as globals;
 import '../ios/xcodeproj.dart';
 import '../plugins.dart';
 import '../project.dart';
@@ -24,7 +24,7 @@
   // If the Xcode project, Podfile, or generated xcconfig have changed since
   // last run, pods should be updated.
   final Fingerprinter fingerprinter = Fingerprinter(
-    fingerprintPath: fs.path.join(buildDirectory, 'pod_inputs.fingerprint'),
+    fingerprintPath: globals.fs.path.join(buildDirectory, 'pod_inputs.fingerprint'),
     paths: <String>[
       xcodeProject.xcodeProjectInfoFile.path,
       xcodeProject.podfile.path,
diff --git a/packages/flutter_tools/lib/src/macos/cocoapods.dart b/packages/flutter_tools/lib/src/macos/cocoapods.dart
index ca29dee..e0ba702 100644
--- a/packages/flutter_tools/lib/src/macos/cocoapods.dart
+++ b/packages/flutter_tools/lib/src/macos/cocoapods.dart
@@ -12,12 +12,10 @@
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/logger.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
-import '../base/process_manager.dart';
 import '../base/version.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../ios/xcodeproj.dart';
 import '../project.dart';
 
@@ -130,8 +128,9 @@
     if (installedVersion != null && installedVersion >= Version.parse('1.8.0')) {
       return true;
     }
-    final String cocoapodsReposDir = platform.environment['CP_REPOS_DIR'] ?? fs.path.join(homeDirPath, '.cocoapods', 'repos');
-    return fs.isDirectory(fs.path.join(cocoapodsReposDir, 'master'));
+    final String cocoapodsReposDir = globals.platform.environment['CP_REPOS_DIR']
+      ?? globals.fs.path.join(homeDirPath, '.cocoapods', 'repos');
+    return globals.fs.isDirectory(globals.fs.path.join(cocoapodsReposDir, 'master'));
   }
 
   Future<bool> processPods({
@@ -159,7 +158,7 @@
     final CocoaPodsStatus installation = await evaluateCocoaPodsInstallation;
     switch (installation) {
       case CocoaPodsStatus.notInstalled:
-        printError(
+        globals.printError(
           'Warning: CocoaPods not installed. Skipping pod install.\n'
           '$noCocoaPodsConsequence\n'
           'To install:\n'
@@ -168,7 +167,7 @@
         );
         return false;
       case CocoaPodsStatus.unknownVersion:
-        printError(
+        globals.printError(
           'Warning: Unknown CocoaPods version installed.\n'
           '$unknownCocoaPodsConsequence\n'
           'To upgrade:\n'
@@ -177,7 +176,7 @@
         );
         break;
       case CocoaPodsStatus.belowMinimumVersion:
-        printError(
+        globals.printError(
           'Warning: CocoaPods minimum required version $cocoaPodsMinimumVersion or greater not installed. Skipping pod install.\n'
           '$noCocoaPodsConsequence\n'
           'To upgrade:\n'
@@ -186,7 +185,7 @@
         );
         return false;
       case CocoaPodsStatus.belowRecommendedVersion:
-        printError(
+        globals.printError(
           'Warning: CocoaPods recommended version $cocoaPodsRecommendedVersion or greater not installed.\n'
           'Pods handling may fail on some projects involving plugins.\n'
           'To upgrade:\n'
@@ -198,7 +197,7 @@
         break;
     }
     if (!await isCocoaPodsInitialized) {
-      printError(
+      globals.printError(
         'Warning: CocoaPods installed but not initialized. Skipping pod install.\n'
         '$noCocoaPodsConsequence\n'
         'To initialize CocoaPods, run:\n'
@@ -239,7 +238,7 @@
       )).containsKey('SWIFT_VERSION');
       podfileTemplateName = isSwift ? 'Podfile-ios-swift' : 'Podfile-ios-objc';
     }
-    final File podfileTemplate = fs.file(fs.path.join(
+    final File podfileTemplate = globals.fs.file(globals.fs.path.join(
       Cache.flutterRoot,
       'packages',
       'flutter_tools',
@@ -300,10 +299,10 @@
   }
 
   Future<void> _runPodInstall(XcodeBasedProject xcodeProject, String engineDirectory) async {
-    final Status status = logger.startProgress('Running pod install...', timeout: timeoutConfiguration.slowOperation);
-    final ProcessResult result = await processManager.run(
+    final Status status = globals.logger.startProgress('Running pod install...', timeout: timeoutConfiguration.slowOperation);
+    final ProcessResult result = await globals.processManager.run(
       <String>['pod', 'install', '--verbose'],
-      workingDirectory: fs.path.dirname(xcodeProject.podfile.path),
+      workingDirectory: globals.fs.path.dirname(xcodeProject.podfile.path),
       environment: <String, String>{
         'FLUTTER_FRAMEWORK_DIR': engineDirectory,
         // See https://github.com/flutter/flutter/issues/10873.
@@ -313,16 +312,16 @@
       },
     );
     status.stop();
-    if (logger.isVerbose || result.exitCode != 0) {
+    if (globals.logger.isVerbose || result.exitCode != 0) {
       final String stdout = result.stdout as String;
       if (stdout.isNotEmpty) {
-        printStatus('CocoaPods\' output:\n↳');
-        printStatus(stdout, indent: 4);
+        globals.printStatus('CocoaPods\' output:\n↳');
+        globals.printStatus(stdout, indent: 4);
       }
       final String stderr = result.stderr as String;
       if (stderr.isNotEmpty) {
-        printStatus('Error output from CocoaPods:\n↳');
-        printStatus(stderr, indent: 4);
+        globals.printStatus('Error output from CocoaPods:\n↳');
+        globals.printStatus(stderr, indent: 4);
       }
     }
     if (result.exitCode != 0) {
@@ -335,7 +334,7 @@
   void _diagnosePodInstallFailure(ProcessResult result) {
     final dynamic stdout = result.stdout;
     if (stdout is String && stdout.contains('out-of-date source repos')) {
-      printError(
+      globals.printError(
         "Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.\n"
         'To update the CocoaPods specs, run:\n'
         '  pod repo update\n',
@@ -355,12 +354,12 @@
     if (xcodeProject is! IosProject) {
       return;
     }
-    final Link flutterSymlink = fs.link(fs.path.join(
+    final Link flutterSymlink = globals.fs.link(globals.fs.path.join(
       xcodeProject.symlinks.path,
       'flutter',
     ));
     if (flutterSymlink.existsSync()) {
-      printError(
+      globals.printError(
         'Warning: Podfile is out of date\n'
         '$outOfDatePodfileConsequence\n'
         'To regenerate the Podfile, run:\n'
diff --git a/packages/flutter_tools/lib/src/macos/macos_device.dart b/packages/flutter_tools/lib/src/macos/macos_device.dart
index bbdceaa..d0448d2 100644
--- a/packages/flutter_tools/lib/src/macos/macos_device.dart
+++ b/packages/flutter_tools/lib/src/macos/macos_device.dart
@@ -3,11 +3,10 @@
 // found in the LICENSE file.
 
 import '../base/io.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
 import '../build_info.dart';
 import '../desktop_device.dart';
 import '../device.dart';
+import '../globals.dart' as globals;
 import '../macos/application_package.dart';
 import '../project.dart';
 import 'build_macos.dart';
@@ -59,7 +58,7 @@
     // than post-attach, since this won't run for release builds, but there's
     // no general-purpose way of knowing when a process is far enoug along in
     // the launch process for 'open' to foreground it.
-    processManager.run(<String>[
+    globals.processManager.run(<String>[
       'open', package.applicationBundle(buildMode),
     ]).then((ProcessResult result) {
       if (result.exitCode != 0) {
@@ -73,7 +72,7 @@
   MacOSDevices() : super('macOS devices');
 
   @override
-  bool get supportsPlatform => platform.isMacOS;
+  bool get supportsPlatform => globals.platform.isMacOS;
 
   @override
   bool get canListAnything => macOSWorkflow.canListDevices;
diff --git a/packages/flutter_tools/lib/src/macos/macos_workflow.dart b/packages/flutter_tools/lib/src/macos/macos_workflow.dart
index 2d5d4a5..0ae1ae4 100644
--- a/packages/flutter_tools/lib/src/macos/macos_workflow.dart
+++ b/packages/flutter_tools/lib/src/macos/macos_workflow.dart
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 import '../base/context.dart';
-import '../base/platform.dart';
 import '../doctor.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 
 /// The [MacOSWorkflow] instance.
 MacOSWorkflow get macOSWorkflow => context.get<MacOSWorkflow>();
@@ -18,13 +18,13 @@
   const MacOSWorkflow();
 
   @override
-  bool get appliesToHostPlatform => platform.isMacOS && featureFlags.isMacOSEnabled;
+  bool get appliesToHostPlatform => globals.platform.isMacOS && featureFlags.isMacOSEnabled;
 
   @override
-  bool get canLaunchDevices => platform.isMacOS && featureFlags.isMacOSEnabled;
+  bool get canLaunchDevices => globals.platform.isMacOS && featureFlags.isMacOSEnabled;
 
   @override
-  bool get canListDevices => platform.isMacOS && featureFlags.isMacOSEnabled;
+  bool get canListDevices => globals.platform.isMacOS && featureFlags.isMacOSEnabled;
 
   @override
   bool get canListEmulators => false;
diff --git a/packages/flutter_tools/lib/src/macos/xcode.dart b/packages/flutter_tools/lib/src/macos/xcode.dart
index 6c40ce8..51c9f71 100644
--- a/packages/flutter_tools/lib/src/macos/xcode.dart
+++ b/packages/flutter_tools/lib/src/macos/xcode.dart
@@ -6,10 +6,9 @@
 
 import '../base/common.dart';
 import '../base/context.dart';
-import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
+import '../globals.dart' as globals;
 import '../ios/xcodeproj.dart';
 
 const int kXcodeRequiredVersionMajor = 10;
@@ -43,7 +42,7 @@
 }
 
 class Xcode {
-  bool get isInstalledAndMeetsVersionCheck => platform.isMacOS && isInstalled && isVersionSatisfactory;
+  bool get isInstalledAndMeetsVersionCheck => globals.platform.isMacOS && isInstalled && isVersionSatisfactory;
 
   String _xcodeSelectPath;
   String get xcodeSelectPath {
@@ -159,10 +158,10 @@
       return null;
     }
     final List<String> searchPaths = <String>[
-      fs.path.join(xcodeSelectPath, 'Applications', 'Simulator.app'),
+      globals.fs.path.join(xcodeSelectPath, 'Applications', 'Simulator.app'),
     ];
     return searchPaths.where((String p) => p != null).firstWhere(
-      (String p) => fs.directory(p).existsSync(),
+      (String p) => globals.fs.directory(p).existsSync(),
       orElse: () => null,
     );
   }
diff --git a/packages/flutter_tools/lib/src/mdns_discovery.dart b/packages/flutter_tools/lib/src/mdns_discovery.dart
index 3ee58c7..033e097 100644
--- a/packages/flutter_tools/lib/src/mdns_discovery.dart
+++ b/packages/flutter_tools/lib/src/mdns_discovery.dart
@@ -12,7 +12,7 @@
 import 'base/io.dart';
 import 'build_info.dart';
 import 'device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'reporting/reporting.dart';
 
 /// A wrapper around [MDnsClient] to find a Dart observatory instance.
@@ -54,7 +54,7 @@
   /// the Observatory instance is for.
   // TODO(jonahwilliams): use `deviceVmservicePort` to filter mdns results.
   Future<MDnsObservatoryDiscoveryResult> query({String applicationId, int deviceVmservicePort}) async {
-    printTrace('Checking for advertised Dart observatories...');
+    globals.printTrace('Checking for advertised Dart observatories...');
     try {
       await client.start();
       final List<PtrResourceRecord> pointerRecords = await client
@@ -63,7 +63,7 @@
           )
           .toList();
       if (pointerRecords.isEmpty) {
-        printTrace('No pointer records found.');
+        globals. printTrace('No pointer records found.');
         return null;
       }
       // We have no guarantee that we won't get multiple hits from the same
@@ -96,7 +96,7 @@
       } else {
         domainName = pointerRecords[0].domainName;
       }
-      printTrace('Checking for available port on $domainName');
+      globals.printTrace('Checking for available port on $domainName');
       // Here, if we get more than one, it should just be a duplicate.
       final List<SrvResourceRecord> srv = await client
           .lookup<SrvResourceRecord>(
@@ -107,10 +107,10 @@
         return null;
       }
       if (srv.length > 1) {
-        printError('Unexpectedly found more than one observatory report for $domainName '
+        globals.printError('Unexpectedly found more than one observatory report for $domainName '
                    '- using first one (${srv.first.port}).');
       }
-      printTrace('Checking for authentication code for $domainName');
+      globals.printTrace('Checking for authentication code for $domainName');
       final List<TxtResourceRecord> txt = await client
         .lookup<TxtResourceRecord>(
             ResourceRecordQuery.text(domainName),
@@ -168,14 +168,14 @@
   // If there's not an ipv4 link local address in `NetworkInterfaces.list`,
   // then request user interventions with a `printError()` if possible.
   Future<void> _checkForIPv4LinkLocal(Device device) async {
-    printTrace(
+    globals.printTrace(
       'mDNS query failed. Checking for an interface with a ipv4 link local address.'
     );
     final List<NetworkInterface> interfaces = await listNetworkInterfaces(
       includeLinkLocal: true,
       type: InternetAddressType.IPv4,
     );
-    if (logger.isVerbose) {
+    if (globals.logger.isVerbose) {
       _logInterfaces(interfaces);
     }
     final bool hasIPv4LinkLocal = interfaces.any(
@@ -184,14 +184,14 @@
       ),
     );
     if (hasIPv4LinkLocal) {
-      printTrace('An interface with an ipv4 link local address was found.');
+      globals.printTrace('An interface with an ipv4 link local address was found.');
       return;
     }
     final TargetPlatform targetPlatform = await device.targetPlatform;
     switch (targetPlatform) {
       case TargetPlatform.ios:
         UsageEvent('ios-mdns', 'no-ipv4-link-local').send();
-        printError(
+        globals.printError(
           'The mDNS query for an attached iOS device failed. It may '
           'be necessary to disable the "Personal Hotspot" on the device, and '
           'to ensure that the "Disable unless needed" setting is unchecked '
@@ -200,18 +200,18 @@
         );
         break;
       default:
-        printTrace('No interface with an ipv4 link local address was found.');
+        globals.printTrace('No interface with an ipv4 link local address was found.');
         break;
     }
   }
 
   void _logInterfaces(List<NetworkInterface> interfaces) {
     for (NetworkInterface interface in interfaces) {
-      if (logger.isVerbose) {
-        printTrace('Found interface "${interface.name}":');
+      if (globals.logger.isVerbose) {
+        globals.printTrace('Found interface "${interface.name}":');
         for (InternetAddress address in interface.addresses) {
           final String linkLocal = address.isLinkLocal ? 'link local' : '';
-          printTrace('\tBound address: "${address.address}" $linkLocal');
+          globals.printTrace('\tBound address: "${address.address}" $linkLocal');
         }
       }
     }
diff --git a/packages/flutter_tools/lib/src/persistent_tool_state.dart b/packages/flutter_tools/lib/src/persistent_tool_state.dart
index dd1c463..181131d 100644
--- a/packages/flutter_tools/lib/src/persistent_tool_state.dart
+++ b/packages/flutter_tools/lib/src/persistent_tool_state.dart
@@ -5,6 +5,7 @@
 import 'base/config.dart';
 import 'base/context.dart';
 import 'base/file_system.dart';
+import 'globals.dart' as globals;
 
 PersistentToolState get persistentToolState => PersistentToolState.instance;
 
@@ -24,7 +25,7 @@
 
 class _DefaultPersistentToolState implements PersistentToolState {
   _DefaultPersistentToolState([File configFile]) :
-    _config = Config(configFile ?? fs.file(fs.path.join(userHomePath(), _kFileName)));
+    _config = Config(configFile ?? globals.fs.file(globals.fs.path.join(userHomePath(), _kFileName)));
 
   static const String _kFileName = '.flutter_tool_state';
   static const String _kRedisplayWelcomeMessage = 'redisplay-welcome-message';
diff --git a/packages/flutter_tools/lib/src/platform_plugins.dart b/packages/flutter_tools/lib/src/platform_plugins.dart
index fd8aeaf..f791c1d 100644
--- a/packages/flutter_tools/lib/src/platform_plugins.dart
+++ b/packages/flutter_tools/lib/src/platform_plugins.dart
@@ -7,6 +7,7 @@
 
 import 'base/common.dart';
 import 'base/file_system.dart';
+import 'globals.dart' as globals;
 
 /// Marker interface for all platform specific plugin config impls.
 abstract class PluginPlatform {
@@ -78,28 +79,28 @@
   Set<String> _getSupportedEmbeddings() {
     assert(pluginPath != null);
     final Set<String> supportedEmbeddings = <String>{};
-    final String baseMainPath = fs.path.join(
+    final String baseMainPath = globals.fs.path.join(
       pluginPath,
       'android',
       'src',
       'main',
     );
-    File mainPluginClass = fs.file(
-      fs.path.join(
+    File mainPluginClass = globals.fs.file(
+      globals.fs.path.join(
         baseMainPath,
         'java',
-        package.replaceAll('.', fs.path.separator),
+        package.replaceAll('.', globals.fs.path.separator),
         '$pluginClass.java',
       )
     );
     // Check if the plugin is implemented in Kotlin since the plugin's pubspec.yaml
     // doesn't include this information.
     if (!mainPluginClass.existsSync()) {
-      mainPluginClass = fs.file(
-        fs.path.join(
+      mainPluginClass = globals.fs.file(
+        globals.fs.path.join(
           baseMainPath,
           'kotlin',
-          package.replaceAll('.', fs.path.separator),
+          package.replaceAll('.', globals.fs.path.separator),
           '$pluginClass.kt',
         )
       );
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index 8d5ed93..22f506b 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -14,7 +14,7 @@
 import 'convert.dart';
 import 'dart/package_map.dart';
 import 'features.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'macos/cocoapods.dart';
 import 'platform_plugins.dart';
 import 'project.dart';
@@ -22,7 +22,7 @@
 void _renderTemplateToFile(String template, dynamic context, String filePath) {
   final String renderedTemplate =
      mustache.Template(template, htmlEscapeValues: false).renderString(context);
-  final File file = fs.file(filePath);
+  final File file = globals.fs.file(filePath);
   file.createSync(recursive: true);
   file.writeAsStringSync(renderedTemplate);
 }
@@ -264,11 +264,11 @@
 }
 
 Plugin _pluginFromPubspec(String name, Uri packageRoot) {
-  final String pubspecPath = fs.path.fromUri(packageRoot.resolve('pubspec.yaml'));
-  if (!fs.isFileSync(pubspecPath)) {
+  final String pubspecPath = globals.fs.path.fromUri(packageRoot.resolve('pubspec.yaml'));
+  if (!globals.fs.isFileSync(pubspecPath)) {
     return null;
   }
-  final dynamic pubspec = loadYaml(fs.file(pubspecPath).readAsStringSync());
+  final dynamic pubspec = loadYaml(globals.fs.file(pubspecPath).readAsStringSync());
   if (pubspec == null) {
     return null;
   }
@@ -276,9 +276,9 @@
   if (flutterConfig == null || !(flutterConfig.containsKey('plugin') as bool)) {
     return null;
   }
-  final String packageRootPath = fs.path.fromUri(packageRoot);
+  final String packageRootPath = globals.fs.path.fromUri(packageRoot);
   final YamlMap dependencies = pubspec['dependencies'] as YamlMap;
-  printTrace('Found plugin $name at $packageRootPath');
+  globals.printTrace('Found plugin $name at $packageRootPath');
   return Plugin.fromYaml(
     name,
     packageRootPath,
@@ -291,13 +291,13 @@
   final List<Plugin> plugins = <Plugin>[];
   Map<String, Uri> packages;
   try {
-    final String packagesFile = fs.path.join(
+    final String packagesFile = globals.fs.path.join(
       project.directory.path,
       PackageMap.globalPackagesPath,
     );
     packages = PackageMap(packagesFile).map;
   } on FormatException catch (e) {
-    printTrace('Invalid .packages file: $e');
+    globals.printTrace('Invalid .packages file: $e');
     return plugins;
   }
   packages.forEach((String name, Uri uri) {
@@ -464,13 +464,13 @@
     'plugins': androidPlugins,
     'androidX': isAppUsingAndroidX(project.android.hostAppGradleRoot),
   };
-  final String javaSourcePath = fs.path.join(
+  final String javaSourcePath = globals.fs.path.join(
     project.android.pluginRegistrantHost.path,
     'src',
     'main',
     'java',
   );
-  final String registryPath = fs.path.join(
+  final String registryPath = globals.fs.path.join(
     javaSourcePath,
     'io',
     'flutter',
@@ -488,7 +488,7 @@
         if (plugin['supportsEmbeddingV1'] as bool && !(plugin['supportsEmbeddingV2'] as bool)) {
           templateContext['needsShim'] = true;
           if (project.isModule) {
-            printStatus(
+            globals.printStatus(
               'The plugin `${plugin['name']}` is built using an older version '
               "of the Android plugin API which assumes that it's running in a "
               'full-Flutter environment. It may have undefined behaviors when '
@@ -516,7 +516,7 @@
       templateContent = _androidPluginRegistryTemplateOldEmbedding;
       break;
   }
-  printTrace('Generating $registryPath');
+  globals.printTrace('Generating $registryPath');
   _renderTemplateToFile(
     templateContent,
     templateContext,
@@ -678,32 +678,32 @@
   };
   final String registryDirectory = project.ios.pluginRegistrantHost.path;
   if (project.isModule) {
-    final String registryClassesDirectory = fs.path.join(registryDirectory, 'Classes');
+    final String registryClassesDirectory = globals.fs.path.join(registryDirectory, 'Classes');
     _renderTemplateToFile(
       _pluginRegistrantPodspecTemplate,
       context,
-      fs.path.join(registryDirectory, 'FlutterPluginRegistrant.podspec'),
+      globals.fs.path.join(registryDirectory, 'FlutterPluginRegistrant.podspec'),
     );
     _renderTemplateToFile(
       _objcPluginRegistryHeaderTemplate,
       context,
-      fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.h'),
+      globals.fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.h'),
     );
     _renderTemplateToFile(
       _objcPluginRegistryImplementationTemplate,
       context,
-      fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.m'),
+      globals.fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.m'),
     );
   } else {
     _renderTemplateToFile(
       _objcPluginRegistryHeaderTemplate,
       context,
-      fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.h'),
+      globals.fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.h'),
     );
     _renderTemplateToFile(
       _objcPluginRegistryImplementationTemplate,
       context,
-      fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.m'),
+      globals.fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.m'),
     );
   }
 }
@@ -727,7 +727,7 @@
   _renderTemplateToFile(
     _swiftPluginRegistryTemplate,
     context,
-    fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.swift'),
+    globals.fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.swift'),
   );
 }
 
@@ -744,12 +744,12 @@
   _renderTemplateToFile(
     _cppPluginRegistryHeaderTemplate,
     templateContext,
-    fs.path.join(registryDirectory, 'generated_plugin_registrant.h'),
+    globals.fs.path.join(registryDirectory, 'generated_plugin_registrant.h'),
   );
   _renderTemplateToFile(
     _cppPluginRegistryImplementationTemplate,
     templateContext,
-    fs.path.join(registryDirectory, 'generated_plugin_registrant.cc'),
+    globals.fs.path.join(registryDirectory, 'generated_plugin_registrant.cc'),
   );
 }
 
@@ -759,9 +759,9 @@
     'plugins': webPlugins,
   };
   final String registryDirectory = project.web.libDirectory.path;
-  final String filePath = fs.path.join(registryDirectory, 'generated_plugin_registrant.dart');
+  final String filePath = globals.fs.path.join(registryDirectory, 'generated_plugin_registrant.dart');
   if (webPlugins.isEmpty) {
-    final File file = fs.file(filePath);
+    final File file = globals.fs.file(filePath);
     if (file.existsSync()) {
       file.deleteSync();
     }
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart
index 04d2850..234a266 100644
--- a/packages/flutter_tools/lib/src/project.dart
+++ b/packages/flutter_tools/lib/src/project.dart
@@ -15,10 +15,9 @@
 import 'base/file_system.dart';
 import 'build_info.dart';
 import 'bundle.dart' as bundle;
-import 'cache.dart';
 import 'features.dart';
 import 'flutter_manifest.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'ios/plist_parser.dart';
 import 'ios/xcodeproj.dart' as xcode;
 import 'plugins.dart';
@@ -73,11 +72,11 @@
 
   /// Returns a [FlutterProject] view of the current directory or a ToolExit error,
   /// if `pubspec.yaml` or `example/pubspec.yaml` is invalid.
-  static FlutterProject current() => fromDirectory(fs.currentDirectory);
+  static FlutterProject current() => fromDirectory(globals.fs.currentDirectory);
 
   /// Returns a [FlutterProject] view of the given directory or a ToolExit error,
   /// if `pubspec.yaml` or `example/pubspec.yaml` is invalid.
-  static FlutterProject fromPath(String path) => fromDirectory(fs.directory(path));
+  static FlutterProject fromPath(String path) => fromDirectory(globals.fs.directory(path));
 
   /// The location of this project.
   final Directory directory;
@@ -192,8 +191,8 @@
     try {
       manifest = FlutterManifest.createFromPath(path);
     } on YamlException catch (e) {
-      printStatus('Error detected in pubspec.yaml:', emphasis: true);
-      printError('$e');
+      globals.printStatus('Error detected in pubspec.yaml:', emphasis: true);
+      globals.printError('$e');
     }
     if (manifest == null) {
       throwToolExit('Please correct the pubspec.yaml file at $path');
@@ -455,7 +454,7 @@
   }
 
   Future<void> _updateGeneratedXcodeConfigIfNeeded() async {
-    if (Cache.instance.isOlderThanToolsStamp(generatedXcodePropertiesFile)) {
+    if (globals.cache.isOlderThanToolsStamp(generatedXcodePropertiesFile)) {
       await xcode.updateGeneratedXcodeProperties(
         project: parent,
         buildInfo: BuildInfo.debug,
@@ -469,7 +468,7 @@
       return;
     }
     final bool pubspecChanged = isOlderThanReference(entity: ephemeralDirectory, referenceFile: parent.pubspecFile);
-    final bool toolingChanged = Cache.instance.isOlderThanToolsStamp(ephemeralDirectory);
+    final bool toolingChanged = globals.cache.isOlderThanToolsStamp(ephemeralDirectory);
     if (!pubspecChanged && !toolingChanged) {
       return;
     }
@@ -479,18 +478,18 @@
       .childDirectory('engine');
 
     _deleteIfExistsSync(ephemeralDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'ios', 'library'), ephemeralDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'ios', 'library'), ephemeralDirectory);
     // Add ephemeral host app, if a editable host app does not already exist.
     if (!_editableDirectory.existsSync()) {
-      _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral'), ephemeralDirectory);
+      _overwriteFromTemplate(globals.fs.path.join('module', 'ios', 'host_app_ephemeral'), ephemeralDirectory);
       if (hasPlugins(parent)) {
-        _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral_cocoapods'), ephemeralDirectory);
+        _overwriteFromTemplate(globals.fs.path.join('module', 'ios', 'host_app_ephemeral_cocoapods'), ephemeralDirectory);
       }
       // Copy podspec and framework from engine cache. The actual build mode
       // doesn't actually matter as it will be overwritten by xcode_backend.sh.
       // However, cocoapods will run before that script and requires something
       // to be in this location.
-      final Directory framework = fs.directory(artifacts.getArtifactPath(Artifact.flutterFramework,
+      final Directory framework = globals.fs.directory(globals.artifacts.getArtifactPath(Artifact.flutterFramework,
         platform: TargetPlatform.ios, mode: BuildMode.debug));
       if (framework.existsSync()) {
         final File podspec = framework.parent.childFile('Flutter.podspec');
@@ -506,10 +505,10 @@
       throwToolExit('iOS host app is already editable. To start fresh, delete the ios/ folder.');
     }
     _deleteIfExistsSync(ephemeralDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'ios', 'library'), ephemeralDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral'), _editableDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_ephemeral_cocoapods'), _editableDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'ios', 'host_app_editable_cocoapods'), _editableDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'ios', 'library'), ephemeralDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'ios', 'host_app_ephemeral'), _editableDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'ios', 'host_app_ephemeral_cocoapods'), _editableDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'ios', 'host_app_editable_cocoapods'), _editableDirectory);
     await _updateGeneratedXcodeConfigIfNeeded();
     await injectPlugins(parent);
   }
@@ -583,14 +582,14 @@
 
   File get appManifestFile {
     return isUsingGradle
-        ? fs.file(fs.path.join(hostAppGradleRoot.path, 'app', 'src', 'main', 'AndroidManifest.xml'))
+        ? globals.fs.file(globals.fs.path.join(hostAppGradleRoot.path, 'app', 'src', 'main', 'AndroidManifest.xml'))
         : hostAppGradleRoot.childFile('AndroidManifest.xml');
   }
 
   File get gradleAppOutV1File => gradleAppOutV1Directory.childFile('app-debug.apk');
 
   Directory get gradleAppOutV1Directory {
-    return fs.directory(fs.path.join(hostAppGradleRoot.path, 'app', 'build', 'outputs', 'apk'));
+    return globals.fs.directory(globals.fs.path.join(hostAppGradleRoot.path, 'app', 'build', 'outputs', 'apk'));
   }
 
   /// Whether the current flutter project has an Android sub-project.
@@ -622,8 +621,8 @@
       _regenerateLibrary();
       // Add ephemeral host app, if an editable host app does not already exist.
       if (!_editableHostAppDirectory.existsSync()) {
-        _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_common'), ephemeralDirectory);
-        _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_ephemeral'), ephemeralDirectory);
+        _overwriteFromTemplate(globals.fs.path.join('module', 'android', 'host_app_common'), ephemeralDirectory);
+        _overwriteFromTemplate(globals.fs.path.join('module', 'android', 'host_app_ephemeral'), ephemeralDirectory);
       }
     }
     if (!hostAppGradleRoot.existsSync()) {
@@ -634,7 +633,7 @@
 
   bool _shouldRegenerateFromTemplate() {
     return isOlderThanReference(entity: ephemeralDirectory, referenceFile: parent.pubspecFile)
-        || Cache.instance.isOlderThanToolsStamp(ephemeralDirectory);
+        || globals.cache.isOlderThanToolsStamp(ephemeralDirectory);
   }
 
   Future<void> makeHostAppEditable() async {
@@ -643,9 +642,9 @@
       throwToolExit('Android host app is already editable. To start fresh, delete the android/ folder.');
     }
     _regenerateLibrary();
-    _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_common'), _editableHostAppDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'android', 'host_app_editable'), _editableHostAppDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'android', 'gradle'), _editableHostAppDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'android', 'host_app_common'), _editableHostAppDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'android', 'host_app_editable'), _editableHostAppDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'android', 'gradle'), _editableHostAppDirectory);
     gradle.gradleUtils.injectGradleWrapperIfNeeded(_editableHostAppDirectory);
     gradle.writeLocalProperties(_editableHostAppDirectory.childFile('local.properties'));
     await injectPlugins(parent);
@@ -657,12 +656,12 @@
 
   void _regenerateLibrary() {
     _deleteIfExistsSync(ephemeralDirectory);
-    _overwriteFromTemplate(fs.path.join(
+    _overwriteFromTemplate(globals.fs.path.join(
       'module',
       'android',
       featureFlags.isAndroidEmbeddingV2Enabled ? 'library_new_embedding' : 'library',
     ), ephemeralDirectory);
-    _overwriteFromTemplate(fs.path.join('module', 'android', 'gradle'), ephemeralDirectory);
+    _overwriteFromTemplate(globals.fs.path.join('module', 'android', 'gradle'), ephemeralDirectory);
     gradle.gradleUtils.injectGradleWrapperIfNeeded(ephemeralDirectory);
   }
 
@@ -848,7 +847,7 @@
   }
 
   Future<void> _updateGeneratedXcodeConfigIfNeeded() async {
-    if (Cache.instance.isOlderThanToolsStamp(generatedXcodePropertiesFile)) {
+    if (globals.cache.isOlderThanToolsStamp(generatedXcodePropertiesFile)) {
       await xcode.updateGeneratedXcodeProperties(
         project: parent,
         buildInfo: BuildInfo.debug,
diff --git a/packages/flutter_tools/lib/src/protocol_discovery.dart b/packages/flutter_tools/lib/src/protocol_discovery.dart
index bc6dd11..6133048 100644
--- a/packages/flutter_tools/lib/src/protocol_discovery.dart
+++ b/packages/flutter_tools/lib/src/protocol_discovery.dart
@@ -8,7 +8,7 @@
 
 import 'base/io.dart';
 import 'device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 
 /// Discovers a specific service protocol on a device, and forwards the service
 /// protocol device port to the host.
@@ -117,20 +117,20 @@
       return;
     }
     if (devicePort != null && uri.port != devicePort) {
-      printTrace('skipping potential observatory $uri due to device port mismatch');
+      globals.printTrace('skipping potential observatory $uri due to device port mismatch');
       return;
     }
     _uriStreamController.add(uri);
   }
 
   Future<Uri> _forwardPort(Uri deviceUri) async {
-    printTrace('$serviceName URL on device: $deviceUri');
+    globals.printTrace('$serviceName URL on device: $deviceUri');
     Uri hostUri = deviceUri;
 
     if (portForwarder != null) {
       final int actualDevicePort = deviceUri.port;
       final int actualHostPort = await portForwarder.forward(actualDevicePort, hostPort: hostPort);
-      printTrace('Forwarded host port $actualHostPort to device port $actualDevicePort for $serviceName');
+      globals.printTrace('Forwarded host port $actualHostPort to device port $actualDevicePort for $serviceName');
       hostUri = deviceUri.replace(port: actualHostPort);
     }
 
diff --git a/packages/flutter_tools/lib/src/proxy_validator.dart b/packages/flutter_tools/lib/src/proxy_validator.dart
index b8be1cf..3a8931e 100644
--- a/packages/flutter_tools/lib/src/proxy_validator.dart
+++ b/packages/flutter_tools/lib/src/proxy_validator.dart
@@ -4,8 +4,8 @@
 
 import 'dart:async';
 
-import 'base/platform.dart';
 import 'doctor.dart';
+import 'globals.dart' as globals;
 
 class ProxyValidator extends DoctorValidator {
   ProxyValidator() : super('Proxy Configuration');
@@ -19,8 +19,8 @@
   /// an empty string will be returned. Checks for the lowercase version of the
   /// environment variable first, then uppercase to match Dart's HTTP implementation.
   static String _getEnv(String key) =>
-      platform.environment[key.toLowerCase()]?.trim() ??
-      platform.environment[key.toUpperCase()]?.trim() ??
+      globals.platform.environment[key.toLowerCase()]?.trim() ??
+      globals.platform.environment[key.toUpperCase()]?.trim() ??
       '';
 
   @override
diff --git a/packages/flutter_tools/lib/src/reporting/crash_reporting.dart b/packages/flutter_tools/lib/src/reporting/crash_reporting.dart
index abf57c5..9c54a9b 100644
--- a/packages/flutter_tools/lib/src/reporting/crash_reporting.dart
+++ b/packages/flutter_tools/lib/src/reporting/crash_reporting.dart
@@ -56,7 +56,7 @@
   final Usage _usage = Usage.instance;
 
   Uri get _baseUrl {
-    final String overrideUrl = platform.environment['FLUTTER_CRASH_SERVER_BASE_URL'];
+    final String overrideUrl = globals.platform.environment['FLUTTER_CRASH_SERVER_BASE_URL'];
 
     if (overrideUrl != null) {
       return Uri.parse(overrideUrl);
@@ -90,7 +90,7 @@
         return;
       }
 
-      printTrace('Sending crash report to Google.');
+      globals.printTrace('Sending crash report to Google.');
 
       final Uri uri = _baseUrl.replace(
         queryParameters: <String, String>{
@@ -103,7 +103,7 @@
       req.fields['uuid'] = _usage.clientId;
       req.fields['product'] = _kProductId;
       req.fields['version'] = flutterVersion;
-      req.fields['osName'] = platform.operatingSystem;
+      req.fields['osName'] = globals.platform.operatingSystem;
       req.fields['osVersion'] = os.name; // this actually includes version
       req.fields['type'] = _kDartTypeId;
       req.fields['error_runtime_type'] = '${error.runtimeType}';
@@ -121,17 +121,17 @@
       if (resp.statusCode == 200) {
         final String reportId = await http.ByteStream(resp.stream)
             .bytesToString();
-        printTrace('Crash report sent (report ID: $reportId)');
+        globals.printTrace('Crash report sent (report ID: $reportId)');
         _crashReportSent = true;
       } else {
-        printError('Failed to send crash report. Server responded with HTTP status code ${resp.statusCode}');
+        globals.printError('Failed to send crash report. Server responded with HTTP status code ${resp.statusCode}');
       }
     } catch (sendError, sendStackTrace) {
       if (sendError is SocketException || sendError is HttpException) {
-        printError('Failed to send crash report due to a network error: $sendError');
+        globals.printError('Failed to send crash report due to a network error: $sendError');
       } else {
         // If the sender itself crashes, just print. We did our best.
-        printError('Crash report sender itself crashed: $sendError\n$sendStackTrace');
+        globals.printError('Crash report sender itself crashed: $sendError\n$sendStackTrace');
       }
     }
   }
diff --git a/packages/flutter_tools/lib/src/reporting/events.dart b/packages/flutter_tools/lib/src/reporting/events.dart
index 10c4e7a..3ed3480 100644
--- a/packages/flutter_tools/lib/src/reporting/events.dart
+++ b/packages/flutter_tools/lib/src/reporting/events.dart
@@ -195,7 +195,7 @@
       );
     } catch (error) {
       // If grabbing the maxRss fails for some reason, just don't send an event.
-      printTrace('Querying maxRss failed with error: $error');
+      globals.printTrace('Querying maxRss failed with error: $error');
     }
   }
 }
diff --git a/packages/flutter_tools/lib/src/reporting/github_template.dart b/packages/flutter_tools/lib/src/reporting/github_template.dart
index 922f260..367232e 100644
--- a/packages/flutter_tools/lib/src/reporting/github_template.dart
+++ b/packages/flutter_tools/lib/src/reporting/github_template.dart
@@ -12,7 +12,7 @@
 import '../base/net.dart';
 import '../convert.dart';
 import '../flutter_manifest.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 
 /// Provide suggested GitHub issue templates to user when Flutter encounters an error.
@@ -106,7 +106,7 @@
           }
           // Write the last part of the path, which includes the plugin name and version.
           // Example: camera-0.5.7+2
-          final List<String> pathParts = fs.path.split(pluginParts[1]);
+          final List<String> pathParts = globals.fs.path.split(pluginParts[1]);
           description.writeln(pathParts.isEmpty ? pluginParts.first : pathParts.last);
         }
       }
@@ -123,7 +123,7 @@
   Future<String> _shortURL(String fullURL) async {
     String url;
     try {
-      printTrace('Attempting git.io shortener: $fullURL');
+      globals.printTrace('Attempting git.io shortener: $fullURL');
       final List<int> bodyBytes = utf8.encode('url=${Uri.encodeQueryComponent(fullURL)}');
       final HttpClientRequest request = await _client.postUrl(Uri.parse('https://git.io'));
       request.headers.set(HttpHeaders.contentLengthHeader, bodyBytes.length.toString());
@@ -133,10 +133,10 @@
       if (response.statusCode == 201) {
         url = response.headers[HttpHeaders.locationHeader]?.first;
       } else {
-        printTrace('Failed to shorten GitHub template URL. Server responded with HTTP status code ${response.statusCode}');
+        globals.printTrace('Failed to shorten GitHub template URL. Server responded with HTTP status code ${response.statusCode}');
       }
     } catch (sendError) {
-      printTrace('Failed to shorten GitHub template URL: $sendError');
+      globals.printTrace('Failed to shorten GitHub template URL: $sendError');
     }
 
     return url ?? fullURL;
diff --git a/packages/flutter_tools/lib/src/reporting/reporting.dart b/packages/flutter_tools/lib/src/reporting/reporting.dart
index bae3839..c811303 100644
--- a/packages/flutter_tools/lib/src/reporting/reporting.dart
+++ b/packages/flutter_tools/lib/src/reporting/reporting.dart
@@ -10,17 +10,15 @@
 import 'package:meta/meta.dart';
 import 'package:usage/usage_io.dart';
 
-import '../base/config.dart';
 import '../base/context.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/time.dart';
 import '../base/utils.dart';
 import '../doctor.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../persistent_tool_state.dart';
 import '../runner/flutter_command.dart';
 import '../version.dart';
diff --git a/packages/flutter_tools/lib/src/reporting/usage.dart b/packages/flutter_tools/lib/src/reporting/usage.dart
index cdb9dd5..b8ceebe 100644
--- a/packages/flutter_tools/lib/src/reporting/usage.dart
+++ b/packages/flutter_tools/lib/src/reporting/usage.dart
@@ -164,8 +164,8 @@
   }) {
     final FlutterVersion flutterVersion = FlutterVersion.instance;
     final String version = versionOverride ?? flutterVersion.getVersionString(redactUnknownBranches: true);
-    final bool suppressEnvFlag = platform.environment['FLUTTER_SUPPRESS_ANALYTICS'] == 'true';
-    final String logFilePath = logFile ?? platform.environment['FLUTTER_ANALYTICS_LOG_FILE'];
+    final bool suppressEnvFlag = globals.platform.environment['FLUTTER_SUPPRESS_ANALYTICS'] == 'true';
+    final String logFilePath = logFile ?? globals.platform.environment['FLUTTER_ANALYTICS_LOG_FILE'];
     final bool usingLogFile = logFilePath != null && logFilePath.isNotEmpty;
 
     if (// To support testing, only allow other signals to supress analytics
@@ -194,7 +194,7 @@
             settingsName,
             version,
             documentDirectory:
-                configDirOverride != null ? fs.directory(configDirOverride) : null,
+                configDirOverride != null ? globals.fs.directory(configDirOverride) : null,
           );
     }
     assert(_analytics != null);
@@ -209,15 +209,15 @@
     final String enabledFeatures = allFeatures
         .where((Feature feature) {
           return feature.configSetting != null &&
-                 Config.instance.getValue(feature.configSetting) == true;
+                 globals.config.getValue(feature.configSetting) == true;
         })
         .map((Feature feature) => feature.configSetting)
         .join(',');
     _analytics.setSessionValue(cdKey(CustomDimensions.enabledFlutterFeatures), enabledFeatures);
 
     // Record the host as the application installer ID - the context that flutter_tools is running in.
-    if (platform.environment.containsKey('FLUTTER_HOST')) {
-      _analytics.setSessionValue('aiid', platform.environment['FLUTTER_HOST']);
+    if (globals.platform.environment.containsKey('FLUTTER_HOST')) {
+      _analytics.setSessionValue('aiid', globals.platform.environment['FLUTTER_HOST']);
     }
     _analytics.analyticsOpt = AnalyticsOpt.optOut;
   }
@@ -326,8 +326,8 @@
   }
 
   void _printWelcome() {
-    printStatus('');
-    printStatus('''
+    globals.printStatus('');
+    globals.printStatus('''
   ╔════════════════════════════════════════════════════════════════════════════╗
   ║                 Welcome to Flutter! - https://flutter.dev                  ║
   ║                                                                            ║
@@ -381,7 +381,7 @@
 // xcode_backend.sh etc manipulates them.
 class LogToFileAnalytics extends AnalyticsMock {
   LogToFileAnalytics(String logFilePath) :
-    logFile = fs.file(logFilePath)..createSync(recursive: true),
+    logFile = globals.fs.file(logFilePath)..createSync(recursive: true),
     super(true);
 
   final File logFile;
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index aaadc55..15e4b03 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -14,7 +14,6 @@
 import 'base/io.dart' as io;
 import 'base/logger.dart';
 import 'base/signals.dart';
-import 'base/terminal.dart';
 import 'base/utils.dart';
 import 'build_info.dart';
 import 'codegen.dart';
@@ -23,7 +22,7 @@
 import 'devfs.dart';
 import 'device.dart';
 import 'features.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'project.dart';
 import 'run_cold.dart';
 import 'run_hot.dart';
@@ -44,7 +43,7 @@
     List<String> dartDefines,
   }) : assert(trackWidgetCreation != null),
        generator = generator ?? ResidentCompiler(
-         artifacts.getArtifactPath(
+         globals.artifacts.getArtifactPath(
            Artifact.flutterPatchedSdkPath,
            platform: targetPlatform,
            mode: buildMode,
@@ -81,14 +80,14 @@
     if (featureFlags.isWebIncrementalCompilerEnabled &&
         targetPlatform == TargetPlatform.web_javascript) {
       generator = ResidentCompiler(
-        artifacts.getArtifactPath(Artifact.flutterWebSdk, mode: buildMode),
+        globals.artifacts.getArtifactPath(Artifact.flutterWebSdk, mode: buildMode),
         buildMode: buildMode,
         trackWidgetCreation: trackWidgetCreation,
         fileSystemRoots: fileSystemRoots,
         fileSystemScheme: fileSystemScheme,
         targetModel: TargetModel.dartdevc,
         experimentalFlags: experimentalFlags,
-        platformDill: fs.file(artifacts
+        platformDill: globals.fs.file(globals.artifacts
           .getArtifactPath(Artifact.webPlatformKernelDill, mode: buildMode))
           .absolute.uri.toString(),
         dartDefines: dartDefines,
@@ -102,7 +101,7 @@
       );
     } else {
       generator = ResidentCompiler(
-        artifacts.getArtifactPath(
+        globals.artifacts.getArtifactPath(
           Artifact.flutterPatchedSdkPath,
           platform: targetPlatform,
           mode: buildMode,
@@ -168,7 +167,7 @@
 
     subscription = observatoryUris.listen((Uri observatoryUri) async {
       // FYI, this message is used as a sentinel in tests.
-      printTrace('Connecting to service protocol: $observatoryUri');
+      globals.printTrace('Connecting to service protocol: $observatoryUri');
       isWaitingForVm = true;
       VMService service;
 
@@ -182,7 +181,7 @@
           device: device,
         );
       } on Exception catch (exception) {
-        printTrace('Fail to connect to service protocol: $observatoryUri: $exception');
+        globals.printTrace('Fail to connect to service protocol: $observatoryUri: $exception');
         if (!completer.isCompleted && !_isListeningForObservatoryUri) {
           completer.completeError('failed to connect to $observatoryUri');
         }
@@ -191,14 +190,14 @@
       if (completer.isCompleted) {
         return;
       }
-      printTrace('Successfully connected to service protocol: $observatoryUri');
+      globals.printTrace('Successfully connected to service protocol: $observatoryUri');
 
       vmService = service;
       device.getLogReader(app: package).connectedVMService = vmService;
       completer.complete();
       await subscription.cancel();
     }, onError: (dynamic error) {
-      printTrace('Fail to handle observatory URI: $error');
+      globals.printTrace('Fail to handle observatory URI: $error');
     }, onDone: () {
       _isListeningForObservatoryUri = false;
       if (!completer.isCompleted && !isWaitingForVm) {
@@ -281,7 +280,7 @@
     String entryPath, {
     bool pause = false,
   }) {
-    final Uri deviceEntryUri = devFS.baseUri.resolveUri(fs.path.toUri(entryPath));
+    final Uri deviceEntryUri = devFS.baseUri.resolveUri(globals.fs.path.toUri(entryPath));
     final Uri devicePackagesUri = devFS.baseUri.resolve('.packages');
     return <Future<Map<String, dynamic>>>[
       for (FlutterView view in views)
@@ -295,7 +294,7 @@
 
   Future<void> resetAssetDirectory() async {
     final Uri deviceAssetsDirectoryUri = devFS.baseUri.resolveUri(
-        fs.path.toUri(getAssetBuildDirectory()));
+        globals.fs.path.toUri(getAssetBuildDirectory()));
     assert(deviceAssetsDirectoryUri != null);
     await Future.wait<void>(views.map<Future<void>>(
       (FlutterView view) => view.setAssetDirectory(deviceAssetsDirectoryUri)
@@ -376,12 +375,12 @@
     }
     final Stream<String> logStream = device.getLogReader(app: package).logLines;
     if (logStream == null) {
-      printError('Failed to read device log stream');
+      globals.printError('Failed to read device log stream');
       return;
     }
     _loggingSubscription = logStream.listen((String line) {
       if (!line.contains('Observatory listening on http')) {
-        printStatus(line, wrap: false);
+        globals.printStatus(line, wrap: false);
       }
     });
   }
@@ -404,7 +403,7 @@
   }) async {
     final bool prebuiltMode = hotRunner.applicationBinary != null;
     final String modeName = hotRunner.debuggingOptions.buildInfo.friendlyModeName;
-    printStatus('Launching ${getDisplayPath(hotRunner.mainPath)} on ${device.name} in $modeName mode...');
+    globals.printStatus('Launching ${getDisplayPath(hotRunner.mainPath)} on ${device.name} in $modeName mode...');
 
     final TargetPlatform targetPlatform = await device.targetPlatform;
     package = await ApplicationPackageFactory.instance.getPackageForPlatform(
@@ -418,7 +417,7 @@
       if (hint != null) {
         message += '\n$hint';
       }
-      printError(message);
+      globals.printError(message);
       return 1;
     }
 
@@ -440,7 +439,7 @@
     final LaunchResult result = await futureResult;
 
     if (!result.started) {
-      printError('Error launching application on ${device.name}.');
+      globals.printError('Error launching application on ${device.name}.');
       await stopEchoingDeviceLog();
       return 2;
     }
@@ -471,9 +470,9 @@
     final bool prebuiltMode = coldRunner.applicationBinary != null;
     if (coldRunner.mainPath == null) {
       assert(prebuiltMode);
-      printStatus('Launching ${package.displayName} on ${device.name} in $modeName mode...');
+      globals.printStatus('Launching ${package.displayName} on ${device.name} in $modeName mode...');
     } else {
-      printStatus('Launching ${getDisplayPath(coldRunner.mainPath)} on ${device.name} in $modeName mode...');
+      globals.printStatus('Launching ${getDisplayPath(coldRunner.mainPath)} on ${device.name} in $modeName mode...');
     }
 
     if (package == null) {
@@ -482,7 +481,7 @@
       if (hint != null) {
         message += '\n$hint';
       }
-      printError(message);
+      globals.printError(message);
       return 1;
     }
 
@@ -504,7 +503,7 @@
     );
 
     if (!result.started) {
-      printError('Error running application on ${device.name}.');
+      globals.printError('Error running application on ${device.name}.');
       await stopEchoingDeviceLog();
       return 2;
     }
@@ -533,7 +532,7 @@
     @required String dillOutputPath,
     @required List<Uri> invalidatedFiles,
   }) async {
-    final Status devFSStatus = logger.startProgress(
+    final Status devFSStatus = globals.logger.startProgress(
       'Syncing files to device ${device.name}...',
       timeout: timeoutConfiguration.fastOperation,
     );
@@ -558,7 +557,7 @@
       return UpdateFSReport(success: false);
     }
     devFSStatus.stop();
-    printTrace('Synced ${getSizeAsMB(report.syncedBytes)}.');
+    globals.printTrace('Synced ${getSizeAsMB(report.syncedBytes)}.');
     return report;
   }
 
@@ -601,12 +600,12 @@
     this.hotMode = true,
     String dillOutputPath,
   }) : mainPath = findMainDartFile(target),
-       projectRootPath = projectRootPath ?? fs.currentDirectory.path,
-       packagesFilePath = packagesFilePath ?? fs.path.absolute(PackageMap.globalPackagesPath),
+       projectRootPath = projectRootPath ?? globals.fs.currentDirectory.path,
+       packagesFilePath = packagesFilePath ?? globals.fs.path.absolute(PackageMap.globalPackagesPath),
        _dillOutputPath = dillOutputPath,
        artifactDirectory = dillOutputPath == null
-          ? fs.systemTempDirectory.createTempSync('flutter_tool.')
-          : fs.file(dillOutputPath).parent,
+          ? globals.fs.systemTempDirectory.createTempSync('flutter_tool.')
+          : globals.fs.file(dillOutputPath).parent,
        assetBundle = AssetBundleFactory.instance.createBundle() {
     if (!artifactDirectory.existsSync()) {
       artifactDirectory.createSync(recursive: true);
@@ -616,9 +615,9 @@
     // better way to determine where the appropriate dill file is, as this
     // doesn't work for Android or macOS builds.}
     if (dillOutputPath == null) {
-      final File existingDill = fs.file(fs.path.join('build', 'app.dill'));
+      final File existingDill = globals.fs.file(globals.fs.path.join('build', 'app.dill'));
       if (existingDill.existsSync()) {
-        existingDill.copySync(fs.path.join(artifactDirectory.path, 'app.dill'));
+        existingDill.copySync(globals.fs.path.join(artifactDirectory.path, 'app.dill'));
       }
     }
   }
@@ -651,7 +650,7 @@
     });
   }
 
-  String get dillOutputPath => _dillOutputPath ?? fs.path.join(artifactDirectory.path, 'app.dill');
+  String get dillOutputPath => _dillOutputPath ?? globals.fs.path.join(artifactDirectory.path, 'app.dill');
   String getReloadPath({ bool fullRestart }) => mainPath + (fullRestart ? '' : '.incremental') + '.dill';
 
   bool get debuggingEnabled => debuggingOptions.debuggingEnabled;
@@ -732,11 +731,11 @@
     if (debuggingOptions.vmserviceOutFile != null) {
       try {
         final String address = flutterDevices.first.vmService.wsAddress.toString();
-        final File vmserviceOutFile = fs.file(debuggingOptions.vmserviceOutFile);
+        final File vmserviceOutFile = globals.fs.file(debuggingOptions.vmserviceOutFile);
         vmserviceOutFile.createSync(recursive: true);
         vmserviceOutFile.writeAsStringSync(address);
       } on FileSystemException {
-        printError('Failed to write vmservice-out-file at ${debuggingOptions.vmserviceOutFile}');
+        globals.printError('Failed to write vmservice-out-file at ${debuggingOptions.vmserviceOutFile}');
       }
     }
   }
@@ -840,8 +839,8 @@
   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');
+    final Status status = globals.logger.startProgress('Taking screenshot for ${device.device.name}...', timeout: timeoutConfiguration.fastOperation);
+    final File outputFile = getUniqueFile(globals.fs.currentDirectory, 'flutter', 'png');
     try {
       if (supportsServiceProtocol && isRunningDebug) {
         await device.refreshViews();
@@ -851,7 +850,7 @@
           }
         } catch (error) {
           status.cancel();
-          printError('Error communicating with Flutter on the device: $error');
+          globals.printError('Error communicating with Flutter on the device: $error');
           return;
         }
       }
@@ -865,17 +864,17 @@
             }
           } catch (error) {
             status.cancel();
-            printError('Error communicating with Flutter on the device: $error');
+            globals.printError('Error communicating with Flutter on the device: $error');
             return;
           }
         }
       }
       final int sizeKB = outputFile.lengthSync() ~/ 1024;
       status.stop();
-      printStatus('Screenshot written to ${fs.path.relative(outputFile.path)} (${sizeKB}kB).');
+      globals.printStatus('Screenshot written to ${globals.fs.path.relative(outputFile.path)} (${sizeKB}kB).');
     } catch (error) {
       status.cancel();
-      printError('Error taking screenshot: $error');
+      globals.printError('Error taking screenshot: $error');
     }
   }
 
@@ -886,7 +885,7 @@
     for (FlutterDevice device in flutterDevices) {
       to = await device.togglePlatform(from: from);
     }
-    printStatus('Switched operating system to $to');
+    globals.printStatus('Switched operating system to $to');
   }
 
   Future<void> stopEchoingDeviceLog() async {
@@ -948,12 +947,12 @@
   }
 
   Future<void> _serviceProtocolDone(dynamic object) {
-    printTrace('Service protocol connection closed.');
+    globals.printTrace('Service protocol connection closed.');
     return Future<void>.value(object);
   }
 
   Future<void> _serviceProtocolError(dynamic error, StackTrace stack) {
-    printTrace('Service protocol connection closed with an error: $error\n$stack');
+    globals.printTrace('Service protocol connection closed with an error: $error\n$stack');
     return Future<void>.error(error, stack);
   }
 
@@ -965,7 +964,7 @@
     if (_finished.isCompleted) {
       return;
     }
-    printStatus('Lost connection to device.');
+    globals.printStatus('Lost connection to device.');
     _finished.complete(0);
   }
 
@@ -973,7 +972,7 @@
     if (_finished.isCompleted) {
       return;
     }
-    printStatus('Application finished.');
+    globals.printStatus('Application finished.');
     _finished.complete(0);
   }
 
@@ -1005,22 +1004,22 @@
 
   void printHelpDetails() {
     if (supportsServiceProtocol) {
-      printStatus('You can dump the widget hierarchy of the app (debugDumpApp) by pressing "w".');
-      printStatus('To dump the rendering tree of the app (debugDumpRenderTree), press "t".');
+      globals.printStatus('You can dump the widget hierarchy of the app (debugDumpApp) by pressing "w".');
+      globals.printStatus('To dump the rendering tree of the app (debugDumpRenderTree), press "t".');
       if (isRunningDebug) {
-        printStatus('For layers (debugDumpLayerTree), use "L"; for accessibility (debugDumpSemantics), use "S" (for traversal order) or "U" (for inverse hit test order).');
-        printStatus('To toggle the widget inspector (WidgetsApp.showWidgetInspectorOverride), press "i".');
-        printStatus('To toggle the display of construction lines (debugPaintSizeEnabled), press "p".');
-        printStatus('To simulate different operating systems, (defaultTargetPlatform), press "o".');
-        printStatus('To toggle the elevation checker, press "z".');
+        globals.printStatus('For layers (debugDumpLayerTree), use "L"; for accessibility (debugDumpSemantics), use "S" (for traversal order) or "U" (for inverse hit test order).');
+        globals.printStatus('To toggle the widget inspector (WidgetsApp.showWidgetInspectorOverride), press "i".');
+        globals.printStatus('To toggle the display of construction lines (debugPaintSizeEnabled), press "p".');
+        globals.printStatus('To simulate different operating systems, (defaultTargetPlatform), press "o".');
+        globals.printStatus('To toggle the elevation checker, press "z".');
       } else {
-        printStatus('To dump the accessibility tree (debugDumpSemantics), press "S" (for traversal order) or "U" (for inverse hit test order).');
+        globals.printStatus('To dump the accessibility tree (debugDumpSemantics), press "S" (for traversal order) or "U" (for inverse hit test order).');
       }
-      printStatus('To display the performance overlay (WidgetsApp.showPerformanceOverlay), press "P".');
-      printStatus('To enable timeline events for all widget build methods, (debugProfileWidgetBuilds), press "a"');
+      globals.printStatus('To display the performance overlay (WidgetsApp.showPerformanceOverlay), press "P".');
+      globals.printStatus('To enable timeline events for all widget build methods, (debugProfileWidgetBuilds), press "a"');
     }
     if (flutterDevices.any((FlutterDevice d) => d.device.supportsScreenshot)) {
-      printStatus('To save a screenshot to flutter.png, press "s".');
+      globals.printStatus('To save a screenshot to flutter.png, press "s".');
     }
   }
 
@@ -1052,9 +1051,9 @@
 /// where the app's main function should be.
 String findMainDartFile([ String target ]) {
   target ??= '';
-  final String targetPath = fs.path.absolute(target);
-  if (fs.isDirectorySync(targetPath)) {
-    return fs.path.join(targetPath, 'lib', 'main.dart');
+  final String targetPath = globals.fs.path.absolute(target);
+  if (globals.fs.isDirectorySync(targetPath)) {
+    return globals.fs.path.join(targetPath, 'lib', 'main.dart');
   }
   return targetPath;
 }
@@ -1066,7 +1065,7 @@
     case TargetPlatform.android_x64:
     case TargetPlatform.android_x86:
       final FlutterProject project = FlutterProject.current();
-      final String manifestPath = fs.path.relative(project.android.appManifestFile.path);
+      final String manifestPath = globals.fs.path.relative(project.android.appManifestFile.path);
       return 'Is your project missing an $manifestPath?\nConsider running "flutter create ." to create one.';
     case TargetPlatform.ios:
       return 'Is your project missing an ios/Runner/Info.plist?\nConsider running "flutter create ." to create one.';
@@ -1087,12 +1086,12 @@
   String lastReceivedCommand;
 
   void setupTerminal() {
-    if (!logger.quiet) {
-      printStatus('');
+    if (!globals.logger.quiet) {
+      globals.printStatus('');
       residentRunner.printHelp(details: false);
     }
-    terminal.singleCharMode = true;
-    subscription = terminal.keystrokes.listen(processTerminalInput);
+    globals.terminal.singleCharMode = true;
+    subscription = globals.terminal.keystrokes.listen(processTerminalInput);
   }
 
 
@@ -1126,7 +1125,7 @@
 
   /// Returns [true] if the input has been handled by this function.
   Future<bool> _commonTerminalInputHandler(String character) async {
-    printStatus(''); // the key the user tapped might be on this line
+    globals.printStatus(''); // the key the user tapped might be on this line
     switch(character) {
       case 'a':
         if (residentRunner.supportsServiceProtocol) {
@@ -1154,9 +1153,9 @@
       case 'l':
         final List<FlutterView> views = residentRunner.flutterDevices
             .expand((FlutterDevice d) => d.views).toList();
-        printStatus('Connected ${pluralize('view', views.length)}:');
+        globals.printStatus('Connected ${pluralize('view', views.length)}:');
         for (FlutterView v in views) {
-          printStatus('${v.uiIsolate.name} (${v.uiIsolate.id})', indent: 2);
+          globals.printStatus('${v.uiIsolate.name} (${v.uiIsolate.id})', indent: 2);
         }
         return true;
       case 'L':
@@ -1205,7 +1204,7 @@
           throwToolExit(result.message);
         }
         if (!result.isOk) {
-          printStatus('Try again after fixing the above error(s).', emphasis: true);
+          globals.printStatus('Try again after fixing the above error(s).', emphasis: true);
         }
         return true;
       case 'R':
@@ -1218,7 +1217,7 @@
           throwToolExit(result.message);
         }
         if (!result.isOk) {
-          printStatus('Try again after fixing the above error(s).', emphasis: true);
+          globals.printStatus('Try again after fixing the above error(s).', emphasis: true);
         }
         return true;
       case 'S':
@@ -1259,7 +1258,7 @@
     // When terminal doesn't support line mode, '\n' can sneak into the input.
     command = command.trim();
     if (_processingUserRequest) {
-      printTrace('Ignoring terminal input: "$command" because we are busy.');
+      globals.printTrace('Ignoring terminal input: "$command" because we are busy.');
       return;
     }
     _processingUserRequest = true;
@@ -1269,7 +1268,7 @@
     } catch (error, st) {
       // Don't print stack traces for known error types.
       if (error is! ToolExit) {
-        printError('$error\n$st');
+        globals.printError('$error\n$st');
       }
       await _cleanUp(null);
       rethrow;
@@ -1280,7 +1279,7 @@
 
   Future<void> _handleSignal(io.ProcessSignal signal) async {
     if (_processingUserRequest) {
-      printTrace('Ignoring signal: "$signal" because we are busy.');
+      globals.printTrace('Ignoring signal: "$signal" because we are busy.');
       return;
     }
     _processingUserRequest = true;
@@ -1295,7 +1294,7 @@
   }
 
   Future<void> _cleanUp(io.ProcessSignal signal) async {
-    terminal.singleCharMode = false;
+    globals.terminal.singleCharMode = false;
     await subscription?.cancel();
     await residentRunner.cleanupAfterSignal();
   }
diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart
index b03d19b..02f95ae 100644
--- a/packages/flutter_tools/lib/src/run_cold.dart
+++ b/packages/flutter_tools/lib/src/run_cold.dart
@@ -8,7 +8,7 @@
 
 import 'base/file_system.dart';
 import 'device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'resident_runner.dart';
 import 'tracing.dart';
 import 'vmservice.dart';
@@ -50,12 +50,12 @@
   }) async {
     final bool prebuiltMode = applicationBinary != null;
     if (!prebuiltMode) {
-      if (!fs.isFileSync(mainPath)) {
+      if (!globals.fs.isFileSync(mainPath)) {
         String message = 'Tried to run $mainPath, but that file does not exist.';
         if (target == null) {
           message += '\nConsider using the -t option to specify the Dart file to start.';
         }
-        printError(message);
+        globals.printError(message);
         return 1;
       }
     }
@@ -75,7 +75,7 @@
       try {
         await connectToServiceProtocol();
       } on String catch (message) {
-        printError(message);
+        globals.printError(message);
         return 2;
       }
     }
@@ -88,7 +88,7 @@
       ));
     }
 
-    printTrace('Application running.');
+    globals.printTrace('Application running.');
 
     for (FlutterDevice device in flutterDevices) {
       if (device.vmService == null) {
@@ -96,14 +96,14 @@
       }
       device.initLogReader();
       await device.refreshViews();
-      printTrace('Connected to ${device.device.name}');
+      globals.printTrace('Connected to ${device.device.name}');
     }
 
     if (traceStartup) {
       // Only trace startup for the first device.
       final FlutterDevice device = flutterDevices.first;
       if (device.vmService != null) {
-        printStatus('Tracing startup on ${device.device.name}.');
+        globals.printStatus('Tracing startup on ${device.device.name}.');
         await downloadStartupTrace(
           device.vmService,
           awaitFirstFrame: awaitFirstFrameWhenTracing,
@@ -132,13 +132,13 @@
     try {
       await connectToServiceProtocol();
     } catch (error) {
-      printError('Error connecting to the service protocol: $error');
+      globals.printError('Error connecting to the service protocol: $error');
       // https://github.com/flutter/flutter/issues/33050
       // TODO(blasten): Remove this check once https://issuetracker.google.com/issues/132325318 has been fixed.
       if (await hasDeviceRunningAndroidQ(flutterDevices) &&
           error.toString().contains(kAndroidQHttpConnectionClosedExp)) {
-        printStatus('🔨 If you are using an emulator running Android Q Beta, consider using an emulator running API level 29 or lower.');
-        printStatus('Learn more about the status of this issue on https://issuetracker.google.com/issues/132325318');
+        globals.printStatus('🔨 If you are using an emulator running Android Q Beta, consider using an emulator running API level 29 or lower.');
+        globals.printStatus('Learn more about the status of this issue on https://issuetracker.google.com/issues/132325318');
       }
       return 2;
     }
@@ -148,7 +148,7 @@
     await refreshViews();
     for (FlutterDevice device in flutterDevices) {
       for (FlutterView view in device.views) {
-        printTrace('Connected to $view.');
+        globals.printTrace('Connected to $view.');
       }
     }
     appStartedCompleter?.complete();
@@ -184,7 +184,7 @@
     for (FlutterDevice device in flutterDevices) {
       final String dname = device.device.name;
       if (device.vmService != null) {
-        printStatus('An Observatory debugger and profiler on $dname is '
+        globals.printStatus('An Observatory debugger and profiler on $dname is '
           'available at: ${device.vmService .httpAddress}');
       }
     }
@@ -199,11 +199,11 @@
       ? 'To detach, press "d"; to quit, press "q".'
       : 'To quit, press "q".';
     if (haveDetails && !details) {
-      printStatus('For a more detailed help message, press "h". $quitMessage');
+      globals.printStatus('For a more detailed help message, press "h". $quitMessage');
     } else if (haveAnything) {
-      printStatus('To repeat this help message, press "h". $quitMessage');
+      globals.printStatus('To repeat this help message, press "h". $quitMessage');
     } else {
-      printStatus(quitMessage);
+      globals.printStatus(quitMessage);
     }
   }
 
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index 26a1e36..e8d9337 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 
+import 'package:platform/platform.dart';
 import 'package:json_rpc_2/error_code.dart' as rpc_error_code;
 import 'package:json_rpc_2/json_rpc_2.dart' as rpc;
 import 'package:meta/meta.dart';
@@ -13,7 +14,6 @@
 import 'base/context.dart';
 import 'base/file_system.dart';
 import 'base/logger.dart';
-import 'base/platform.dart';
 import 'base/terminal.dart';
 import 'base/utils.dart';
 import 'build_info.dart';
@@ -21,16 +21,16 @@
 import 'convert.dart';
 import 'devfs.dart';
 import 'device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'reporting/reporting.dart';
 import 'resident_runner.dart';
 import 'vmservice.dart';
 
 ProjectFileInvalidator get projectFileInvalidator => context.get<ProjectFileInvalidator>() ?? _defaultInvalidator;
 final ProjectFileInvalidator _defaultInvalidator = ProjectFileInvalidator(
-  fileSystem: fs,
-  platform: platform,
-  logger: logger,
+  fileSystem: globals.fs,
+  platform: globals.platform,
+  logger: globals.logger,
 );
 
 HotRunnerConfig get hotRunnerConfig => context.get<HotRunnerConfig>();
@@ -143,7 +143,7 @@
             await device.generator.compileExpression(expression, definitions,
                 typeDefinitions, libraryUri, klass, isStatic);
         if (compilerOutput != null && compilerOutput.outputFilename != null) {
-          return base64.encode(fs.file(compilerOutput.outputFilename).readAsBytesSync());
+          return base64.encode(globals.fs.file(compilerOutput.outputFilename).readAsBytesSync());
         }
       }
     }
@@ -174,7 +174,7 @@
       return OperationResult(1, 'Failed to compile');
     }
     try {
-      final String entryPath = fs.path.relative(
+      final String entryPath = globals.fs.path.relative(
         getReloadPath(fullRestart: false),
         from: projectRootPath,
       );
@@ -196,7 +196,7 @@
       }
     }
 
-    printStatus('reloadMethod took ${stopwatch.elapsedMilliseconds}');
+    globals.printStatus('reloadMethod took ${stopwatch.elapsedMilliseconds}');
     flutterUsage.sendTiming('hot', 'ui', stopwatch.elapsed);
     return OperationResult.ok;
   }
@@ -216,13 +216,13 @@
         reloadMethod: reloadMethod,
       );
     } catch (error) {
-      printError('Error connecting to the service protocol: $error');
+      globals.printError('Error connecting to the service protocol: $error');
       // https://github.com/flutter/flutter/issues/33050
       // TODO(blasten): Remove this check once https://issuetracker.google.com/issues/132325318 has been fixed.
       if (await hasDeviceRunningAndroidQ(flutterDevices) &&
           error.toString().contains(kAndroidQHttpConnectionClosedExp)) {
-        printStatus('🔨 If you are using an emulator running Android Q Beta, consider using an emulator running API level 29 or lower.');
-        printStatus('Learn more about the status of this issue on https://issuetracker.google.com/issues/132325318.');
+        globals.printStatus('🔨 If you are using an emulator running Android Q Beta, consider using an emulator running API level 29 or lower.');
+        globals.printStatus('Learn more about the status of this issue on https://issuetracker.google.com/issues/132325318.');
       }
       return 2;
     }
@@ -243,7 +243,7 @@
         );
       }
     } catch (error) {
-      printError('Error initializing DevFS: $error');
+      globals.printError('Error initializing DevFS: $error');
       return 3;
     }
     final Stopwatch initialUpdateDevFSsTimer = Stopwatch()..start();
@@ -264,7 +264,7 @@
         device.generator.accept();
       }
       for (FlutterView view in device.views) {
-        printTrace('Connected to $view.');
+        globals.printTrace('Connected to $view.');
       }
     }
 
@@ -284,22 +284,22 @@
 
     if (benchmarkMode) {
       // We are running in benchmark mode.
-      printStatus('Running in benchmark mode.');
+      globals.printStatus('Running in benchmark mode.');
       // Measure time to perform a hot restart.
-      printStatus('Benchmarking hot restart');
+      globals.printStatus('Benchmarking hot restart');
       await restart(fullRestart: true, benchmarkMode: true);
-      printStatus('Benchmarking hot reload');
+      globals.printStatus('Benchmarking hot reload');
       // Measure time to perform a hot reload.
       await restart(fullRestart: false);
       if (stayResident) {
         await waitForAppToFinish();
       } else {
-        printStatus('Benchmark completed. Exiting application.');
+        globals.printStatus('Benchmark completed. Exiting application.');
         await _cleanupDevFS();
         await stopEchoingDeviceLog();
         await exitApp();
       }
-      final File benchmarkOutput = fs.file('hot_benchmark.json');
+      final File benchmarkOutput = globals.fs.file('hot_benchmark.json');
       benchmarkOutput.writeAsStringSync(toPrettyJson(benchmarkData));
       return 0;
     }
@@ -319,12 +319,12 @@
     Completer<void> appStartedCompleter,
     String route,
   }) async {
-    if (!fs.isFileSync(mainPath)) {
+    if (!globals.fs.isFileSync(mainPath)) {
       String message = 'Tried to run $mainPath, but that file does not exist.';
       if (target == null) {
         message += '\nConsider using the -t option to specify the Dart file to start.';
       }
-      printError(message);
+      globals.printError(message);
       return 1;
     }
 
@@ -347,12 +347,12 @@
   }
 
   Future<List<Uri>> _initDevFS() async {
-    final String fsName = fs.path.basename(projectRootPath);
+    final String fsName = globals.fs.path.basename(projectRootPath);
     return <Uri>[
       for (FlutterDevice device in flutterDevices)
         await device.setupDevFS(
           fsName,
-          fs.directory(projectRootPath),
+          globals.fs.directory(projectRootPath),
           packagesFilePath: packagesFilePath,
         ),
     ];
@@ -362,7 +362,7 @@
     final bool isFirstUpload = !assetBundle.wasBuiltOnce();
     final bool rebuildBundle = assetBundle.needsBuild();
     if (rebuildBundle) {
-      printTrace('Updating assets');
+      globals.printTrace('Updating assets');
       final int result = await assetBundle.build();
       if (result != 0) {
         return UpdateFSReport(success: false);
@@ -411,7 +411,7 @@
         futures.add(device.devFS.destroy()
           .timeout(const Duration(milliseconds: 250))
           .catchError((dynamic error) {
-            printTrace('Ignored error while cleaning up DevFS: $error');
+            globals.printTrace('Ignored error while cleaning up DevFS: $error');
           }));
       }
       device.devFS = null;
@@ -432,14 +432,14 @@
   }
 
   Future<void> _launchFromDevFS(String mainScript) async {
-    final String entryUri = fs.path.relative(mainScript, from: projectRootPath);
+    final String entryUri = globals.fs.path.relative(mainScript, from: projectRootPath);
     final List<Future<void>> futures = <Future<void>>[];
     for (FlutterDevice device in flutterDevices) {
       final Uri deviceEntryUri = device.devFS.baseUri.resolveUri(
-        fs.path.toUri(entryUri));
+        globals.fs.path.toUri(entryUri));
       final Uri devicePackagesUri = device.devFS.baseUri.resolve('.packages');
       final Uri deviceAssetsDirectoryUri = device.devFS.baseUri.resolveUri(
-        fs.path.toUri(getAssetBuildDirectory()));
+        globals.fs.path.toUri(getAssetBuildDirectory()));
       futures.add(_launchInView(device,
                           deviceEntryUri,
                           devicePackagesUri,
@@ -462,7 +462,7 @@
     bool benchmarkMode = false,
   }) async {
     if (!_isPaused()) {
-      printTrace('Refreshing active FlutterViews before restarting.');
+      globals.printTrace('Refreshing active FlutterViews before restarting.');
       await refreshViews();
     }
 
@@ -510,7 +510,7 @@
     _runningFromSnapshot = false;
     await _launchFromDevFS(mainPath + '.dill');
     restartTimer.stop();
-    printTrace('Hot restart performed in ${getElapsedAsMilliseconds(restartTimer.elapsed)}.');
+    globals.printTrace('Hot restart performed in ${getElapsedAsMilliseconds(restartTimer.elapsed)}.');
     // We are now running from sources.
     _runningFromSnapshot = false;
     _addBenchmarkData('hotRestartMillisecondsToFrame',
@@ -550,7 +550,7 @@
   }) {
     if (reloadReport == null) {
       if (printErrors) {
-        printError('Hot reload did not receive reload report.');
+        globals.printError('Hot reload did not receive reload report.');
       }
       return false;
     }
@@ -568,15 +568,15 @@
           )
          )) {
       if (printErrors) {
-        printError('Hot reload received invalid response: $reloadReport');
+        globals.printError('Hot reload received invalid response: $reloadReport');
       }
       return false;
     }
     if (!(reloadReport['success'] as bool)) {
       if (printErrors) {
-        printError('Hot reload was rejected:');
+        globals.printError('Hot reload was rejected:');
         for (Map<String, dynamic> notice in reloadReport['details']['notices']) {
-          printError('${notice['message']}');
+          globals.printError('${notice['message']}');
         }
       }
       return false;
@@ -623,7 +623,7 @@
         silent: silent,
       );
       if (!silent) {
-        printStatus('Restarted application in ${getElapsedAsMilliseconds(timer.elapsed)}.');
+        globals.printStatus('Restarted application in ${getElapsedAsMilliseconds(timer.elapsed)}.');
       }
       return result;
     }
@@ -637,7 +637,7 @@
     if (result.isOk) {
       final String elapsed = getElapsedAsMilliseconds(timer.elapsed);
       if (!silent) {
-        printStatus('${result.message} in $elapsed.');
+        globals.printStatus('${result.message} in $elapsed.');
       }
     }
     return result;
@@ -656,7 +656,7 @@
     }
     Status status;
     if (!silent) {
-      status = logger.startProgress(
+      status = globals.logger.startProgress(
         'Performing hot restart...',
         timeout: timeoutConfiguration.fastOperation,
         progressId: 'hot.restart',
@@ -703,7 +703,7 @@
   }) async {
     final bool reloadOnTopOfSnapshot = _runningFromSnapshot;
     final String progressPrefix = reloadOnTopOfSnapshot ? 'Initializing' : 'Performing';
-    Status status = logger.startProgress(
+    Status status = globals.logger.startProgress(
       '$progressPrefix hot reload...',
       timeout: timeoutConfiguration.fastOperation,
       progressId: 'hot.reload',
@@ -718,7 +718,7 @@
         pause: pause,
         onSlow: (String message) {
           status?.cancel();
-          status = logger.startProgress(
+          status = globals.logger.startProgress(
             message,
             timeout: timeoutConfiguration.slowOperation,
             progressId: 'hot.reload',
@@ -765,7 +765,7 @@
     final Stopwatch reloadTimer = Stopwatch()..start();
 
     if (!_isPaused()) {
-      printTrace('Refreshing active FlutterViews before reloading.');
+      globals.printTrace('Refreshing active FlutterViews before reloading.');
       await refreshViews();
     }
 
@@ -780,7 +780,7 @@
     final Stopwatch vmReloadTimer = Stopwatch()..start();
     Map<String, dynamic> firstReloadDetails;
     try {
-      final String entryPath = fs.path.relative(
+      final String entryPath = globals.fs.path.relative(
         getReloadPath(fullRestart: false),
         from: projectRootPath,
       );
@@ -828,11 +828,11 @@
         firstReloadDetails ??= castStringKeyedMap(reloadReport['details']);
         final int loadedLibraryCount = reloadReport['details']['loadedLibraryCount'] as int;
         final int finalLibraryCount = reloadReport['details']['finalLibraryCount'] as int;
-        printTrace('reloaded $loadedLibraryCount of $finalLibraryCount libraries');
+        globals.printTrace('reloaded $loadedLibraryCount of $finalLibraryCount libraries');
         reloadMessage = 'Reloaded $loadedLibraryCount of $finalLibraryCount libraries';
       }
     } on Map<String, dynamic> catch (error, stackTrace) {
-      printTrace('Hot reload failed: $error\n$stackTrace');
+      globals.printTrace('Hot reload failed: $error\n$stackTrace');
       final int errorCode = error['code'] as int;
       String errorMessage = error['message'] as String;
       if (errorCode == Isolate.kIsolateReloadBarred) {
@@ -851,7 +851,7 @@
       }
       return OperationResult(errorCode, '$errorMessage (error code: $errorCode)');
     } catch (error, stackTrace) {
-      printTrace('Hot reload failed: $error\n$stackTrace');
+      globals.printTrace('Hot reload failed: $error\n$stackTrace');
       return OperationResult(1, '$error');
     }
     // Record time it took for the VM to reload the sources.
@@ -860,10 +860,10 @@
     // Reload the isolate.
     final List<Future<void>> allDevices = <Future<void>>[];
     for (FlutterDevice device in flutterDevices) {
-      printTrace('Sending reload events to ${device.device.name}');
+      globals.printTrace('Sending reload events to ${device.device.name}');
       final List<Future<ServiceObject>> futuresViews = <Future<ServiceObject>>[];
       for (FlutterView view in device.views) {
-        printTrace('Sending reload event to "${view.uiIsolate.name}"');
+        globals.printTrace('Sending reload event to "${view.uiIsolate.name}"');
         futuresViews.add(view.uiIsolate.reload());
       }
       allDevices.add(Future.wait(futuresViews).whenComplete(() {
@@ -900,14 +900,14 @@
         onSlow('${_describePausedIsolates(pausedIsolatesFound, serviceEventKind)}; interface might not update.');
       }
       if (reassembleViews.isEmpty) {
-        printTrace('Skipping reassemble because all isolates are paused.');
+        globals.printTrace('Skipping reassemble because all isolates are paused.');
         return OperationResult(OperationResult.ok.code, reloadMessage);
       }
     }
-    printTrace('Evicting dirty assets');
+    globals.printTrace('Evicting dirty assets');
     await _evictDirtyAssets();
     assert(reassembleViews.isNotEmpty);
-    printTrace('Reassembling application');
+    globals.printTrace('Reassembling application');
     bool failedReassemble = false;
     final List<Future<void>> futures = <Future<void>>[
       for (FlutterView view in reassembleViews)
@@ -916,7 +916,7 @@
             await view.uiIsolate.flutterReassemble();
           } catch (error) {
             failedReassemble = true;
-            printError('Reassembling ${view.uiIsolate.name} failed: $error');
+            globals.printError('Reassembling ${view.uiIsolate.name} failed: $error');
             return;
           }
         }(),
@@ -930,7 +930,7 @@
           return; // probably no point waiting, they're probably deadlocked and we've already warned.
         }
         // Check if any isolate is newly paused.
-        printTrace('This is taking a long time; will now check for paused isolates.');
+        globals.printTrace('This is taking a long time; will now check for paused isolates.');
         int postReloadPausedIsolatesFound = 0;
         String serviceEventKind;
         for (FlutterView view in reassembleViews) {
@@ -945,7 +945,7 @@
             }
           }
         }
-        printTrace('Found $postReloadPausedIsolatesFound newly paused isolate(s).');
+        globals.printTrace('Found $postReloadPausedIsolatesFound newly paused isolate(s).');
         if (postReloadPausedIsolatesFound == 0) {
           await reassembleFuture; // must just be taking a long time... keep waiting!
           return;
@@ -985,7 +985,7 @@
     ).send();
 
     if (shouldReportReloadTime) {
-      printTrace('Hot reload performed in ${getElapsedAsMilliseconds(reloadDuration)}.');
+      globals.printTrace('Hot reload performed in ${getElapsedAsMilliseconds(reloadDuration)}.');
       // Record complete time it took for the reload.
       _addBenchmarkData('hotReloadMillisecondsToFrame', reloadInMs);
     }
@@ -1050,14 +1050,14 @@
     if (canHotRestart) {
       rawMessage += 'To hot restart (and rebuild state), press "R".';
     }
-    final String message = terminal.color(
-      fire + terminal.bolden(rawMessage),
+    final String message = globals.terminal.color(
+      fire + globals.terminal.bolden(rawMessage),
       TerminalColor.red,
     );
-    printStatus(message);
+    globals.printStatus(message);
     for (FlutterDevice device in flutterDevices) {
       final String dname = device.device.name;
-      printStatus('An Observatory debugger and profiler on $dname is '
+      globals.printStatus('An Observatory debugger and profiler on $dname is '
         'available at: ${device.vmService.httpAddress}');
     }
     final String quitMessage = _didAttach
@@ -1065,9 +1065,9 @@
         : 'To quit, press "q".';
     if (details) {
       printHelpDetails();
-      printStatus('To repeat this help message, press "h". $quitMessage');
+      globals.printStatus('To repeat this help message, press "h". $quitMessage');
     } else {
-      printStatus('For a more detailed help message, press "h". $quitMessage');
+      globals.printStatus('For a more detailed help message, press "h". $quitMessage');
     }
   }
 
@@ -1078,7 +1078,7 @@
         continue;
       }
       if (device.views.first.uiIsolate == null) {
-        printError('Application isolate not found for $device');
+        globals.printError('Application isolate not found for $device');
         continue;
       }
       for (String assetPath in device.devFS.assetPathsToEvict) {
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index b9a6d91..a04e402 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -12,7 +12,6 @@
 import '../application_package.dart';
 import '../base/common.dart';
 import '../base/context.dart';
-import '../base/file_system.dart';
 import '../base/io.dart' as io;
 import '../base/signals.dart';
 import '../base/terminal.dart';
@@ -27,7 +26,7 @@
 import '../device.dart';
 import '../doctor.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import 'flutter_command_runner.dart';
@@ -525,7 +524,7 @@
           rethrow;
         } finally {
           final DateTime endTime = systemClock.now();
-          printTrace(userMessages.flutterElapsedTime(name, getElapsedAsMilliseconds(endTime.difference(startTime))));
+          globals.printTrace(userMessages.flutterElapsedTime(name, getElapsedAsMilliseconds(endTime.difference(startTime))));
           _sendPostUsage(commandPath, commandResult, startTime, endTime);
         }
       },
@@ -599,9 +598,9 @@
     if (shouldUpdateCache) {
       // First always update universal artifacts, as some of these (e.g.
       // idevice_id on macOS) are required to determine `requiredArtifacts`.
-      await cache.updateAll(<DevelopmentArtifact>{DevelopmentArtifact.universal});
+      await globals.cache.updateAll(<DevelopmentArtifact>{DevelopmentArtifact.universal});
 
-      await cache.updateAll(await requiredArtifacts);
+      await globals.cache.updateAll(await requiredArtifacts);
     }
 
     await validateCommand();
@@ -643,29 +642,29 @@
   /// then print an error message and return null.
   Future<List<Device>> findAllTargetDevices() async {
     if (!doctor.canLaunchAnything) {
-      printError(userMessages.flutterNoDevelopmentDevice);
+      globals.printError(userMessages.flutterNoDevelopmentDevice);
       return null;
     }
 
     List<Device> devices = await deviceManager.findTargetDevices(FlutterProject.current());
 
     if (devices.isEmpty && deviceManager.hasSpecifiedDeviceId) {
-      printStatus(userMessages.flutterNoMatchingDevice(deviceManager.specifiedDeviceId));
+      globals.printStatus(userMessages.flutterNoMatchingDevice(deviceManager.specifiedDeviceId));
       return null;
     } else if (devices.isEmpty && deviceManager.hasSpecifiedAllDevices) {
-      printStatus(userMessages.flutterNoDevicesFound);
+      globals.printStatus(userMessages.flutterNoDevicesFound);
       return null;
     } else if (devices.isEmpty) {
-      printStatus(userMessages.flutterNoSupportedDevices);
+      globals.printStatus(userMessages.flutterNoSupportedDevices);
       return null;
     } else if (devices.length > 1 && !deviceManager.hasSpecifiedAllDevices) {
       if (deviceManager.hasSpecifiedDeviceId) {
-        printStatus(userMessages.flutterFoundSpecifiedDevices(devices.length, deviceManager.specifiedDeviceId));
+       globals.printStatus(userMessages.flutterFoundSpecifiedDevices(devices.length, deviceManager.specifiedDeviceId));
       } else {
-        printStatus(userMessages.flutterSpecifyDeviceWithAllOption);
+        globals.printStatus(userMessages.flutterSpecifyDeviceWithAllOption);
         devices = await deviceManager.getAllConnectedDevices().toList();
       }
-      printStatus('');
+      globals.printStatus('');
       await Device.printDevices(devices);
       return null;
     }
@@ -682,9 +681,9 @@
       return null;
     }
     if (deviceList.length > 1) {
-      printStatus(userMessages.flutterSpecifyDevice);
+      globals.printStatus(userMessages.flutterSpecifyDevice);
       deviceList = await deviceManager.getAllConnectedDevices().toList();
-      printStatus('');
+      globals.printStatus('');
       await Device.printDevices(deviceList);
       return null;
     }
@@ -696,7 +695,7 @@
   Future<void> validateCommand() async {
     if (_requiresPubspecYaml && !PackageMap.isUsingCustomPackagesPath) {
       // Don't expect a pubspec.yaml file if the user passed in an explicit .packages file path.
-      if (!fs.isFileSync('pubspec.yaml')) {
+      if (!globals.fs.isFileSync('pubspec.yaml')) {
         throw ToolExit(userMessages.flutterNoPubspec);
       }
 
@@ -711,7 +710,7 @@
 
     if (_usesTargetOption) {
       final String targetPath = targetFile;
-      if (!fs.isFileSync(targetPath)) {
+      if (!globals.fs.isFileSync(targetPath)) {
         throw ToolExit(userMessages.flutterTargetFileMissing(targetPath));
       }
     }
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index 1a2c0fa..ca6d672 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -15,7 +15,6 @@
 import '../base/file_system.dart';
 import '../base/io.dart' as io;
 import '../base/logger.dart';
-import '../base/platform.dart';
 import '../base/terminal.dart';
 import '../base/user_messages.dart';
 import '../base/utils.dart';
@@ -23,7 +22,7 @@
 import '../convert.dart';
 import '../dart/package_map.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../reporting/reporting.dart';
 import '../tester/flutter_tester.dart';
 import '../version.dart';
@@ -93,7 +92,7 @@
 
     String packagesHelp;
     bool showPackagesCommand;
-    if (fs.isFileSync(kPackagesFileName)) {
+    if (globals.fs.isFileSync(kPackagesFileName)) {
       packagesHelp = '(defaults to "$kPackagesFileName")';
       showPackagesCommand = verboseHelp;
     } else {
@@ -157,25 +156,25 @@
   }
 
   static String get defaultFlutterRoot {
-    if (platform.environment.containsKey(kFlutterRootEnvironmentVariableName)) {
-      return platform.environment[kFlutterRootEnvironmentVariableName];
+    if (globals.platform.environment.containsKey(kFlutterRootEnvironmentVariableName)) {
+      return globals.platform.environment[kFlutterRootEnvironmentVariableName];
     }
     try {
-      if (platform.script.scheme == 'data') {
+      if (globals.platform.script.scheme == 'data') {
         return '../..'; // we're running as a test
       }
 
-      if (platform.script.scheme == 'package') {
-        final String packageConfigPath = Uri.parse(platform.packageConfig).toFilePath();
-        return fs.path.dirname(fs.path.dirname(fs.path.dirname(packageConfigPath)));
+      if (globals.platform.script.scheme == 'package') {
+        final String packageConfigPath = Uri.parse(globals.platform.packageConfig).toFilePath();
+        return globals.fs.path.dirname(globals.fs.path.dirname(globals.fs.path.dirname(packageConfigPath)));
       }
 
-      final String script = platform.script.toFilePath();
-      if (fs.path.basename(script) == kSnapshotFileName) {
-        return fs.path.dirname(fs.path.dirname(fs.path.dirname(script)));
+      final String script = globals.platform.script.toFilePath();
+      if (globals.fs.path.basename(script) == kSnapshotFileName) {
+        return globals.fs.path.dirname(globals.fs.path.dirname(globals.fs.path.dirname(script)));
       }
-      if (fs.path.basename(script) == kFlutterToolsScriptFileName) {
-        return fs.path.dirname(fs.path.dirname(fs.path.dirname(fs.path.dirname(script))));
+      if (globals.fs.path.basename(script) == kFlutterToolsScriptFileName) {
+        return globals.fs.path.dirname(globals.fs.path.dirname(globals.fs.path.dirname(globals.fs.path.dirname(script))));
       }
 
       // If run from a bare script within the repo.
@@ -234,7 +233,7 @@
     // Check for verbose.
     if (topLevelResults['verbose'] as bool) {
       // Override the logger.
-      contextOverrides[Logger] = VerboseLogger(logger);
+      contextOverrides[Logger] = VerboseLogger(globals.logger);
     }
 
     // Don't set wrapColumns unless the user said to: if it's set, then all
@@ -271,7 +270,7 @@
     // We must set Cache.flutterRoot early because other features use it (e.g.
     // enginePath's initializer uses it).
     final String flutterRoot = topLevelResults['flutter-root'] as String ?? defaultFlutterRoot;
-    Cache.flutterRoot = fs.path.normalize(fs.path.absolute(flutterRoot));
+    Cache.flutterRoot = globals.fs.path.normalize(globals.fs.path.absolute(flutterRoot));
 
     // Set up the tooling configuration.
     final String enginePath = _findEnginePath(topLevelResults);
@@ -286,9 +285,9 @@
         return MapEntry<Type, Generator>(type, () => value);
       }),
       body: () async {
-        logger.quiet = topLevelResults['quiet'] as bool;
+        globals.logger.quiet = topLevelResults['quiet'] as bool;
 
-        if (platform.environment['FLUTTER_ALREADY_LOCKED'] != 'true') {
+        if (globals.platform.environment['FLUTTER_ALREADY_LOCKED'] != 'true') {
           await Cache.lock();
         }
 
@@ -300,8 +299,8 @@
         try {
           await FlutterVersion.instance.ensureVersionFile();
         } on FileSystemException catch (e) {
-          printError('Failed to write the version file to the artifact cache: "$e".');
-          printError('Please ensure you have permissions in the artifact cache directory.');
+          globals.printError('Failed to write the version file to the artifact cache: "$e".');
+          globals.printError('Please ensure you have permissions in the artifact cache directory.');
           throwToolExit('Failed to write the version file');
         }
         if (topLevelResults.command?.name != 'upgrade' && topLevelResults['version-check'] as bool) {
@@ -309,7 +308,7 @@
         }
 
         if (topLevelResults.wasParsed('packages')) {
-          PackageMap.globalPackagesPath = fs.path.normalize(fs.path.absolute(topLevelResults['packages'] as String));
+          PackageMap.globalPackagesPath = globals.fs.path.normalize(globals.fs.path.absolute(topLevelResults['packages'] as String));
         }
 
         // See if the user specified a specific device.
@@ -323,7 +322,7 @@
           } else {
             status = FlutterVersion.instance.toString();
           }
-          printStatus(status);
+          globals.printStatus(status);
           return;
         }
 
@@ -336,27 +335,28 @@
   }
 
   String _tryEnginePath(String enginePath) {
-    if (fs.isDirectorySync(fs.path.join(enginePath, 'out'))) {
+    if (globals.fs.isDirectorySync(globals.fs.path.join(enginePath, 'out'))) {
       return enginePath;
     }
     return null;
   }
 
   String _findEnginePath(ArgResults globalResults) {
-    String engineSourcePath = globalResults['local-engine-src-path'] as String ?? platform.environment[kFlutterEngineEnvironmentVariableName];
+    String engineSourcePath = globalResults['local-engine-src-path'] as String
+      ?? globals.platform.environment[kFlutterEngineEnvironmentVariableName];
 
     if (engineSourcePath == null && globalResults['local-engine'] != null) {
       try {
         Uri engineUri = PackageMap(PackageMap.globalPackagesPath).map[kFlutterEnginePackageName];
         // Skip if sky_engine is the self-contained one.
-        if (engineUri != null && fs.identicalSync(fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'pkg', kFlutterEnginePackageName, 'lib'), engineUri.path)) {
+        if (engineUri != null && globals.fs.identicalSync(globals.fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'pkg', kFlutterEnginePackageName, 'lib'), engineUri.path)) {
           engineUri = null;
         }
         // If sky_engine is specified and the engineSourcePath not set, try to determine the engineSourcePath by sky_engine setting.
         // A typical engineUri looks like: file://flutter-engine-local-path/src/out/host_debug_unopt/gen/dart-pkg/sky_engine/lib/
         if (engineUri?.path != null) {
-          engineSourcePath = fs.directory(engineUri.path)?.parent?.parent?.parent?.parent?.parent?.parent?.path;
-          if (engineSourcePath != null && (engineSourcePath == fs.path.dirname(engineSourcePath) || engineSourcePath.isEmpty)) {
+          engineSourcePath = globals.fs.directory(engineUri.path)?.parent?.parent?.parent?.parent?.parent?.parent?.path;
+          if (engineSourcePath != null && (engineSourcePath == globals.fs.path.dirname(engineSourcePath) || engineSourcePath.isEmpty)) {
             engineSourcePath = null;
             throwToolExit(userMessages.runnerNoEngineSrcDir(kFlutterEnginePackageName, kFlutterEngineEnvironmentVariableName),
               exitCode: 2);
@@ -368,7 +368,7 @@
         engineSourcePath = null;
       }
       // If engineSourcePath is still not set, try to determine it by flutter root.
-      engineSourcePath ??= _tryEnginePath(fs.path.join(fs.directory(Cache.flutterRoot).parent.path, 'engine', 'src'));
+      engineSourcePath ??= _tryEnginePath(globals.fs.path.join(globals.fs.directory(Cache.flutterRoot).parent.path, 'engine', 'src'));
     }
 
     if (engineSourcePath != null && _tryEnginePath(engineSourcePath) == null) {
@@ -400,15 +400,15 @@
       throwToolExit(userMessages.runnerLocalEngineRequired, exitCode: 2);
     }
 
-    final String engineBuildPath = fs.path.normalize(fs.path.join(enginePath, 'out', localEngine));
-    if (!fs.isDirectorySync(engineBuildPath)) {
+    final String engineBuildPath = globals.fs.path.normalize(globals.fs.path.join(enginePath, 'out', localEngine));
+    if (!globals.fs.isDirectorySync(engineBuildPath)) {
       throwToolExit(userMessages.runnerNoEngineBuild(engineBuildPath), exitCode: 2);
     }
 
-    final String basename = fs.path.basename(engineBuildPath);
+    final String basename = globals.fs.path.basename(engineBuildPath);
     final String hostBasename = _getHostEngineBasename(basename);
-    final String engineHostBuildPath = fs.path.normalize(fs.path.join(fs.path.dirname(engineBuildPath), hostBasename));
-    if (!fs.isDirectorySync(engineHostBuildPath)) {
+    final String engineHostBuildPath = globals.fs.path.normalize(globals.fs.path.join(globals.fs.path.dirname(engineBuildPath), hostBasename));
+    if (!globals.fs.isDirectorySync(engineHostBuildPath)) {
       throwToolExit(userMessages.runnerNoEngineBuild(engineHostBuildPath), exitCode: 2);
     }
 
@@ -421,10 +421,10 @@
 
   /// Get the root directories of the repo - the directories containing Dart packages.
   List<String> getRepoRoots() {
-    final String root = fs.path.absolute(Cache.flutterRoot);
+    final String root = globals.fs.path.absolute(Cache.flutterRoot);
     // not bin, and not the root
     return <String>['dev', 'examples', 'packages'].map<String>((String item) {
-      return fs.path.join(root, item);
+      return globals.fs.path.join(root, item);
     }).toList();
   }
 
@@ -432,27 +432,27 @@
   List<Directory> getRepoPackages() {
     return getRepoRoots()
       .expand<String>((String root) => _gatherProjectPaths(root))
-      .map<Directory>((String dir) => fs.directory(dir))
+      .map<Directory>((String dir) => globals.fs.directory(dir))
       .toList();
   }
 
   static List<String> _gatherProjectPaths(String rootPath) {
-    if (fs.isFileSync(fs.path.join(rootPath, '.dartignore'))) {
+    if (globals.fs.isFileSync(globals.fs.path.join(rootPath, '.dartignore'))) {
       return <String>[];
     }
 
 
-    final List<String> projectPaths = fs.directory(rootPath)
+    final List<String> projectPaths = globals.fs.directory(rootPath)
       .listSync(followLinks: false)
       .expand((FileSystemEntity entity) {
-        if (entity is Directory && !fs.path.split(entity.path).contains('.dart_tool')) {
+        if (entity is Directory && !globals.fs.path.split(entity.path).contains('.dart_tool')) {
           return _gatherProjectPaths(entity.path);
         }
         return <String>[];
       })
       .toList();
 
-    if (fs.isFileSync(fs.path.join(rootPath, 'pubspec.yaml'))) {
+    if (globals.fs.isFileSync(globals.fs.path.join(rootPath, 'pubspec.yaml'))) {
       projectPaths.add(rootPath);
     }
 
@@ -462,19 +462,19 @@
   void _checkFlutterCopy() {
     // If the current directory is contained by a flutter repo, check that it's
     // the same flutter that is currently running.
-    String directory = fs.path.normalize(fs.path.absolute(fs.currentDirectory.path));
+    String directory = globals.fs.path.normalize(globals.fs.path.absolute(globals.fs.currentDirectory.path));
 
     // Check if the cwd is a flutter dir.
     while (directory.isNotEmpty) {
       if (_isDirectoryFlutterRepo(directory)) {
         if (!_compareResolvedPaths(directory, Cache.flutterRoot)) {
-          printError(userMessages.runnerWrongFlutterInstance(Cache.flutterRoot, directory));
+          globals.printError(userMessages.runnerWrongFlutterInstance(Cache.flutterRoot, directory));
         }
 
         break;
       }
 
-      final String parent = fs.path.dirname(directory);
+      final String parent = globals.fs.path.dirname(directory);
       if (parent == directory) {
         break;
       }
@@ -482,7 +482,7 @@
     }
 
     // Check that the flutter running is that same as the one referenced in the pubspec.
-    if (fs.isFileSync(kPackagesFileName)) {
+    if (globals.fs.isFileSync(kPackagesFileName)) {
       final PackageMap packageMap = PackageMap(kPackagesFileName);
       Uri flutterUri;
       try {
@@ -491,19 +491,19 @@
         // We're not quite sure why this can happen, perhaps the user
         // accidentally edited the .packages file. Re-running pub should
         // fix the issue, and we definitely shouldn't crash here.
-        printTrace('Failed to parse .packages file to check flutter dependency.');
+        globals.printTrace('Failed to parse .packages file to check flutter dependency.');
         return;
       }
 
       if (flutterUri != null && (flutterUri.scheme == 'file' || flutterUri.scheme == '')) {
         // .../flutter/packages/flutter/lib
         final Uri rootUri = flutterUri.resolve('../../..');
-        final String flutterPath = fs.path.normalize(fs.file(rootUri).absolute.path);
+        final String flutterPath = globals.fs.path.normalize(globals.fs.file(rootUri).absolute.path);
 
-        if (!fs.isDirectorySync(flutterPath)) {
-          printError(userMessages.runnerRemovedFlutterRepo(Cache.flutterRoot, flutterPath));
+        if (!globals.fs.isDirectorySync(flutterPath)) {
+          globals.printError(userMessages.runnerRemovedFlutterRepo(Cache.flutterRoot, flutterPath));
         } else if (!_compareResolvedPaths(flutterPath, Cache.flutterRoot)) {
-          printError(userMessages.runnerChangedFlutterRepo(Cache.flutterRoot, flutterPath));
+          globals.printError(userMessages.runnerChangedFlutterRepo(Cache.flutterRoot, flutterPath));
         }
       }
     }
@@ -512,14 +512,14 @@
   // Check if `bin/flutter` and `bin/cache/engine.stamp` exist.
   bool _isDirectoryFlutterRepo(String directory) {
     return
-      fs.isFileSync(fs.path.join(directory, 'bin/flutter')) &&
-      fs.isFileSync(fs.path.join(directory, 'bin/cache/engine.stamp'));
+      globals.fs.isFileSync(globals.fs.path.join(directory, 'bin/flutter')) &&
+      globals.fs.isFileSync(globals.fs.path.join(directory, 'bin/cache/engine.stamp'));
   }
 }
 
 bool _compareResolvedPaths(String path1, String path2) {
-  path1 = fs.directory(fs.path.absolute(path1)).resolveSymbolicLinksSync();
-  path2 = fs.directory(fs.path.absolute(path2)).resolveSymbolicLinksSync();
+  path1 = globals.fs.directory(globals.fs.path.absolute(path1)).resolveSymbolicLinksSync();
+  path2 = globals.fs.directory(globals.fs.path.absolute(path2)).resolveSymbolicLinksSync();
 
   return path1 == path2;
 }
diff --git a/packages/flutter_tools/lib/src/template.dart b/packages/flutter_tools/lib/src/template.dart
index e622960..f47f450 100644
--- a/packages/flutter_tools/lib/src/template.dart
+++ b/packages/flutter_tools/lib/src/template.dart
@@ -7,7 +7,7 @@
 import 'base/common.dart';
 import 'base/file_system.dart';
 import 'cache.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 
 /// Expands templates in a directory to a destination. All files that must
 /// undergo template expansion should end with the '.tmpl' extension. All other
@@ -39,14 +39,14 @@
         continue;
       }
 
-      final String relativePath = fs.path.relative(entity.path,
+      final String relativePath = globals.fs.path.relative(entity.path,
           from: baseDir.absolute.path);
 
       if (relativePath.contains(templateExtension)) {
         // If '.tmpl' appears anywhere within the path of this entity, it is
         // is a candidate for rendering. This catches cases where the folder
         // itself is a template.
-        _templateFilePaths[relativePath] = fs.path.absolute(entity.path);
+        _templateFilePaths[relativePath] = globals.fs.path.absolute(entity.path);
       }
     }
   }
@@ -75,7 +75,7 @@
     try {
       destination.createSync(recursive: true);
     } on FileSystemException catch (err) {
-      printError(err.toString());
+      globals.printError(err.toString());
       throwToolExit('Failed to flutter create at ${destination.path}.');
       return 0;
     }
@@ -110,8 +110,8 @@
       final String androidIdentifier = context['androidIdentifier'] as String;
       final String pluginClass = context['pluginClass'] as String;
       final String destinationDirPath = destination.absolute.path;
-      final String pathSeparator = fs.path.separator;
-      String finalDestinationPath = fs.path
+      final String pathSeparator = globals.fs.path.separator;
+      String finalDestinationPath = globals.fs.path
         .join(destinationDirPath, relativeDestinationPath)
         .replaceAll(copyTemplateExtension, '')
         .replaceAll(templateExtension, '');
@@ -139,8 +139,8 @@
       if (finalDestinationPath == null) {
         return;
       }
-      final File finalDestinationFile = fs.file(finalDestinationPath);
-      final String relativePathForLogging = fs.path.relative(finalDestinationFile.path);
+      final File finalDestinationFile = globals.fs.file(finalDestinationPath);
+      final String relativePathForLogging = globals.fs.path.relative(finalDestinationFile.path);
 
       // Step 1: Check if the file needs to be overwritten.
 
@@ -148,25 +148,25 @@
         if (overwriteExisting) {
           finalDestinationFile.deleteSync(recursive: true);
           if (printStatusWhenWriting) {
-            printStatus('  $relativePathForLogging (overwritten)');
+            globals.printStatus('  $relativePathForLogging (overwritten)');
           }
         } else {
           // The file exists but we cannot overwrite it, move on.
           if (printStatusWhenWriting) {
-            printTrace('  $relativePathForLogging (existing - skipped)');
+            globals.printTrace('  $relativePathForLogging (existing - skipped)');
           }
           return;
         }
       } else {
         if (printStatusWhenWriting) {
-          printStatus('  $relativePathForLogging (created)');
+          globals.printStatus('  $relativePathForLogging (created)');
         }
       }
 
       fileCount++;
 
       finalDestinationFile.createSync(recursive: true);
-      final File sourceFile = fs.file(absoluteSourcePath);
+      final File sourceFile = globals.fs.file(absoluteSourcePath);
 
       // Step 2: If the absolute paths ends with a '.copy.tmpl', this file does
       //         not need mustache rendering but needs to be directly copied.
@@ -200,7 +200,7 @@
 }
 
 Directory templateDirectoryInPackage(String name) {
-  final String templatesDir = fs.path.join(Cache.flutterRoot,
+  final String templatesDir = globals.fs.path.join(Cache.flutterRoot,
       'packages', 'flutter_tools', 'templates');
-  return fs.directory(fs.path.join(templatesDir, name));
+  return globals.fs.directory(globals.fs.path.join(templatesDir, name));
 }
diff --git a/packages/flutter_tools/lib/src/test/coverage_collector.dart b/packages/flutter_tools/lib/src/test/coverage_collector.dart
index af590dd..b9dad72 100644
--- a/packages/flutter_tools/lib/src/test/coverage_collector.dart
+++ b/packages/flutter_tools/lib/src/test/coverage_collector.dart
@@ -10,11 +10,10 @@
 import '../base/io.dart';
 import '../base/logger.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../base/utils.dart';
 import '../dart/package_map.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../vmservice.dart';
 
 import 'watcher.dart';
@@ -28,7 +27,7 @@
 
   @override
   Future<void> handleFinishedTest(ProcessEvent event) async {
-    printTrace('test ${event.childIndex}: collecting coverage');
+    globals.printTrace('test ${event.childIndex}: collecting coverage');
     await collectCoverage(event.process, event.observatoryUri);
   }
 
@@ -70,7 +69,7 @@
     assert(process != null);
     assert(observatoryUri != null);
     final int pid = process.pid;
-    printTrace('pid $pid: collecting coverage data from $observatoryUri...');
+    globals.printTrace('pid $pid: collecting coverage data from $observatoryUri...');
 
     Map<String, dynamic> data;
     final Future<void> processComplete = process.exitCode
@@ -87,9 +86,9 @@
     await Future.any<void>(<Future<void>>[ processComplete, collectionComplete ]);
     assert(data != null);
 
-    printTrace('pid $pid ($observatoryUri): collected coverage data; merging...');
+    globals.printTrace('pid $pid ($observatoryUri): collected coverage data; merging...');
     _addHitmap(coverage.createHitmap(data['coverage'] as List<dynamic>));
-    printTrace('pid $pid ($observatoryUri): done merging coverage data into global coverage map.');
+    globals.printTrace('pid $pid ($observatoryUri): done merging coverage data into global coverage map.');
   }
 
   /// Returns a future that will complete with the formatted coverage data
@@ -106,9 +105,9 @@
     }
     if (formatter == null) {
       final coverage.Resolver resolver = coverage.Resolver(packagesPath: PackageMap.globalPackagesPath);
-      final String packagePath = fs.currentDirectory.path;
+      final String packagePath = globals.fs.currentDirectory.path;
       final List<String> reportOn = coverageDirectory == null
-        ? <String>[fs.path.join(packagePath, 'lib')]
+        ? <String>[globals.fs.path.join(packagePath, 'lib')]
         : <String>[coverageDirectory.path];
       formatter = coverage.LcovFormatter(resolver, reportOn: reportOn, basePath: packagePath);
     }
@@ -118,42 +117,42 @@
   }
 
   Future<bool> collectCoverageData(String coveragePath, { bool mergeCoverageData = false, Directory coverageDirectory }) async {
-    final Status status = logger.startProgress('Collecting coverage information...', timeout: timeoutConfiguration.fastOperation);
+    final Status status = globals.logger.startProgress('Collecting coverage information...', timeout: timeoutConfiguration.fastOperation);
     final String coverageData = await finalizeCoverage(
       coverageDirectory: coverageDirectory,
     );
     status.stop();
-    printTrace('coverage information collection complete');
+    globals.printTrace('coverage information collection complete');
     if (coverageData == null) {
       return false;
     }
 
-    final File coverageFile = fs.file(coveragePath)
+    final File coverageFile = globals.fs.file(coveragePath)
       ..createSync(recursive: true)
       ..writeAsStringSync(coverageData, flush: true);
-    printTrace('wrote coverage data to $coveragePath (size=${coverageData.length})');
+    globals.printTrace('wrote coverage data to $coveragePath (size=${coverageData.length})');
 
     const String baseCoverageData = 'coverage/lcov.base.info';
     if (mergeCoverageData) {
-      if (!fs.isFileSync(baseCoverageData)) {
-        printError('Missing "$baseCoverageData". Unable to merge coverage data.');
+      if (!globals.fs.isFileSync(baseCoverageData)) {
+        globals.printError('Missing "$baseCoverageData". Unable to merge coverage data.');
         return false;
       }
 
       if (os.which('lcov') == null) {
         String installMessage = 'Please install lcov.';
-        if (platform.isLinux) {
+        if (globals.platform.isLinux) {
           installMessage = 'Consider running "sudo apt-get install lcov".';
-        } else if (platform.isMacOS) {
+        } else if (globals.platform.isMacOS) {
           installMessage = 'Consider running "brew install lcov".';
         }
-        printError('Missing "lcov" tool. Unable to merge coverage data.\n$installMessage');
+        globals.printError('Missing "lcov" tool. Unable to merge coverage data.\n$installMessage');
         return false;
       }
 
-      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_test_coverage.');
+      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_test_coverage.');
       try {
-        final File sourceFile = coverageFile.copySync(fs.path.join(tempDir.path, 'lcov.source.info'));
+        final File sourceFile = coverageFile.copySync(globals.fs.path.join(tempDir.path, 'lcov.source.info'));
         final RunResult result = processUtils.runSync(<String>[
           'lcov',
           '--add-tracefile', baseCoverageData,
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index be1e878..8b73b57 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -16,13 +16,11 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
 import '../build_info.dart';
 import '../compile.dart';
 import '../convert.dart';
 import '../dart/package_map.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../test/test_wrapper.dart';
 import '../vmservice.dart';
@@ -378,7 +376,7 @@
       await compiler.compiler.compileExpression(expression, definitions,
         typeDefinitions, libraryUri, klass, isStatic);
     if (compilerOutput != null && compilerOutput.outputFilename != null) {
-      return base64.encode(fs.file(compilerOutput.outputFilename).readAsBytesSync());
+      return base64.encode(globals.fs.file(compilerOutput.outputFilename).readAsBytesSync());
     }
     throw 'Failed to compile $expression';
   }
@@ -395,7 +393,7 @@
     StreamChannel<dynamic> controller,
     int ourTestCount,
   ) async {
-    printTrace('test $ourTestCount: starting test $testPath');
+    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
 
@@ -411,7 +409,7 @@
       // Prepare our WebSocket server to talk to the engine subproces.
       final HttpServer server = await bind(host, port);
       finalizers.add(() async {
-        printTrace('test $ourTestCount: shutting down test harness socket server');
+        globals.printTrace('test $ourTestCount: shutting down test harness socket server');
         await server.close(force: true);
       });
       final Completer<WebSocket> webSocket = Completer<WebSocket>();
@@ -423,18 +421,18 @@
         },
         onError: (dynamic error, StackTrace stack) {
           // If you reach here, it's unlikely we're going to be able to really handle this well.
-          printTrace('test $ourTestCount: test harness socket server experienced an unexpected error: $error');
+          globals.printTrace('test $ourTestCount: test harness socket server experienced an unexpected error: $error');
           if (!controllerSinkClosed) {
             controller.sink.addError(error, stack);
             controller.sink.close();
           } else {
-            printError('unexpected error from test harness socket server: $error');
+            globals.printError('unexpected error from test harness socket server: $error');
           }
         },
         cancelOnError: true,
       );
 
-      printTrace('test $ourTestCount: starting shell process');
+      globals.printTrace('test $ourTestCount: starting shell process');
 
       // If a kernel file is given, then use that to launch the test.
       // If mapping is provided, look kernel file from mapping.
@@ -471,7 +469,7 @@
       subprocessActive = true;
       finalizers.add(() async {
         if (subprocessActive) {
-          printTrace('test $ourTestCount: ensuring end-of-process for shell');
+          globals.printTrace('test $ourTestCount: ensuring end-of-process for shell');
           process.kill();
           final int exitCode = await process.exitCode;
           subprocessActive = false;
@@ -504,20 +502,20 @@
           assert(explicitObservatoryPort == null ||
               explicitObservatoryPort == detectedUri.port);
           if (startPaused && !machine) {
-            printStatus('The test process has been started.');
-            printStatus('You can now connect to it using observatory. To connect, load the following Web site in your browser:');
-            printStatus('  $detectedUri');
-            printStatus('You should first set appropriate breakpoints, then resume the test in the debugger.');
+            globals.printStatus('The test process has been started.');
+            globals.printStatus('You can now connect to it using observatory. To connect, load the following Web site in your browser:');
+            globals.printStatus('  $detectedUri');
+            globals.printStatus('You should first set appropriate breakpoints, then resume the test in the debugger.');
           } else {
-            printTrace('test $ourTestCount: using observatory uri $detectedUri from pid ${process.pid}');
+            globals.printTrace('test $ourTestCount: using observatory uri $detectedUri from pid ${process.pid}');
           }
           processObservatoryUri = detectedUri;
           {
-            printTrace('Connecting to service protocol: $processObservatoryUri');
+            globals.printTrace('Connecting to service protocol: $processObservatoryUri');
             final Future<VMService> localVmService = VMService.connect(processObservatoryUri,
               compileExpression: _compileExpressionService);
             localVmService.then((VMService vmservice) {
-              printTrace('Successfully connected to service protocol: $processObservatoryUri');
+              globals.printTrace('Successfully connected to service protocol: $processObservatoryUri');
             });
           }
           gotProcessObservatoryUri.complete();
@@ -534,7 +532,7 @@
       // The engine could crash, in which case process.exitCode will complete.
       // The engine could connect to us, in which case webSocket.future will complete.
       // The local test harness could get bored of us.
-      printTrace('test $ourTestCount: awaiting initial result for pid ${process.pid}');
+      globals.printTrace('test $ourTestCount: awaiting initial result for pid ${process.pid}');
       final InitialResult initialResult = await Future.any<InitialResult>(<Future<InitialResult>>[
         process.exitCode.then<InitialResult>((int exitCode) => InitialResult.crashed),
         timeout.future.then<InitialResult>((void value) => InitialResult.timedOut),
@@ -548,7 +546,7 @@
 
       switch (initialResult) {
         case InitialResult.crashed:
-          printTrace('test $ourTestCount: process with pid ${process.pid} crashed before connecting to test harness');
+          globals.printTrace('test $ourTestCount: process with pid ${process.pid} crashed before connecting to test harness');
           final int exitCode = await process.exitCode;
           subprocessActive = false;
           final String message = _getErrorMessage(
@@ -559,7 +557,7 @@
           controller.sink.addError(message);
           // Awaited for with 'sink.done' below.
           unawaited(controller.sink.close());
-          printTrace('test $ourTestCount: waiting for controller sink to close');
+          globals.printTrace('test $ourTestCount: waiting for controller sink to close');
           await controller.sink.done;
           await watcher?.handleTestCrashed(ProcessEvent(ourTestCount, process));
           break;
@@ -567,18 +565,18 @@
           // Could happen either if the process takes a long time starting
           // (_kTestProcessTimeout), or if once Dart code starts running, it takes a
           // long time to open the WebSocket connection (_kTestStartupTimeout).
-          printTrace('test $ourTestCount: timed out waiting for process with pid ${process.pid} to connect to test harness');
+          globals.printTrace('test $ourTestCount: timed out waiting for process with pid ${process.pid} to connect to test harness');
           final String message = _getErrorMessage('Test never connected to test harness.', testPath, shellPath);
           controller.sink.addError(message);
           // Awaited for with 'sink.done' below.
           unawaited(controller.sink.close());
-          printTrace('test $ourTestCount: waiting for controller sink to close');
+          globals.printTrace('test $ourTestCount: waiting for controller sink to close');
           await controller.sink.done;
           await watcher
               ?.handleTestTimedOut(ProcessEvent(ourTestCount, process));
           break;
         case InitialResult.connected:
-          printTrace('test $ourTestCount: process with pid ${process.pid} connected to test harness');
+          globals.printTrace('test $ourTestCount: process with pid ${process.pid} connected to test harness');
           final WebSocket testSocket = await webSocket.future;
 
           final Completer<void> harnessDone = Completer<void>();
@@ -590,12 +588,12 @@
             onDone: harnessDone.complete,
             onError: (dynamic error, StackTrace stack) {
               // If you reach here, it's unlikely we're going to be able to really handle this well.
-              printError('test harness controller stream experienced an unexpected error\ntest: $testPath\nerror: $error');
+              globals.printError('test harness controller stream experienced an unexpected error\ntest: $testPath\nerror: $error');
               if (!controllerSinkClosed) {
                 controller.sink.addError(error, stack);
                 controller.sink.close();
               } else {
-                printError('unexpected error from test harness controller stream: $error');
+                globals.printError('unexpected error from test harness controller stream: $error');
               }
             },
             cancelOnError: true,
@@ -610,18 +608,18 @@
             onDone: testDone.complete,
             onError: (dynamic error, StackTrace stack) {
               // If you reach here, it's unlikely we're going to be able to really handle this well.
-              printError('test socket stream experienced an unexpected error\ntest: $testPath\nerror: $error');
+              globals.printError('test socket stream experienced an unexpected error\ntest: $testPath\nerror: $error');
               if (!controllerSinkClosed) {
                 controller.sink.addError(error, stack);
                 controller.sink.close();
               } else {
-                printError('unexpected error from test socket stream: $error');
+                globals.printError('unexpected error from test socket stream: $error');
               }
             },
             cancelOnError: true,
           );
 
-          printTrace('test $ourTestCount: awaiting test result for pid ${process.pid}');
+          globals.printTrace('test $ourTestCount: awaiting test result for pid ${process.pid}');
           final TestResult testResult = await Future.any<TestResult>(<Future<TestResult>>[
             process.exitCode.then<TestResult>((int exitCode) {
               return TestResult.crashed;
@@ -641,7 +639,7 @@
 
           switch (testResult) {
             case TestResult.crashed:
-              printTrace('test $ourTestCount: process with pid ${process.pid} crashed');
+              globals.printTrace('test $ourTestCount: process with pid ${process.pid} crashed');
               final int exitCode = await process.exitCode;
               subprocessActive = false;
               final String message = _getErrorMessage(
@@ -652,16 +650,16 @@
               controller.sink.addError(message);
               // Awaited for with 'sink.done' below.
               unawaited(controller.sink.close());
-              printTrace('test $ourTestCount: waiting for controller sink to close');
+              globals.printTrace('test $ourTestCount: waiting for controller sink to close');
               await controller.sink.done;
               break;
             case TestResult.harnessBailed:
             case TestResult.testBailed:
               if (testResult == TestResult.harnessBailed) {
-                printTrace('test $ourTestCount: process with pid ${process.pid} no longer needed by test harness');
+                globals.printTrace('test $ourTestCount: process with pid ${process.pid} no longer needed by test harness');
               } else {
                 assert(testResult == TestResult.testBailed);
-                printTrace('test $ourTestCount: process with pid ${process.pid} no longer needs test harness');
+                globals.printTrace('test $ourTestCount: process with pid ${process.pid} no longer needs test harness');
               }
               await watcher?.handleFinishedTest(
                   ProcessEvent(ourTestCount, process, processObservatoryUri));
@@ -670,25 +668,25 @@
           break;
       }
     } catch (error, stack) {
-      printTrace('test $ourTestCount: error caught during test; ${controllerSinkClosed ? "reporting to console" : "sending to test framework"}');
+      globals.printTrace('test $ourTestCount: error caught during test; ${controllerSinkClosed ? "reporting to console" : "sending to test framework"}');
       if (!controllerSinkClosed) {
         controller.sink.addError(error, stack);
       } else {
-        printError('unhandled error during test:\n$testPath\n$error\n$stack');
+        globals.printError('unhandled error during test:\n$testPath\n$error\n$stack');
         outOfBandError ??= _AsyncError(error, stack);
       }
     } finally {
-      printTrace('test $ourTestCount: cleaning up...');
+      globals.printTrace('test $ourTestCount: cleaning up...');
       // Finalizers are treated like a stack; run them in reverse order.
       for (Finalizer finalizer in finalizers.reversed) {
         try {
           await finalizer();
         } catch (error, stack) {
-          printTrace('test $ourTestCount: error while cleaning up; ${controllerSinkClosed ? "reporting to console" : "sending to test framework"}');
+          globals.printTrace('test $ourTestCount: error while cleaning up; ${controllerSinkClosed ? "reporting to console" : "sending to test framework"}');
           if (!controllerSinkClosed) {
             controller.sink.addError(error, stack);
           } else {
-            printError('unhandled error during finalization of test:\n$testPath\n$error\n$stack');
+            globals.printError('unhandled error during finalization of test:\n$testPath\n$error\n$stack');
             outOfBandError ??= _AsyncError(error, stack);
           }
         }
@@ -696,16 +694,16 @@
       if (!controllerSinkClosed) {
         // Waiting below with await.
         unawaited(controller.sink.close());
-        printTrace('test $ourTestCount: waiting for controller sink to close');
+        globals.printTrace('test $ourTestCount: waiting for controller sink to close');
         await controller.sink.done;
       }
     }
     assert(!subprocessActive);
     assert(controllerSinkClosed);
     if (outOfBandError != null) {
-      printTrace('test $ourTestCount: finished with out-of-band failure');
+      globals.printTrace('test $ourTestCount: finished with out-of-band failure');
     } else {
-      printTrace('test $ourTestCount: finished');
+      globals.printTrace('test $ourTestCount: finished');
     }
     return outOfBandError;
   }
@@ -717,17 +715,17 @@
     HttpServer server,
   ) {
     // Prepare a temporary directory to store the Dart file that will talk to us.
-    final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_test_listener.');
+    final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_test_listener.');
     finalizers.add(() async {
-      printTrace('test $ourTestCount: deleting temporary directory');
+      globals.printTrace('test $ourTestCount: deleting temporary directory');
       tempDir.deleteSync(recursive: true);
     });
 
     // Prepare the Dart file that will talk to us and start the test.
-    final File listenerFile = fs.file('${tempDir.path}/listener.dart');
+    final File listenerFile = globals.fs.file('${tempDir.path}/listener.dart');
     listenerFile.createSync();
     listenerFile.writeAsStringSync(_generateTestMain(
-      testUrl: fs.path.toUri(fs.path.absolute(testPath)),
+      testUrl: globals.fs.path.toUri(globals.fs.path.absolute(testPath)),
     ));
     return listenerFile.path;
   }
@@ -738,7 +736,7 @@
     assert(testUrl.scheme == 'file');
     return generateTestBootstrap(
       testUrl: testUrl,
-      testConfigFile: findTestConfigFile(fs.file(testUrl)),
+      testConfigFile: findTestConfigFile(globals.fs.file(testUrl)),
       host: host,
       updateGoldens: updateGoldens,
     );
@@ -753,7 +751,7 @@
       compiler = null;
     }
     if (fontsDirectory != null) {
-      printTrace('Deleting ${fontsDirectory.path}...');
+      globals.printTrace('Deleting ${fontsDirectory.path}...');
       fontsDirectory.deleteSync(recursive: true);
       fontsDirectory = null;
     }
@@ -768,16 +766,16 @@
 
     final StringBuffer sb = StringBuffer();
     sb.writeln('<fontconfig>');
-    sb.writeln('  <dir>${cache.getCacheArtifacts().path}</dir>');
+    sb.writeln('  <dir>${globals.cache.getCacheArtifacts().path}</dir>');
     sb.writeln('  <cachedir>/var/cache/fontconfig</cachedir>');
     sb.writeln('</fontconfig>');
 
     if (fontsDirectory == null) {
-      fontsDirectory = fs.systemTempDirectory.createTempSync('flutter_test_fonts.');
-      printTrace('Using this directory for fonts configuration: ${fontsDirectory.path}');
+      fontsDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_test_fonts.');
+      globals.printTrace('Using this directory for fonts configuration: ${fontsDirectory.path}');
     }
 
-    _cachedFontConfig = fs.file('${fontsDirectory.path}/fonts.conf');
+    _cachedFontConfig = globals.fs.file('${fontsDirectory.path}/fonts.conf');
     _cachedFontConfig.createSync();
     _cachedFontConfig.writeAsStringSync(sb.toString());
     return _cachedFontConfig;
@@ -826,14 +824,14 @@
       testPath,
     ];
 
-    printTrace(command.join(' '));
+    globals.printTrace(command.join(' '));
     // If the FLUTTER_TEST environment variable has been set, then pass it on
     // for package:flutter_test to handle the value.
     //
     // If FLUTTER_TEST has not been set, assume from this context that this
     // call was invoked by the command 'flutter test'.
-    final String flutterTest = platform.environment.containsKey('FLUTTER_TEST')
-        ? platform.environment['FLUTTER_TEST']
+    final String flutterTest = globals.platform.environment.containsKey('FLUTTER_TEST')
+        ? globals.platform.environment['FLUTTER_TEST']
         : 'true';
     final Map<String, String> environment = <String, String>{
       'FLUTTER_TEST': flutterTest,
@@ -841,9 +839,9 @@
       'SERVER_PORT': serverPort.toString(),
       'APP_NAME': flutterProject?.manifest?.appName ?? '',
       if (buildTestAssets)
-        'UNIT_TEST_ASSETS': fs.path.join(flutterProject?.directory?.path ?? '', 'build', 'unit_test_assets'),
+        'UNIT_TEST_ASSETS': globals.fs.path.join(flutterProject?.directory?.path ?? '', 'build', 'unit_test_assets'),
     };
-    return processManager.start(command, environment: environment);
+    return globals.processManager.start(command, environment: environment);
   }
 
   void _pipeStandardStreamsToConsole(
@@ -866,24 +864,24 @@
               startTimeoutTimer();
             }
           } else if (line.startsWith('error: Unable to read Dart source \'package:test/')) {
-            printTrace('Shell: $line');
-            printError('\n\nFailed to load test harness. Are you missing a dependency on flutter_test?\n');
+            globals.printTrace('Shell: $line');
+            globals.printError('\n\nFailed to load test harness. Are you missing a dependency on flutter_test?\n');
           } else if (line.startsWith(observatoryString)) {
-            printTrace('Shell: $line');
+            globals.printTrace('Shell: $line');
             try {
               final Uri uri = Uri.parse(line.substring(observatoryString.length));
               if (reportObservatoryUri != null) {
                 reportObservatoryUri(uri);
               }
             } catch (error) {
-              printError('Could not parse shell observatory port message: $error');
+              globals.printError('Could not parse shell observatory port message: $error');
             }
           } else if (line != null) {
-            printStatus('Shell: $line');
+            globals.printStatus('Shell: $line');
           }
         },
         onError: (dynamic error) {
-          printError('shell console stream for process pid ${process.pid} experienced an unexpected error: $error');
+          globals. printError('shell console stream for process pid ${process.pid} experienced an unexpected error: $error');
         },
         cancelOnError: true,
       );
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 2323e0a..7aa705b 100644
--- a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
@@ -33,12 +33,11 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/process_manager.dart';
 import '../build_info.dart';
 import '../cache.dart';
 import '../convert.dart';
 import '../dart/package_map.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../web/chrome.dart';
 
@@ -52,7 +51,7 @@
     this.updateGoldens,
   }) {
     // Look up the location of the testing resources.
-    final Map<String, Uri> packageMap = PackageMap(fs.path.join(
+    final Map<String, Uri> packageMap = PackageMap(globals.fs.path.join(
       Cache.flutterRoot,
       'packages',
       'flutter_tools',
@@ -64,7 +63,7 @@
         .add(packagesDirHandler())
         .add(_jsHandler.handler)
         .add(createStaticHandler(
-          fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools'),
+          globals.fs.path.join(Cache.flutterRoot, 'packages', 'flutter_tools'),
           serveFilesOutsidePath: true,
         ))
         .add(createStaticHandler(_config.suiteDefaults.precompiledPath,
@@ -109,7 +108,7 @@
   Uri get url => _server.url;
 
   /// The ahem text file.
-  File get ahem => fs.file(fs.path.join(
+  File get ahem => globals.fs.file(globals.fs.path.join(
         Cache.flutterRoot,
         'packages',
         'flutter_tools',
@@ -118,8 +117,8 @@
       ));
 
   /// The require js binary.
-  File get requireJs => fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.engineDartSdkPath),
+  File get requireJs => globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
         'lib',
         'dev_compiler',
         'kernel',
@@ -128,8 +127,8 @@
       ));
 
   /// The ddc to dart stack trace mapper.
-  File get stackTraceMapper => fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.engineDartSdkPath),
+  File get stackTraceMapper => globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
         'lib',
         'dev_compiler',
         'web',
@@ -137,20 +136,20 @@
       ));
 
   /// The precompiled dart sdk.
-  File get dartSdk => fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.flutterWebSdk),
+  File get dartSdk => globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.flutterWebSdk),
         'kernel',
         'amd',
         'dart_sdk.js',
       ));
 
   /// The precompiled test javascript.
-  File get testDartJs => fs.file(fs.path.join(
+  File get testDartJs => globals.fs.file(globals.fs.path.join(
         testUri.toFilePath(),
         'dart.js',
       ));
 
-  File get testHostDartJs => fs.file(fs.path.join(
+  File get testHostDartJs => globals.fs.file(globals.fs.path.join(
         testUri.toFilePath(),
         'src',
         'runner',
@@ -228,10 +227,10 @@
         });
         bytes = base64.decode(response.result['data'] as String);
       } on WipError catch (ex) {
-        printError('Caught WIPError: $ex');
+        globals.printError('Caught WIPError: $ex');
         return shelf.Response.ok('WIP error: $ex');
       } on FormatException catch (ex) {
-        printError('Caught FormatException: $ex');
+        globals.printError('Caught FormatException: $ex');
         return shelf.Response.ok('Caught exception: $ex');
       }
 
@@ -263,10 +262,10 @@
 
   // A handler that serves wrapper files used to bootstrap tests.
   shelf.Response _wrapperHandler(shelf.Request request) {
-    final String path = fs.path.fromUri(request.url);
+    final String path = globals.fs.path.fromUri(request.url);
     if (path.endsWith('.html')) {
-      final String test = fs.path.withoutExtension(path) + '.dart';
-      final String scriptBase = htmlEscape.convert(fs.path.basename(test));
+      final String test = globals.fs.path.withoutExtension(path) + '.dart';
+      final String scriptBase = htmlEscape.convert(globals.fs.path.basename(test));
       final String link = '<link rel="x-dart-test" href="$scriptBase">';
       return shelf.Response.ok('''
         <!DOCTYPE html>
@@ -279,7 +278,7 @@
         </html>
       ''', headers: <String, String>{'Content-Type': 'text/html'});
     }
-    printTrace('Did not find anything for request: ${request.url}');
+    globals.printTrace('Did not find anything for request: ${request.url}');
     return shelf.Response.notFound('Not found.');
   }
 
@@ -299,8 +298,8 @@
       return null;
     }
 
-    final Uri suiteUrl = url.resolveUri(fs.path.toUri(fs.path.withoutExtension(
-            fs.path.relative(path, from: fs.path.join(_root, 'test'))) +
+    final Uri suiteUrl = url.resolveUri(globals.fs.path.toUri(globals.fs.path.withoutExtension(
+            globals.fs.path.relative(path, from: globals.fs.path.join(_root, 'test'))) +
         '.html'));
     final RunnerSuite suite = await browserManager
         .load(path, suiteUrl, suiteConfig, message, mapper: _mappers[path]);
@@ -334,7 +333,7 @@
         'debug': _config.pauseAfterLoad.toString(),
       });
 
-    printTrace('Serving tests at $hostUrl');
+    globals.printTrace('Serving tests at $hostUrl');
 
     final Future<BrowserManager> future = BrowserManager.start(
       browser,
@@ -793,7 +792,7 @@
 class TestGoldenComparator {
   /// Creates a [TestGoldenComparator] instance.
   TestGoldenComparator(this.shellPath, this.compilerFactory)
-      : tempDir = fs.systemTempDirectory.createTempSync('flutter_web_platform.');
+      : tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_web_platform.');
 
   final String shellPath;
   final Directory tempDir;
@@ -845,7 +844,7 @@
       // Chrome is the only supported browser currently.
       'FLUTTER_TEST_BROWSER': 'chrome',
     };
-    return processManager.start(command, environment: environment);
+    return globals.processManager.start(command, environment: environment);
   }
 
   Future<String> compareGoldens(Uri testUri, Uint8List bytes, Uri goldenKey, bool updateGoldens) async {
@@ -876,7 +875,7 @@
         .transform<String>(utf8.decoder)
         .transform<String>(const LineSplitter())
         .where((String line) {
-          printTrace('<<< $line');
+          globals.printTrace('<<< $line');
           return line.isNotEmpty && line[0] == '{';
         })
         .map<dynamic>(jsonDecode)
@@ -886,7 +885,7 @@
         .transform<String>(utf8.decoder)
         .transform<String>(const LineSplitter())
         .forEach((String line) {
-          printError('<<< $line');
+          globals.printError('<<< $line');
         });
   }
 
@@ -904,7 +903,7 @@
       'key': goldenKey.toString(),
       'update': updateGoldens,
     });
-    printTrace('Preparing to send command: $command');
+    globals.printTrace('Preparing to send command: $command');
     process.stdin.writeln(command);
   }
 
@@ -915,7 +914,7 @@
   }
 
   static String generateBootstrap(Uri testUri) {
-    final File testConfigFile = findTestConfigFile(fs.file(testUri));
+    final File testConfigFile = findTestConfigFile(globals.fs.file(testUri));
     // Generate comparator process for the file.
     return '''
 import 'dart:convert'; // ignore: dart_convert_import
diff --git a/packages/flutter_tools/lib/src/test/runner.dart b/packages/flutter_tools/lib/src/test/runner.dart
index 527584d..593603d 100644
--- a/packages/flutter_tools/lib/src/test/runner.dart
+++ b/packages/flutter_tools/lib/src/test/runner.dart
@@ -10,11 +10,9 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/process_manager.dart';
-import '../base/terminal.dart';
 import '../build_info.dart';
 import '../dart/package_map.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../web/compile.dart';
 import 'flutter_platform.dart' as loader;
@@ -49,14 +47,14 @@
   String randomSeed = '0',
 }) async {
   // Configure package:test to use the Flutter engine for child processes.
-  final String shellPath = artifacts.getArtifactPath(Artifact.flutterTester);
-  if (!processManager.canRun(shellPath)) {
+  final String shellPath = globals.artifacts.getArtifactPath(Artifact.flutterTester);
+  if (!globals.processManager.canRun(shellPath)) {
     throwToolExit('Cannot execute Flutter tester at $shellPath');
   }
 
   // Compute the command-line arguments for package:test.
   final List<String> testArgs = <String>[
-    if (!terminal.supportsColor)
+    if (!globals.terminal.supportsColor)
       '--no-color',
     if (machine)
       ...<String>['-r', 'json']
@@ -70,7 +68,7 @@
     '--test-randomize-ordering-seed=$randomSeed',
   ];
   if (web) {
-    final String tempBuildDir = fs.systemTempDirectory
+    final String tempBuildDir = globals.fs.systemTempDirectory
       .createTempSync('flutter_test.')
       .absolute
       .uri
@@ -127,7 +125,7 @@
     trackWidgetCreation: trackWidgetCreation,
     updateGoldens: updateGoldens,
     buildTestAssets: buildTestAssets,
-    projectRootDirectory: fs.currentDirectory.uri,
+    projectRootDirectory: globals.fs.currentDirectory.uri,
     flutterProject: flutterProject,
     icudtlPath: icudtlPath,
   );
@@ -135,25 +133,25 @@
   // Make the global packages path absolute.
   // (Makes sure it still works after we change the current directory.)
   PackageMap.globalPackagesPath =
-      fs.path.normalize(fs.path.absolute(PackageMap.globalPackagesPath));
+      globals.fs.path.normalize(globals.fs.path.absolute(PackageMap.globalPackagesPath));
 
   // Call package:test's main method in the appropriate directory.
-  final Directory saved = fs.currentDirectory;
+  final Directory saved = globals.fs.currentDirectory;
   try {
     if (workDir != null) {
-      printTrace('switching to directory $workDir to run tests');
-      fs.currentDirectory = workDir;
+      globals.printTrace('switching to directory $workDir to run tests');
+      globals.fs.currentDirectory = workDir;
     }
 
-    printTrace('running test package with arguments: $testArgs');
+    globals.printTrace('running test package with arguments: $testArgs');
     await testWrapper.main(testArgs);
 
     // test.main() sets dart:io's exitCode global.
-    printTrace('test package returned with exit code $exitCode');
+    globals.printTrace('test package returned with exit code $exitCode');
 
     return exitCode;
   } finally {
-    fs.currentDirectory = saved;
+    globals.fs.currentDirectory = saved;
     await platform.close();
   }
 }
diff --git a/packages/flutter_tools/lib/src/test/test_compiler.dart b/packages/flutter_tools/lib/src/test/test_compiler.dart
index 27dda02..7d434dc 100644
--- a/packages/flutter_tools/lib/src/test/test_compiler.dart
+++ b/packages/flutter_tools/lib/src/test/test_compiler.dart
@@ -14,7 +14,7 @@
 import '../codegen.dart';
 import '../compile.dart';
 import '../dart/package_map.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 
 /// A request to the [TestCompiler] for recompilation.
@@ -41,18 +41,18 @@
     this.trackWidgetCreation,
     this.flutterProject,
   ) : testFilePath = getKernelPathForTransformerOptions(
-        fs.path.join(flutterProject.directory.path, getBuildDirectory(), 'testfile.dill'),
+        globals.fs.path.join(flutterProject.directory.path, getBuildDirectory(), 'testfile.dill'),
         trackWidgetCreation: trackWidgetCreation,
       ) {
     // Compiler maintains and updates single incremental dill file.
     // Incremental compilation requests done for each test copy that file away
     // for independent execution.
-    final Directory outputDillDirectory = fs.systemTempDirectory.createTempSync('flutter_test_compiler.');
+    final Directory outputDillDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_test_compiler.');
     outputDill = outputDillDirectory.childFile('output.dill');
-    printTrace('Compiler will use the following file as its incremental dill file: ${outputDill.path}');
-    printTrace('Listening to compiler controller...');
+    globals.printTrace('Compiler will use the following file as its incremental dill file: ${outputDill.path}');
+    globals.printTrace('Listening to compiler controller...');
     compilerController.stream.listen(_onCompilationRequest, onDone: () {
-      printTrace('Deleting ${outputDillDirectory.path}...');
+      globals.printTrace('Deleting ${outputDillDirectory.path}...');
       outputDillDirectory.deleteSync(recursive: true);
     });
   }
@@ -107,7 +107,7 @@
       );
     }
     return ResidentCompiler(
-      artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
+      globals.artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
       packagesPath: PackageMap.globalPackagesPath,
       buildMode: buildMode,
       trackWidgetCreation: trackWidgetCreation,
@@ -130,7 +130,7 @@
     }
     while (compilationQueue.isNotEmpty) {
       final _CompilationRequest request = compilationQueue.first;
-      printTrace('Compiling ${request.path}');
+      globals.printTrace('Compiling ${request.path}');
       final Stopwatch compilerTime = Stopwatch()..start();
       bool firstCompile = false;
       if (compiler == null) {
@@ -153,9 +153,9 @@
         request.result.complete(null);
         await _shutdown();
       } else {
-        final File outputFile = fs.file(outputPath);
+        final File outputFile = globals.fs.file(outputPath);
         final File kernelReadyToRun = await outputFile.copy('${request.path}.dill');
-        final File testCache = fs.file(testFilePath);
+        final File testCache = globals.fs.file(testFilePath);
         if (firstCompile || !testCache.existsSync() || (testCache.lengthSync() < outputFile.lengthSync())) {
           // The idea is to keep the cache file up-to-date and include as
           // much as possible in an effort to re-use as many packages as
@@ -167,7 +167,7 @@
         compiler.accept();
         compiler.reset();
       }
-      printTrace('Compiling ${request.path} took ${compilerTime.elapsedMilliseconds}ms');
+      globals.printTrace('Compiling ${request.path} took ${compilerTime.elapsedMilliseconds}ms');
       // Only remove now when we finished processing the element
       compilationQueue.removeAt(0);
     }
@@ -178,14 +178,14 @@
       return;
     }
     if (message.startsWith('Error: Could not resolve the package \'flutter_test\'')) {
-      printTrace(message);
-      printError('\n\nFailed to load test harness. Are you missing a dependency on flutter_test?\n',
+      globals.printTrace(message);
+      globals.printError('\n\nFailed to load test harness. Are you missing a dependency on flutter_test?\n',
         emphasis: emphasis,
         color: color,
       );
       _suppressOutput = true;
       return;
     }
-    printError('$message');
+    globals.printError('$message');
   }
 }
diff --git a/packages/flutter_tools/lib/src/test/test_config.dart b/packages/flutter_tools/lib/src/test/test_config.dart
index 1d65774..ded1010 100644
--- a/packages/flutter_tools/lib/src/test/test_config.dart
+++ b/packages/flutter_tools/lib/src/test/test_config.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import '../base/file_system.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 /// The name of the test configuration file that will be discovered by the
 /// test harness if it exists in the project directory hierarchy.
@@ -20,12 +20,12 @@
   while (directory.path != directory.parent.path) {
     final File configFile = directory.childFile(_kTestConfigFileName);
     if (configFile.existsSync()) {
-      printTrace('Discovered $_kTestConfigFileName in ${directory.path}');
+      globals.printTrace('Discovered $_kTestConfigFileName in ${directory.path}');
       testConfigFile = configFile;
       break;
     }
     if (directory.childFile(_kProjectRootSentinel).existsSync()) {
-      printTrace('Stopping scan for $_kTestConfigFileName; '
+      globals.printTrace('Stopping scan for $_kTestConfigFileName; '
           'found project root at ${directory.path}');
       break;
     }
diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
index 077830d..57e08c6 100644
--- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart
+++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
@@ -11,20 +11,19 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/process_manager.dart';
 import '../build_info.dart';
 import '../bundle.dart';
 import '../convert.dart';
 import '../dart/package_map.dart';
 import '../device.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../protocol_discovery.dart';
 import '../version.dart';
 
 class FlutterTesterApp extends ApplicationPackage {
   factory FlutterTesterApp.fromCurrentDirectory() {
-    return FlutterTesterApp._(fs.currentDirectory);
+    return FlutterTesterApp._(globals.fs.currentDirectory);
   }
 
   FlutterTesterApp._(Directory directory)
@@ -110,12 +109,12 @@
     final BuildInfo buildInfo = debuggingOptions.buildInfo;
 
     if (!buildInfo.isDebug) {
-      printError('This device only supports debug mode.');
+      globals.printError('This device only supports debug mode.');
       return LaunchResult.failed();
     }
 
-    final String shellPath = artifacts.getArtifactPath(Artifact.flutterTester);
-    if (!fs.isFileSync(shellPath)) {
+    final String shellPath = globals.artifacts.getArtifactPath(Artifact.flutterTester);
+    if (!globals.fs.isFileSync(shellPath)) {
       throwToolExit('Cannot find Flutter shell at $shellPath');
     }
 
@@ -141,7 +140,7 @@
     // Build assets and perform initial compilation.
     final String assetDirPath = getAssetBuildDirectory();
     final String applicationKernelFilePath = getKernelPathForTransformerOptions(
-      fs.path.join(getBuildDirectory(), 'flutter-tester-app.dill'),
+      globals.fs.path.join(getBuildDirectory(), 'flutter-tester-app.dill'),
       trackWidgetCreation: buildInfo.trackWidgetCreation,
     );
     await BundleBuilder().build(
@@ -158,10 +157,10 @@
     command.add(applicationKernelFilePath);
 
     try {
-      printTrace(command.join(' '));
+      globals.printTrace(command.join(' '));
 
       _isRunning = true;
-      _process = await processManager.start(command,
+      _process = await globals.processManager.start(command,
         environment: <String, String>{
           'FLUTTER_TEST': 'true',
         },
@@ -195,7 +194,7 @@
       final Uri observatoryUri = await observatoryDiscovery.uri;
       return LaunchResult.succeeded(observatoryUri: observatoryUri);
     } catch (error) {
-      printError('Failed to launch $package: $error');
+      globals.printError('Failed to launch $package: $error');
       return LaunchResult.failed();
     }
   }
diff --git a/packages/flutter_tools/lib/src/tracing.dart b/packages/flutter_tools/lib/src/tracing.dart
index 95c0dc0..623a10d 100644
--- a/packages/flutter_tools/lib/src/tracing.dart
+++ b/packages/flutter_tools/lib/src/tracing.dart
@@ -8,7 +8,7 @@
 import 'base/logger.dart';
 import 'base/utils.dart';
 import 'build_info.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'vmservice.dart';
 
 // Names of some of the Timeline events we care about.
@@ -39,7 +39,7 @@
     bool awaitFirstFrame = false,
   }) async {
     if (awaitFirstFrame) {
-      final Status status = logger.startProgress(
+      final Status status = globals.logger.startProgress(
         'Waiting for application to render first frame...',
         timeout: timeoutConfiguration.fastOperation,
       );
@@ -75,8 +75,8 @@
 /// Download the startup trace information from the given observatory client and
 /// store it to build/start_up_info.json.
 Future<void> downloadStartupTrace(VMService observatory, { bool awaitFirstFrame = true }) async {
-  final String traceInfoFilePath = fs.path.join(getBuildDirectory(), 'start_up_info.json');
-  final File traceInfoFile = fs.file(traceInfoFilePath);
+  final String traceInfoFilePath = globals.fs.path.join(getBuildDirectory(), 'start_up_info.json');
+  final File traceInfoFile = globals.fs.file(traceInfoFilePath);
 
   // Delete old startup data, if any.
   if (traceInfoFile.existsSync()) {
@@ -109,7 +109,7 @@
   final int frameworkInitTimestampMicros = extractInstantEventTimestamp(kFrameworkInitEventName);
 
   if (engineEnterTimestampMicros == null) {
-    printTrace('Engine start event is missing in the timeline: $timeline');
+    globals.printTrace('Engine start event is missing in the timeline: $timeline');
     throw 'Engine start event is missing in the timeline. Cannot compute startup time.';
   }
 
@@ -127,7 +127,7 @@
     final int firstFrameBuiltTimestampMicros = extractInstantEventTimestamp(kFirstFrameBuiltEventName);
     final int firstFrameRasterizedTimestampMicros = extractInstantEventTimestamp(kFirstFrameRasterizedEventName);
     if (firstFrameBuiltTimestampMicros == null || firstFrameRasterizedTimestampMicros == null) {
-      printTrace('First frame events are missing in the timeline: $timeline');
+      globals.printTrace('First frame events are missing in the timeline: $timeline');
       throw 'First frame events are missing in the timeline. Cannot compute startup time.';
     }
 
@@ -146,6 +146,6 @@
 
   traceInfoFile.writeAsStringSync(toPrettyJson(traceInfo));
 
-  printStatus(message);
-  printStatus('Saved startup trace info in ${traceInfoFile.path}.');
+  globals.printStatus(message);
+  globals.printStatus('Saved startup trace info in ${traceInfoFile.path}.');
 }
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart
index 738015f..d6dc8c8 100644
--- a/packages/flutter_tools/lib/src/version.dart
+++ b/packages/flutter_tools/lib/src/version.dart
@@ -11,11 +11,10 @@
 import 'base/file_system.dart';
 import 'base/io.dart';
 import 'base/process.dart';
-import 'base/process_manager.dart';
 import 'base/time.dart';
 import 'cache.dart';
 import 'convert.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 
 class FlutterVersion {
   FlutterVersion([this._clock = const SystemClock()]) {
@@ -97,13 +96,13 @@
 
   String get frameworkDate => frameworkCommitDate;
 
-  String get dartSdkVersion => Cache.instance.dartSdkVersion;
+  String get dartSdkVersion => globals.cache.dartSdkVersion;
 
-  String get engineRevision => Cache.instance.engineRevision;
+  String get engineRevision => globals.cache.engineRevision;
   String get engineRevisionShort => _shortGitRevision(engineRevision);
 
   Future<void> ensureVersionFile() {
-    fs.file(fs.path.join(Cache.flutterRoot, 'version')).writeAsStringSync(_frameworkVersion);
+    globals.fs.file(globals.fs.path.join(Cache.flutterRoot, 'version')).writeAsStringSync(_frameworkVersion);
     return Future<void>.value();
   }
 
@@ -161,7 +160,7 @@
     } on VersionCheckError catch (e) {
       if (lenient) {
         final DateTime dummyDate = DateTime.fromMillisecondsSinceEpoch(0);
-        printError('Failed to find the latest git commit date: $e\n'
+        globals.printError('Failed to find the latest git commit date: $e\n'
           'Returning $dummyDate instead.');
         // Return something that DateTime.parse() can parse.
         return dummyDate.toString();
@@ -249,7 +248,7 @@
     String tentativeDescendantRevision,
     String tentativeAncestorRevision,
   }) {
-    final ProcessResult result = processManager.runSync(
+    final ProcessResult result = globals.processManager.runSync(
       <String>[
         'git',
         'merge-base',
@@ -309,7 +308,7 @@
   /// channel doesn't linger.
   static Future<void> resetFlutterVersionFreshnessCheck() async {
     try {
-      await Cache.instance.getStampFileFor(
+      await globals.cache.getStampFileFor(
         VersionCheckStamp.flutterVersionCheckStampFile,
       ).delete();
     } on FileSystemException {
@@ -368,7 +367,7 @@
         remoteVersionStatus == VersionCheckResult.newVersionAvailable
           ? newVersionAvailableMessage()
           : versionOutOfDateMessage(frameworkAge);
-      printStatus(updateMessage, emphasis: true);
+      globals.printStatus(updateMessage, emphasis: true);
       await Future.wait<void>(<Future<void>>[
         stamp.store(
           newTimeWarningWasPrinted: _clock.now(),
@@ -448,7 +447,7 @@
       // This happens when any of the git commands fails, which can happen when
       // there's no Internet connectivity. Remote version check is best effort
       // only. We do not prevent the command from running when it fails.
-      printTrace('Failed to check Flutter version in the remote repository: $error');
+      globals.printTrace('Failed to check Flutter version in the remote repository: $error');
       // Still update the timestamp to avoid us hitting the server on every single
       // command if for some reason we cannot connect (eg. we may be offline).
       await versionCheckStamp.store(
@@ -477,7 +476,7 @@
   static const String flutterVersionCheckStampFile = 'flutter_version_check';
 
   static Future<VersionCheckStamp> load() async {
-    final String versionCheckStamp = Cache.instance.getStampFor(flutterVersionCheckStampFile);
+    final String versionCheckStamp = globals.cache.getStampFor(flutterVersionCheckStampFile);
 
     if (versionCheckStamp != null) {
       // Attempt to parse stamp JSON.
@@ -486,11 +485,11 @@
         if (jsonObject is Map<String, dynamic>) {
           return fromJson(jsonObject);
         } else {
-          printTrace('Warning: expected version stamp to be a Map but found: $jsonObject');
+          globals.printTrace('Warning: expected version stamp to be a Map but found: $jsonObject');
         }
       } catch (error, stackTrace) {
         // Do not crash if JSON is malformed.
-        printTrace('${error.runtimeType}: $error\n$stackTrace');
+        globals.printTrace('${error.runtimeType}: $error\n$stackTrace');
       }
     }
 
@@ -532,7 +531,7 @@
     }
 
     const JsonEncoder prettyJsonEncoder = JsonEncoder.withIndent('  ');
-    Cache.instance.setStampFor(flutterVersionCheckStampFile, prettyJsonEncoder.convert(jsonData));
+    globals.cache.setStampFor(flutterVersionCheckStampFile, prettyJsonEncoder.convert(jsonData));
   }
 
   Map<String, String> toJson({
@@ -582,7 +581,7 @@
 /// If [lenient] is true and the command fails, returns an empty string.
 /// Otherwise, throws a [ToolExit] exception.
 String _runSync(List<String> command, { bool lenient = true }) {
-  final ProcessResult results = processManager.runSync(
+  final ProcessResult results = globals.processManager.runSync(
     command,
     workingDirectory: Cache.flutterRoot,
   );
@@ -614,7 +613,7 @@
 ///
 /// If the command fails, throws a [ToolExit] exception.
 Future<String> _run(List<String> command) async {
-  final ProcessResult results = await processManager.run(command, workingDirectory: Cache.flutterRoot);
+  final ProcessResult results = await globals.processManager.run(command, workingDirectory: Cache.flutterRoot);
 
   if (results.exitCode == 0) {
     return (results.stdout as String).trim();
@@ -669,7 +668,7 @@
     final RegExp versionPattern = RegExp(r'^v([0-9]+)\.([0-9]+)\.([0-9]+)(?:\+hotfix\.([0-9]+))?-([0-9]+)-g([a-f0-9]+)$');
     final List<String> parts = versionPattern.matchAsPrefix(version)?.groups(<int>[1, 2, 3, 4, 5, 6]);
     if (parts == null) {
-      printTrace('Could not interpret results of "git describe": $version');
+      globals.printTrace('Could not interpret results of "git describe": $version');
       return const GitTagVersion.unknown();
     }
     final List<int> parsedParts = parts.take(5).map<int>((String source) => source == null ? null : int.tryParse(source)).toList();
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index 928cf2a..9d0450e 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -14,12 +14,11 @@
 
 import 'base/common.dart';
 import 'base/context.dart';
-import 'base/file_system.dart';
 import 'base/io.dart' as io;
 import 'base/utils.dart';
 import 'convert.dart' show base64, utf8;
 import 'device.dart';
-import 'globals.dart';
+import 'globals.dart' as globals;
 import 'version.dart';
 
 /// Override `WebSocketConnector` in [context] to use a different constructor
@@ -71,11 +70,11 @@
   io.WebSocket socket;
 
   Future<void> handleError(dynamic e) async {
-    printTrace('Exception attempting to connect to Observatory: $e');
-    printTrace('This was attempt #$attempts. Will retry in $delay.');
+    globals.printTrace('Exception attempting to connect to Observatory: $e');
+    globals.printTrace('This was attempt #$attempts. Will retry in $delay.');
 
     if (attempts == 10) {
-      printStatus('This is taking longer than expected...');
+      globals.printStatus('This is taking longer than expected...');
     }
 
     // Delay next attempt.
@@ -180,7 +179,7 @@
           throw rpc.RpcException.invalidParams('Invalid \'classId\': $classId');
         }
 
-        printTrace('reloadMethod not yet supported, falling back to hot reload');
+        globals.printTrace('reloadMethod not yet supported, falling back to hot reload');
 
         try {
           await reloadMethod(
@@ -291,7 +290,7 @@
   }
 
   static void _unhandledError(dynamic error, dynamic stack) {
-    logger.printTrace('Error in internal implementation of JSON RPC.\n$error\n$stack');
+    globals.logger.printTrace('Error in internal implementation of JSON RPC.\n$error\n$stack');
     assert(false);
   }
 
@@ -332,7 +331,7 @@
     io.CompressionOptions compression = io.CompressionOptions.compressionDefault,
     Device device,
   }) async {
-    final Uri wsUri = httpUri.replace(scheme: 'ws', path: fs.path.join(httpUri.path, 'ws'));
+    final Uri wsUri = httpUri.replace(scheme: 'ws', path: globals.fs.path.join(httpUri.path, 'ws'));
     final StreamChannel<String> channel = await _openChannel(wsUri, compression: compression);
     final rpc.Peer peer = rpc.Peer.withoutJson(jsonDocument.bind(channel), onUnhandledError: _unhandledError);
     final VMService service = VMService(
@@ -420,7 +419,7 @@
     final Map<String, dynamic> eventIsolate = castStringKeyedMap(eventData['isolate']);
 
     // Log event information.
-    printTrace('Notification from VM: $data');
+    globals.printTrace('Notification from VM: $data');
 
     ServiceEvent event;
     if (eventIsolate != null) {
@@ -898,7 +897,7 @@
 
           // Eagerly load the isolate.
           isolate.load().catchError((dynamic e, StackTrace stack) {
-            printTrace('Eagerly loading an isolate failed: $e\n$stack');
+            globals.printTrace('Eagerly loading an isolate failed: $e\n$stack');
           });
         } else {
           // Existing isolate, update data.
@@ -948,20 +947,20 @@
     Map<String, dynamic> params = const <String, dynamic>{},
     bool truncateLogs = true,
   }) async {
-    printTrace('Sending to VM service: $method($params)');
+    globals.printTrace('Sending to VM service: $method($params)');
     assert(params != null);
     try {
       final Map<String, dynamic> result = await _vmService._sendRequest(method, params);
       final String resultString =
           truncateLogs ? _truncate(result.toString(), 250, '...') : result.toString();
-      printTrace('Result: $resultString');
+      globals.printTrace('Result: $resultString');
       return result;
     } on WebSocketChannelException catch (error) {
       throwToolExit('Error connecting to observatory: $error');
       return null;
     } on rpc.RpcException catch (error) {
-      printError('Error ${error.code} received from application: ${error.message}');
-      printTrace('${error.data}');
+      globals.printError('Error ${error.code} received from application: ${error.message}');
+      globals.printTrace('${error.data}');
       rethrow;
     }
   }
@@ -1087,7 +1086,7 @@
       }
       failCount += 1;
       if (failCount == 5) { // waited 200ms
-        printStatus('Flutter is taking longer than expected to report its views. Still trying...');
+        globals.printStatus('Flutter is taking longer than expected to report its views. Still trying...');
       }
       await Future<void>.delayed(const Duration(milliseconds: 50));
       await reload();
@@ -1501,7 +1500,7 @@
         // TODO(johnmccutchan): Listen to the debug stream and catch initial
         // launch errors.
         if (event.kind == ServiceEvent.kIsolateRunnable) {
-          printTrace('Isolate is runnable.');
+          globals.printTrace('Isolate is runnable.');
           if (!completer.isCompleted) {
             completer.complete();
           }
diff --git a/packages/flutter_tools/lib/src/vscode/vscode.dart b/packages/flutter_tools/lib/src/vscode/vscode.dart
index 4a810b8..6410493 100644
--- a/packages/flutter_tools/lib/src/vscode/vscode.dart
+++ b/packages/flutter_tools/lib/src/vscode/vscode.dart
@@ -4,12 +4,11 @@
 
 import '../base/common.dart';
 import '../base/file_system.dart';
-import '../base/platform.dart';
 import '../base/utils.dart';
 import '../base/version.dart';
 import '../convert.dart';
 import '../doctor.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 
 // Include VS Code insiders (useful for debugging).
 const bool _includeInsiders = false;
@@ -23,7 +22,7 @@
   VsCode._(this.directory, this.extensionDirectory, { Version version, this.edition })
       : version = version ?? Version.unknown {
 
-    if (!fs.isDirectorySync(directory)) {
+    if (!globals.fs.isDirectorySync(directory)) {
       _validationMessages.add(ValidationMessage.error('VS Code not found at $directory'));
       return;
     } else {
@@ -34,14 +33,14 @@
     // below will fail, so just bail out early.
     final ValidationMessage notInstalledMessage = ValidationMessage.error(
           'Flutter extension not installed; install from\n$extensionMarketplaceUrl');
-    if (!fs.isDirectorySync(extensionDirectory)) {
+    if (!globals.fs.isDirectorySync(extensionDirectory)) {
       _validationMessages.add(notInstalledMessage);
       return;
     }
 
     // Check for presence of extension.
     final String extensionIdentifierLower = extensionIdentifier.toLowerCase();
-    final Iterable<FileSystemEntity> extensionDirs = fs
+    final Iterable<FileSystemEntity> extensionDirs = globals.fs
         .directory(extensionDirectory)
         .listSync()
         .whereType<Directory>()
@@ -65,7 +64,7 @@
     String edition,
   }) {
     final String packageJsonPath =
-        fs.path.join(installPath, 'resources', 'app', 'package.json');
+        globals.fs.path.join(installPath, 'resources', 'app', 'package.json');
     final String versionString = _getVersionFromPackageJson(packageJsonPath);
     Version version;
     if (versionString != null) {
@@ -89,13 +88,13 @@
   Iterable<ValidationMessage> get validationMessages => _validationMessages;
 
   static List<VsCode> allInstalled() {
-    if (platform.isMacOS) {
+    if (globals.platform.isMacOS) {
       return _installedMacOS();
     }
-    if (platform.isWindows) {
+    if (globals.platform.isWindows) {
       return _installedWindows();
     }
-    if (platform.isLinux) {
+    if (globals.platform.isLinux) {
       return _installedLinux();
     }
     // VS Code isn't supported on the other platforms.
@@ -113,20 +112,20 @@
   static List<VsCode> _installedMacOS() {
     return _findInstalled(<_VsCodeInstallLocation>[
       _VsCodeInstallLocation(
-        fs.path.join('/Applications', 'Visual Studio Code.app', 'Contents'),
+        globals.fs.path.join('/Applications', 'Visual Studio Code.app', 'Contents'),
         '.vscode',
       ),
       _VsCodeInstallLocation(
-        fs.path.join(homeDirPath, 'Applications', 'Visual Studio Code.app', 'Contents'),
+        globals.fs.path.join(homeDirPath, 'Applications', 'Visual Studio Code.app', 'Contents'),
         '.vscode',
       ),
       _VsCodeInstallLocation(
-        fs.path.join('/Applications', 'Visual Studio Code - Insiders.app', 'Contents'),
+        globals.fs.path.join('/Applications', 'Visual Studio Code - Insiders.app', 'Contents'),
         '.vscode-insiders',
         isInsiders: true,
       ),
       _VsCodeInstallLocation(
-        fs.path.join(homeDirPath, 'Applications', 'Visual Studio Code - Insiders.app', 'Contents'),
+        globals.fs.path.join(homeDirPath, 'Applications', 'Visual Studio Code - Insiders.app', 'Contents'),
         '.vscode-insiders',
         isInsiders: true,
       ),
@@ -146,37 +145,37 @@
   //   $HOME/.vscode/extensions
   //   $HOME/.vscode-insiders/extensions
   static List<VsCode> _installedWindows() {
-    final String progFiles86 = platform.environment['programfiles(x86)'];
-    final String progFiles = platform.environment['programfiles'];
-    final String localAppData = platform.environment['localappdata'];
+    final String progFiles86 = globals.platform.environment['programfiles(x86)'];
+    final String progFiles = globals.platform.environment['programfiles'];
+    final String localAppData = globals.platform.environment['localappdata'];
 
     final List<_VsCodeInstallLocation> searchLocations =
         <_VsCodeInstallLocation>[];
 
     if (localAppData != null) {
       searchLocations.add(_VsCodeInstallLocation(
-          fs.path.join(localAppData, 'Programs\\Microsoft VS Code'),
+          globals.fs.path.join(localAppData, 'Programs\\Microsoft VS Code'),
           '.vscode'));
     }
     searchLocations.add(_VsCodeInstallLocation(
-        fs.path.join(progFiles86, 'Microsoft VS Code'), '.vscode',
+        globals.fs.path.join(progFiles86, 'Microsoft VS Code'), '.vscode',
         edition: '32-bit edition'));
     searchLocations.add(_VsCodeInstallLocation(
-        fs.path.join(progFiles, 'Microsoft VS Code'), '.vscode',
+        globals.fs.path.join(progFiles, 'Microsoft VS Code'), '.vscode',
         edition: '64-bit edition'));
     if (localAppData != null) {
       searchLocations.add(_VsCodeInstallLocation(
-          fs.path.join(localAppData, 'Programs\\Microsoft VS Code Insiders'),
+          globals.fs.path.join(localAppData, 'Programs\\Microsoft VS Code Insiders'),
           '.vscode-insiders',
           isInsiders: true));
     }
     searchLocations.add(_VsCodeInstallLocation(
-        fs.path.join(progFiles86, 'Microsoft VS Code Insiders'),
+        globals.fs.path.join(progFiles86, 'Microsoft VS Code Insiders'),
         '.vscode-insiders',
         edition: '32-bit edition',
         isInsiders: true));
     searchLocations.add(_VsCodeInstallLocation(
-        fs.path.join(progFiles, 'Microsoft VS Code Insiders'),
+        globals.fs.path.join(progFiles, 'Microsoft VS Code Insiders'),
         '.vscode-insiders',
         edition: '64-bit edition',
         isInsiders: true));
@@ -206,9 +205,9 @@
     final List<VsCode> results = <VsCode>[];
 
     for (_VsCodeInstallLocation searchLocation in searchLocations) {
-      if (fs.isDirectorySync(searchLocation.installPath)) {
+      if (globals.fs.isDirectorySync(searchLocation.installPath)) {
         final String extensionDirectory =
-            fs.path.join(homeDirPath, searchLocation.extensionsFolder, 'extensions');
+            globals.fs.path.join(homeDirPath, searchLocation.extensionsFolder, 'extensions');
         results.add(VsCode.fromDirectory(searchLocation.installPath, extensionDirectory, edition: searchLocation.edition));
       }
     }
@@ -221,15 +220,15 @@
       'VS Code ($version)${_extensionVersion != Version.unknown ? ', Flutter ($_extensionVersion)' : ''}';
 
   static String _getVersionFromPackageJson(String packageJsonPath) {
-    if (!fs.isFileSync(packageJsonPath)) {
+    if (!globals.fs.isFileSync(packageJsonPath)) {
       return null;
     }
-    final String jsonString = fs.file(packageJsonPath).readAsStringSync();
+    final String jsonString = globals.fs.file(packageJsonPath).readAsStringSync();
     try {
       final Map<String, dynamic> jsonObject = castStringKeyedMap(json.decode(jsonString));
       return jsonObject['version'] as String;
     } on FormatException catch (err) {
-      printTrace('Error parsing VSCode $packageJsonPath:\n$err');
+      globals.printTrace('Error parsing VSCode $packageJsonPath:\n$err');
       return null;
     }
   }
diff --git a/packages/flutter_tools/lib/src/web/chrome.dart b/packages/flutter_tools/lib/src/web/chrome.dart
index f1e926d..e03b9aa 100644
--- a/packages/flutter_tools/lib/src/web/chrome.dart
+++ b/packages/flutter_tools/lib/src/web/chrome.dart
@@ -12,9 +12,8 @@
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/os.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
 import '../convert.dart';
+import '../globals.dart' as globals;
 
 /// The [ChromeLauncher] instance.
 ChromeLauncher get chromeLauncher => context.get<ChromeLauncher>();
@@ -34,35 +33,35 @@
 
 /// The possible locations where the chrome executable can be located on windows.
 final List<String> kWindowsPrefixes = <String>[
-  platform.environment['LOCALAPPDATA'],
-  platform.environment['PROGRAMFILES'],
-  platform.environment['PROGRAMFILES(X86)'],
+  globals.platform.environment['LOCALAPPDATA'],
+  globals.platform.environment['PROGRAMFILES'],
+  globals.platform.environment['PROGRAMFILES(X86)'],
 ];
 
 /// Find the chrome executable on the current platform.
 ///
 /// Does not verify whether the executable exists.
 String findChromeExecutable() {
-  if (platform.environment.containsKey(kChromeEnvironment)) {
-    return platform.environment[kChromeEnvironment];
+  if (globals.platform.environment.containsKey(kChromeEnvironment)) {
+    return globals.platform.environment[kChromeEnvironment];
   }
-  if (platform.isLinux) {
+  if (globals.platform.isLinux) {
     return kLinuxExecutable;
   }
-  if (platform.isMacOS) {
+  if (globals.platform.isMacOS) {
     return kMacOSExecutable;
   }
-  if (platform.isWindows) {
+  if (globals.platform.isWindows) {
     final String windowsPrefix = kWindowsPrefixes.firstWhere((String prefix) {
       if (prefix == null) {
         return false;
       }
-      final String path = fs.path.join(prefix, kWindowsExecutable);
-      return fs.file(path).existsSync();
+      final String path = globals.fs.path.join(prefix, kWindowsExecutable);
+      return globals.fs.file(path).existsSync();
     }, orElse: () => '.');
-    return fs.path.join(windowsPrefix, kWindowsExecutable);
+    return globals.fs.path.join(windowsPrefix, kWindowsExecutable);
   }
-  throwToolExit('Platform ${platform.operatingSystem} is not supported.');
+  throwToolExit('Platform ${globals.platform.operatingSystem} is not supported.');
   return null;
 }
 
@@ -88,7 +87,7 @@
   bool canFindChrome() {
     final String chrome = findChromeExecutable();
     try {
-      return processManager.canRun(chrome);
+      return globals.processManager.canRun(chrome);
     } on ArgumentError {
       return false;
     }
@@ -104,14 +103,14 @@
     // This is a JSON file which contains configuration from the
     // browser session, such as window position. It is located
     // under the Chrome data-dir folder.
-    final String preferencesPath = fs.path.join('Default', 'preferences');
+    final String preferencesPath = globals.fs.path.join('Default', 'preferences');
 
     final String chromeExecutable = findChromeExecutable();
-    final Directory activeDataDir = fs.systemTempDirectory.createTempSync('flutter_tool.');
+    final Directory activeDataDir = globals.fs.systemTempDirectory.createTempSync('flutter_tool.');
     // Seed data dir with previous state.
 
-    final File savedPreferencesFile = fs.file(fs.path.join(dataDir?.path ?? '', preferencesPath));
-    final File destinationFile = fs.file(fs.path.join(activeDataDir.path, preferencesPath));
+    final File savedPreferencesFile = globals.fs.file(globals.fs.path.join(dataDir?.path ?? '', preferencesPath));
+    final File destinationFile = globals.fs.file(globals.fs.path.join(activeDataDir.path, preferencesPath));
     if (dataDir != null) {
       if (savedPreferencesFile.existsSync()) {
         destinationFile.parent.createSync(recursive: true);
@@ -143,7 +142,7 @@
       url,
     ];
 
-    final Process process = await processManager.start(args);
+    final Process process = await globals.processManager.start(args);
 
     // When the process exits, copy the user settings back to the provided
     // data-dir.
diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart
index 7185c7d..8f024d2 100644
--- a/packages/flutter_tools/lib/src/web/compile.dart
+++ b/packages/flutter_tools/lib/src/web/compile.dart
@@ -13,7 +13,7 @@
 import '../build_system/targets/dart.dart';
 import '../build_system/targets/web.dart';
 import '../convert.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../platform_plugins.dart';
 import '../plugins.dart';
 import '../project.dart';
@@ -35,12 +35,12 @@
   final bool hasWebPlugins = findPlugins(flutterProject)
     .any((Plugin p) => p.platforms.containsKey(WebPlugin.kConfigKey));
   await injectPlugins(flutterProject, checkProjects: true);
-  final Status status = logger.startProgress('Compiling $target for the Web...', timeout: null);
+  final Status status = globals.logger.startProgress('Compiling $target for the Web...', timeout: null);
   final Stopwatch sw = Stopwatch()..start();
   try {
     final BuildResult result = await buildSystem.build(const WebReleaseBundle(), Environment(
-      outputDir: fs.directory(getWebBuildDirectory()),
-      projectDir: fs.currentDirectory,
+      outputDir: globals.fs.directory(getWebBuildDirectory()),
+      projectDir: globals.fs.currentDirectory,
       buildDir: flutterProject.directory
         .childDirectory('.dart_tool')
         .childDirectory('flutter_build'),
@@ -54,7 +54,7 @@
     ));
     if (!result.success) {
       for (ExceptionMeasurement measurement in result.exceptions.values) {
-        printError('Target ${measurement.target} failed: ${measurement.exception}',
+        globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
             : null,
diff --git a/packages/flutter_tools/lib/src/web/devfs_web.dart b/packages/flutter_tools/lib/src/web/devfs_web.dart
index 6a5db70..c28815b 100644
--- a/packages/flutter_tools/lib/src/web/devfs_web.dart
+++ b/packages/flutter_tools/lib/src/web/devfs_web.dart
@@ -12,14 +12,13 @@
 import '../base/common.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
 import '../bundle.dart';
 import '../compile.dart';
 import '../convert.dart';
 import '../devfs.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import 'bootstrap.dart';
 
 /// A web server which handles serving JavaScript and assets.
@@ -69,7 +68,7 @@
     final HttpResponse response = request.response;
     // If the response is `/`, then we are requesting the index file.
     if (request.uri.path == '/') {
-      final File indexFile = fs.currentDirectory
+      final File indexFile = globals.fs.currentDirectory
         .childDirectory('web')
         .childFile('index.html');
       if (indexFile.existsSync()) {
@@ -116,25 +115,25 @@
     // likely coming from a source map request. Attempt to look in the
     // local filesystem for it, and return a 404 if it is not found. The tool
     // doesn't currently consider the case of Dart files as assets.
-    File file = fs.file(Uri.base.resolve(request.uri.path));
+    File file = globals.fs.file(Uri.base.resolve(request.uri.path));
 
     // If both of the lookups above failed, the file might have been an asset.
     // Try and resolve the path relative to the built asset directory.
     if (!file.existsSync()) {
       final String assetPath = request.uri.path.replaceFirst('/assets/', '');
-      file = fs.file(fs.path.join(getAssetBuildDirectory(), fs.path.relative(assetPath)));
+      file = globals.fs.file(globals.fs.path.join(getAssetBuildDirectory(), globals.fs.path.relative(assetPath)));
     }
 
     // If it isn't a project source or an asset, it must be a dart SDK source.
     // or a flutter web SDK source.
     if (!file.existsSync()) {
-      final Directory dartSdkParent = fs.directory(artifacts.getArtifactPath(Artifact.engineDartSdkPath)).parent;
-      file = fs.file(fs.path.joinAll(<String>[dartSdkParent.path, ...request.uri.pathSegments]));
+      final Directory dartSdkParent = globals.fs.directory(globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath)).parent;
+      file = globals.fs.file(globals.fs.path.joinAll(<String>[dartSdkParent.path, ...request.uri.pathSegments]));
     }
 
     if (!file.existsSync()) {
-      final String flutterWebSdk = artifacts.getArtifactPath(Artifact.flutterWebSdk);
-      file = fs.file(fs.path.joinAll(<String>[flutterWebSdk, ...request.uri.pathSegments]));
+      final String flutterWebSdk = globals.artifacts.getArtifactPath(Artifact.flutterWebSdk);
+      file = globals.fs.file(globals.fs.path.joinAll(<String>[flutterWebSdk, ...request.uri.pathSegments]));
     }
 
     if (!file.existsSync()) {
@@ -180,21 +179,21 @@
     final Map<String, dynamic> manifest = castStringKeyedMap(json.decode(manifestFile.readAsStringSync()));
     for (String filePath in manifest.keys) {
       if (filePath == null) {
-        printTrace('Invalid manfiest file: $filePath');
+        globals.printTrace('Invalid manfiest file: $filePath');
         continue;
       }
       final Map<String, dynamic> offsets = castStringKeyedMap(manifest[filePath]);
       final List<int> codeOffsets = (offsets['code'] as List<dynamic>).cast<int>();
       final List<int> sourcemapOffsets = (offsets['sourcemap'] as List<dynamic>).cast<int>();
       if (codeOffsets.length != 2 || sourcemapOffsets.length != 2) {
-        printTrace('Invalid manifest byte offsets: $offsets');
+        globals.printTrace('Invalid manifest byte offsets: $offsets');
         continue;
       }
 
       final int codeStart = codeOffsets[0];
       final int codeEnd = codeOffsets[1];
       if (codeStart < 0 || codeEnd > codeBytes.lengthInBytes) {
-        printTrace('Invalid byte index: [$codeStart, $codeEnd]');
+        globals.printTrace('Invalid byte index: [$codeStart, $codeEnd]');
         continue;
       }
       final Uint8List byteView = Uint8List.view(
@@ -207,7 +206,7 @@
       final int sourcemapStart = sourcemapOffsets[0];
       final int sourcemapEnd = sourcemapOffsets[1];
       if (sourcemapStart < 0 || sourcemapEnd > sourcemapBytes.lengthInBytes) {
-        printTrace('Invalid byte index: [$sourcemapStart, $sourcemapEnd]');
+        globals.printTrace('Invalid byte index: [$sourcemapStart, $sourcemapEnd]');
         continue;
       }
       final Uint8List sourcemapView = Uint8List.view(
@@ -285,28 +284,28 @@
     assert(trackWidgetCreation != null);
     assert(generator != null);
     if (bundleFirstUpload) {
-      final File requireJS = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.engineDartSdkPath),
+      final File requireJS = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
         'lib',
         'dev_compiler',
         'kernel',
         'amd',
         'require.js',
       ));
-      final File dartSdk = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.flutterWebSdk),
+      final File dartSdk = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.flutterWebSdk),
         'kernel',
         'amd',
         'dart_sdk.js',
       ));
-      final File dartSdkSourcemap = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.flutterWebSdk),
+      final File dartSdkSourcemap = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.flutterWebSdk),
         'kernel',
         'amd',
         'dart_sdk.js.map',
       ));
-      final File stackTraceMapper = fs.file(fs.path.join(
-        artifacts.getArtifactPath(Artifact.engineDartSdkPath),
+      final File stackTraceMapper = globals.fs.file(globals.fs.path.join(
+        globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
         'lib',
         'dev_compiler',
         'web',
@@ -324,7 +323,7 @@
       _webAssetServer.writeFile('/dart_sdk.js.map', dartSdkSourcemap.readAsStringSync());
       // TODO(jonahwilliams): refactor the asset code in this and the regular devfs to
       // be shared.
-      await writeBundle(fs.directory(getAssetBuildDirectory()), bundle.entries);
+      await writeBundle(globals.fs.directory(getAssetBuildDirectory()), bundle.entries);
     }
     final DateTime candidateCompileTime = DateTime.now();
     if (fullRestart) {
@@ -348,9 +347,9 @@
     File sourcemapFile;
     List<String> modules;
     try {
-      codeFile = fs.file('${compilerOutput.outputFilename}.sources');
-      manifestFile = fs.file('${compilerOutput.outputFilename}.json');
-      sourcemapFile = fs.file('${compilerOutput.outputFilename}.map');
+      codeFile = globals.fs.file('${compilerOutput.outputFilename}.sources');
+      manifestFile = globals.fs.file('${compilerOutput.outputFilename}.json');
+      sourcemapFile = globals.fs.file('${compilerOutput.outputFilename}.map');
       modules = _webAssetServer.write(codeFile, manifestFile, sourcemapFile);
     } on FileSystemException catch (err) {
       throwToolExit('Failed to load recompiled sources:\n$err');
@@ -362,9 +361,9 @@
 }
 
 String _filePathToUriFragment(String path) {
-  if (platform.isWindows) {
+  if (globals.platform.isWindows) {
     final bool startWithSlash = path.startsWith('/');
-    final String partial = fs.path
+    final String partial = globals.fs.path
       .split(path)
       .skip(startWithSlash ? 2 : 1).join('/');
     if (partial.startsWith('/')) {
diff --git a/packages/flutter_tools/lib/src/web/web_device.dart b/packages/flutter_tools/lib/src/web/web_device.dart
index bc25b83..628a640 100644
--- a/packages/flutter_tools/lib/src/web/web_device.dart
+++ b/packages/flutter_tools/lib/src/web/web_device.dart
@@ -7,12 +7,10 @@
 import '../application_package.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
-import '../base/process_manager.dart';
 import '../build_info.dart';
 import '../device.dart';
 import '../features.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import 'chrome.dart';
 
@@ -100,8 +98,8 @@
     }
     // See https://bugs.chromium.org/p/chromium/issues/detail?id=158372
     String version = 'unknown';
-    if (platform.isWindows) {
-      final ProcessResult result = await processManager.run(<String>[
+    if (globals.platform.isWindows) {
+      final ProcessResult result = await globals.processManager.run(<String>[
         r'reg', 'query', 'HKEY_CURRENT_USER\\Software\\Google\\Chrome\\BLBeacon', '/v', 'version',
       ]);
       if (result.exitCode == 0) {
@@ -112,7 +110,7 @@
       }
     } else {
       final String chrome = findChromeExecutable();
-      final ProcessResult result = await processManager.run(<String>[
+      final ProcessResult result = await globals.processManager.run(<String>[
         chrome,
         '--version',
       ]);
@@ -137,11 +135,11 @@
     // for the web initialization and server logic.
     final String url = platformArgs['uri'] as String;
     _chrome = await chromeLauncher.launch(url,
-      dataDir: fs.currentDirectory
+      dataDir: globals.fs.currentDirectory
         .childDirectory('.dart_tool')
         .childDirectory('chrome-device'));
 
-    logger.sendEvent('app.webLaunchUrl', <String, dynamic>{'url': url, 'launched': true});
+    globals.logger.sendEvent('app.webLaunchUrl', <String, dynamic>{'url': url, 'launched': true});
 
     return LaunchResult.succeeded(observatoryUri: null);
   }
@@ -261,11 +259,11 @@
   }) async {
     final String url = platformArgs['uri'] as String;
     if (debuggingOptions.startPaused) {
-      printStatus('Waiting for connection from Dart debug extension at $url', emphasis: true);
+      globals.printStatus('Waiting for connection from Dart debug extension at $url', emphasis: true);
     } else {
-      printStatus('$mainPath is being served at $url', emphasis: true);
+      globals.printStatus('$mainPath is being served at $url', emphasis: true);
     }
-    logger.sendEvent('app.webLaunchUrl', <String, dynamic>{'url': url, 'launched': false});
+    globals.logger.sendEvent('app.webLaunchUrl', <String, dynamic>{'url': url, 'launched': false});
     return LaunchResult.succeeded(observatoryUri: null);
   }
 
diff --git a/packages/flutter_tools/lib/src/web/web_validator.dart b/packages/flutter_tools/lib/src/web/web_validator.dart
index e8873e6..b96ae3e 100644
--- a/packages/flutter_tools/lib/src/web/web_validator.dart
+++ b/packages/flutter_tools/lib/src/web/web_validator.dart
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '../base/platform.dart';
 import '../doctor.dart';
+import '../globals.dart' as globals;
 import 'chrome.dart';
 
 /// A validator that checks whether chrome is installed and can run.
@@ -15,7 +15,7 @@
     final String chrome = findChromeExecutable();
     final bool canRunChrome = chromeLauncher.canFindChrome();
     final List<ValidationMessage> messages = <ValidationMessage>[
-      if (platform.environment.containsKey(kChromeEnvironment))
+      if (globals.platform.environment.containsKey(kChromeEnvironment))
         if (!canRunChrome)
           ValidationMessage.hint('$chrome is not executable.')
         else
diff --git a/packages/flutter_tools/lib/src/web/workflow.dart b/packages/flutter_tools/lib/src/web/workflow.dart
index 1e5f591..55d602e 100644
--- a/packages/flutter_tools/lib/src/web/workflow.dart
+++ b/packages/flutter_tools/lib/src/web/workflow.dart
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 import '../base/context.dart';
-import '../base/platform.dart';
 import '../doctor.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 
 /// The  web workflow instance.
 WebWorkflow get webWorkflow => context.get<WebWorkflow>();
@@ -14,7 +14,7 @@
   const WebWorkflow();
 
   @override
-  bool get appliesToHostPlatform => featureFlags.isWebEnabled && (platform.isWindows || platform.isMacOS || platform.isLinux);
+  bool get appliesToHostPlatform => featureFlags.isWebEnabled && (globals.platform.isWindows || globals.platform.isMacOS || globals.platform.isLinux);
 
   @override
   bool get canLaunchDevices => featureFlags.isWebEnabled;
diff --git a/packages/flutter_tools/lib/src/windows/application_package.dart b/packages/flutter_tools/lib/src/windows/application_package.dart
index 44b39e3..bd93c80 100644
--- a/packages/flutter_tools/lib/src/windows/application_package.dart
+++ b/packages/flutter_tools/lib/src/windows/application_package.dart
@@ -9,6 +9,7 @@
 import '../base/file_system.dart';
 import '../base/utils.dart';
 import '../build_info.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 
 abstract class WindowsApp extends ApplicationPackage {
@@ -64,7 +65,7 @@
     if (!exeNameFile.existsSync()) {
       throwToolExit('Failed to find Windows executable name');
     }
-    return fs.path.join(
+    return globals.fs.path.join(
         getWindowsBuildDirectory(),
         'x64',
         toTitleCase(getNameForBuildMode(buildMode)),
diff --git a/packages/flutter_tools/lib/src/windows/build_windows.dart b/packages/flutter_tools/lib/src/windows/build_windows.dart
index 2f0644f..55e4b77 100644
--- a/packages/flutter_tools/lib/src/windows/build_windows.dart
+++ b/packages/flutter_tools/lib/src/windows/build_windows.dart
@@ -4,12 +4,11 @@
 
 import '../artifacts.dart';
 import '../base/common.dart';
-import '../base/file_system.dart';
 import '../base/logger.dart';
 import '../base/process.dart';
 import '../build_info.dart';
 import '../cache.dart';
-import '../globals.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import '../reporting/reporting.dart';
 import 'msbuild_utils.dart';
@@ -26,11 +25,11 @@
   if (target != null) {
     environment['FLUTTER_TARGET'] = target;
   }
-  if (artifacts is LocalEngineArtifacts) {
-    final LocalEngineArtifacts localEngineArtifacts = artifacts as LocalEngineArtifacts;
+  if (globals.artifacts is LocalEngineArtifacts) {
+    final LocalEngineArtifacts localEngineArtifacts = globals.artifacts as LocalEngineArtifacts;
     final String engineOutPath = localEngineArtifacts.engineOutPath;
-    environment['FLUTTER_ENGINE'] = fs.path.dirname(fs.path.dirname(engineOutPath));
-    environment['LOCAL_ENGINE'] = fs.path.basename(engineOutPath);
+    environment['FLUTTER_ENGINE'] = globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath));
+    environment['LOCAL_ENGINE'] = globals.fs.path.basename(engineOutPath);
   }
   writePropertySheet(windowsProject.generatedPropertySheetFile, environment);
 
@@ -42,14 +41,14 @@
 
   if (!buildInfo.isDebug) {
     const String warning = '🚧 ';
-    printStatus(warning * 20);
-    printStatus('Warning: Only debug is currently implemented for Windows. This is effectively a debug build.');
-    printStatus('See https://github.com/flutter/flutter/issues/38477 for details and updates.');
-    printStatus(warning * 20);
-    printStatus('');
+    globals.printStatus(warning * 20);
+    globals.printStatus('Warning: Only debug is currently implemented for Windows. This is effectively a debug build.');
+    globals.printStatus('See https://github.com/flutter/flutter/issues/38477 for details and updates.');
+    globals.printStatus(warning * 20);
+    globals.printStatus('');
   }
 
-  final String buildScript = fs.path.join(
+  final String buildScript = globals.fs.path.join(
     Cache.flutterRoot,
     'packages',
     'flutter_tools',
@@ -60,7 +59,7 @@
   final String configuration = buildInfo.isDebug ? 'Debug' : 'Release';
   final String solutionPath = windowsProject.solutionFile.path;
   final Stopwatch sw = Stopwatch()..start();
-  final Status status = logger.startProgress(
+  final Status status = globals.logger.startProgress(
     'Building Windows application...',
     timeout: null,
   );
@@ -72,9 +71,9 @@
     result = await processUtils.stream(<String>[
       buildScript,
       vcvarsScript,
-      fs.path.basename(solutionPath),
+      globals.fs.path.basename(solutionPath),
       configuration,
-    ], workingDirectory: fs.path.dirname(solutionPath), trace: true);
+    ], workingDirectory: globals.fs.path.dirname(solutionPath), trace: true);
   } finally {
     status.cancel();
   }
diff --git a/packages/flutter_tools/lib/src/windows/visual_studio.dart b/packages/flutter_tools/lib/src/windows/visual_studio.dart
index 2d8620d..da1079b 100644
--- a/packages/flutter_tools/lib/src/windows/visual_studio.dart
+++ b/packages/flutter_tools/lib/src/windows/visual_studio.dart
@@ -3,11 +3,10 @@
 // found in the LICENSE file.
 
 import '../base/context.dart';
-import '../base/file_system.dart';
 import '../base/io.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../convert.dart';
+import '../globals.dart' as globals;
 
 VisualStudio get visualStudio => context.get<VisualStudio>();
 
@@ -96,7 +95,7 @@
     if (details.isEmpty) {
       return null;
     }
-    return fs.path.join(
+    return globals.fs.path.join(
       _usableVisualStudioDetails[_installationPathKey] as String,
       'VC',
       'Auxiliary',
@@ -111,8 +110,8 @@
   /// present then there isn't a new enough installation of VS. This path is
   /// not user-controllable, unlike the install location of Visual Studio
   /// itself.
-  final String _vswherePath = fs.path.join(
-    platform.environment['PROGRAMFILES(X86)'],
+  final String _vswherePath = globals.fs.path.join(
+    globals.platform.environment['PROGRAMFILES(X86)'],
     'Microsoft Visual Studio',
     'Installer',
     'vswhere.exe',
diff --git a/packages/flutter_tools/lib/src/windows/windows_device.dart b/packages/flutter_tools/lib/src/windows/windows_device.dart
index 4c4d4e2..1161d6d 100644
--- a/packages/flutter_tools/lib/src/windows/windows_device.dart
+++ b/packages/flutter_tools/lib/src/windows/windows_device.dart
@@ -5,11 +5,11 @@
 import 'package:meta/meta.dart';
 
 import '../base/io.dart';
-import '../base/platform.dart';
 import '../base/process.dart';
 import '../build_info.dart';
 import '../desktop_device.dart';
 import '../device.dart';
+import '../globals.dart' as globals;
 import '../project.dart';
 import 'application_package.dart';
 import 'build_windows.dart';
@@ -60,7 +60,7 @@
   WindowsDevices() : super('windows devices');
 
   @override
-  bool get supportsPlatform => platform.isWindows;
+  bool get supportsPlatform => globals.platform.isWindows;
 
   @override
   bool get canListAnything => windowsWorkflow.canListDevices;
diff --git a/packages/flutter_tools/lib/src/windows/windows_workflow.dart b/packages/flutter_tools/lib/src/windows/windows_workflow.dart
index 74be049..72dddea 100644
--- a/packages/flutter_tools/lib/src/windows/windows_workflow.dart
+++ b/packages/flutter_tools/lib/src/windows/windows_workflow.dart
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 import '../base/context.dart';
-import '../base/platform.dart';
 import '../doctor.dart';
 import '../features.dart';
+import '../globals.dart' as globals;
 
 /// The [WindowsWorkflow] instance.
 WindowsWorkflow get windowsWorkflow => context.get<WindowsWorkflow>();
@@ -18,13 +18,13 @@
   const WindowsWorkflow();
 
   @override
-  bool get appliesToHostPlatform => platform.isWindows && featureFlags.isWindowsEnabled;
+  bool get appliesToHostPlatform => globals.platform.isWindows && featureFlags.isWindowsEnabled;
 
   @override
-  bool get canLaunchDevices => platform.isWindows && featureFlags.isWindowsEnabled;
+  bool get canLaunchDevices => globals.platform.isWindows && featureFlags.isWindowsEnabled;
 
   @override
-  bool get canListDevices => platform.isWindows && featureFlags.isWindowsEnabled;
+  bool get canListDevices => globals.platform.isWindows && featureFlags.isWindowsEnabled;
 
   @override
   bool get canListEmulators => false;
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart
index 6ccca56..cc94e54 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart
@@ -10,6 +10,7 @@
 import 'package:flutter_tools/src/dart/pub.dart';
 import 'package:flutter_tools/src/dart/sdk.dart';
 import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -20,7 +21,7 @@
 
   setUp(() {
     FlutterCommandRunner.initFlutterRoot();
-    tempDir = fs.systemTempDirectory.createTempSync('flutter_analysis_test.');
+    tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analysis_test.');
   });
 
   tearDown(() {
@@ -92,12 +93,12 @@
 }
 
 void _createSampleProject(Directory directory, { bool brokenCode = false }) {
-  final File pubspecFile = fs.file(fs.path.join(directory.path, 'pubspec.yaml'));
+  final File pubspecFile = globals.fs.file(globals.fs.path.join(directory.path, 'pubspec.yaml'));
   pubspecFile.writeAsStringSync('''
 name: foo_project
 ''');
 
-  final File dartFile = fs.file(fs.path.join(directory.path, 'lib', 'main.dart'));
+  final File dartFile = globals.fs.file(globals.fs.path.join(directory.path, 'lib', 'main.dart'));
   dartFile.parent.createSync();
   dartFile.writeAsStringSync('''
 void main() {
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart
index 8e5fb42..a2c11be 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart
@@ -6,6 +6,7 @@
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/analyze_base.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -31,15 +32,15 @@
     testUsingContext('inRepo', () {
       // Absolute paths
       expect(inRepo(<String>[tempDir.path]), isFalse);
-      expect(inRepo(<String>[fs.path.join(tempDir.path, 'foo')]), isFalse);
+      expect(inRepo(<String>[globals.fs.path.join(tempDir.path, 'foo')]), isFalse);
       expect(inRepo(<String>[Cache.flutterRoot]), isTrue);
-      expect(inRepo(<String>[fs.path.join(Cache.flutterRoot, 'foo')]), isTrue);
+      expect(inRepo(<String>[globals.fs.path.join(Cache.flutterRoot, 'foo')]), isTrue);
 
       // Relative paths
-      fs.currentDirectory = Cache.flutterRoot;
+      globals.fs.currentDirectory = Cache.flutterRoot;
       expect(inRepo(<String>['.']), isTrue);
       expect(inRepo(<String>['foo']), isTrue);
-      fs.currentDirectory = tempDir.path;
+      globals.fs.currentDirectory = tempDir.path;
       expect(inRepo(<String>['.']), isFalse);
       expect(inRepo(<String>['foo']), isFalse);
 
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart
index fd7e09d..3eeef20 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart
@@ -9,6 +9,7 @@
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/assemble.dart';
 import 'package:mockito/mockito.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -87,8 +88,8 @@
       .thenAnswer((Invocation invocation) async {
         return BuildResult(
           success: true,
-          inputFiles: <File>[fs.file('foo')..createSync()],
-          outputFiles: <File>[fs.file('bar')..createSync()],
+          inputFiles: <File>[globals.fs.file('foo')..createSync()],
+          outputFiles: <File>[globals.fs.file('bar')..createSync()],
         );
       });
 
@@ -101,8 +102,8 @@
       'debug_macos_bundle_flutter_assets',
     ]);
 
-    final File inputs = fs.file('inputs');
-    final File outputs = fs.file('outputs');
+    final File inputs = globals.fs.file('inputs');
+    final File outputs = globals.fs.file('outputs');
     expect(inputs.readAsStringSync(), contains('foo'));
     expect(outputs.readAsStringSync(), contains('bar'));
 
@@ -124,8 +125,8 @@
       .thenAnswer((Invocation invocation) async {
         return BuildResult(
           success: true,
-          inputFiles: <File>[fs.file('foo'), fs.file('fizz')..createSync()],
-          outputFiles: <File>[fs.file('bar'), fs.file(fs.path.join('.dart_tool', 'fizz2'))..createSync(recursive: true)]);
+          inputFiles: <File>[globals.fs.file('foo'), globals.fs.file('fizz')..createSync()],
+          outputFiles: <File>[globals.fs.file('bar'), globals.fs.file(globals.fs.path.join('.dart_tool', 'fizz2'))..createSync(recursive: true)]);
       });
     await commandRunner.run(<String>[
       'assemble',
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart
index ccb7249..7c1dec7 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart
@@ -10,7 +10,7 @@
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/logger.dart';
 import 'package:flutter_tools/src/base/net.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/attach.dart';
@@ -26,6 +26,7 @@
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 import 'package:quiver/testing/async.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -41,7 +42,7 @@
       Cache.disableLocking();
       logger = StreamLogger();
       testFileSystem = MemoryFileSystem(
-      style: platform.isWindows
+      style: globals.platform.isWindows
           ? FileSystemStyle.windows
           : FileSystemStyle.posix,
       );
@@ -403,11 +404,11 @@
               'Observatory listening on http://127.0.0.1:$devicePort');
           return mockLogReader;
         });
-      final File foo = fs.file('lib/foo.dart')
+      final File foo = globals.fs.file('lib/foo.dart')
         ..createSync();
 
       // Delete the main.dart file to be sure that attach works without it.
-      fs.file(fs.path.join('lib', 'main.dart')).deleteSync();
+      globals.fs.file(globals.fs.path.join('lib', 'main.dart')).deleteSync();
 
       final AttachCommand command = AttachCommand(hotRunnerFactory: mockHotRunnerFactory);
       await createTestCommandRunner(command).run(<String>['attach', '-t', foo.path, '-v']);
@@ -456,10 +457,10 @@
 
       testDeviceManager.addDevice(device);
 
-      final File foo = fs.file('lib/foo.dart')..createSync();
+      final File foo = globals.fs.file('lib/foo.dart')..createSync();
 
       // Delete the main.dart file to be sure that attach works without it.
-      fs.file(fs.path.join('lib', 'main.dart')).deleteSync();
+      globals.fs.file(globals.fs.path.join('lib', 'main.dart')).deleteSync();
 
       final AttachCommand command = AttachCommand(hotRunnerFactory: mockHotRunnerFactory);
       await createTestCommandRunner(command).run(<String>['attach', '-t', foo.path, '-v']);
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_aot_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_aot_test.dart
index d5e5e98..c52fdaa 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_aot_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_aot_test.dart
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/targets/dart.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build.dart';
 import 'package:mockito/mockito.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/mocks.dart';
@@ -31,9 +31,9 @@
   });
 
   test('invokes assemble for android aot build.', () => testbed.run(() async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
     when(buildSystem.build(any, any)).thenAnswer((Invocation invocation) async {
       return BuildResult(success: true);
     });
@@ -49,7 +49,7 @@
 
     final Environment environment = verify(buildSystem.build(any, captureAny)).captured.single as Environment;
     expect(environment.defines, <String, String>{
-      kTargetFile: fs.path.absolute(fs.path.join('lib', 'main.dart')),
+      kTargetFile: globals.fs.path.absolute(globals.fs.path.join('lib', 'main.dart')),
       kBuildMode: 'release',
       kTargetPlatform: 'android-arm',
     });
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart
index c95035e..404ab86 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart
@@ -3,9 +3,10 @@
 // found in the LICENSE file.
 
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build.dart';
@@ -16,6 +17,7 @@
 import 'package:meta/meta.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -58,9 +60,9 @@
     testUsingContext('there is no cmx file', () async {
       final BuildCommand command = BuildCommand();
       applyMocksToCommand(command);
-      fs.directory('fuchsia').createSync(recursive: true);
-      fs.file('.packages').createSync();
-      fs.file('pubspec.yaml').createSync();
+      globals.fs.directory('fuchsia').createSync(recursive: true);
+      globals.fs.file('.packages').createSync();
+      globals.fs.file('pubspec.yaml').createSync();
 
       expect(
           createTestCommandRunner(command)
@@ -76,12 +78,12 @@
       final BuildCommand command = BuildCommand();
       applyMocksToCommand(command);
       const String appName = 'app_name';
-      fs
-          .file(fs.path.join('fuchsia', 'meta', '$appName.cmx'))
+      globals.fs
+          .file(globals.fs.path.join('fuchsia', 'meta', '$appName.cmx'))
           ..createSync(recursive: true)
           ..writeAsStringSync('{}');
-      fs.file('.packages').createSync();
-      final File pubspecFile = fs.file('pubspec.yaml')..createSync();
+      globals.fs.file('.packages').createSync();
+      final File pubspecFile = globals.fs.file('pubspec.yaml')..createSync();
       pubspecFile.writeAsStringSync('name: $appName');
 
       expect(
@@ -98,13 +100,13 @@
       final BuildCommand command = BuildCommand();
       applyMocksToCommand(command);
       const String appName = 'app_name';
-      fs
-          .file(fs.path.join('fuchsia', 'meta', '$appName.cmx'))
+      globals.fs
+          .file(globals.fs.path.join('fuchsia', 'meta', '$appName.cmx'))
           ..createSync(recursive: true)
           ..writeAsStringSync('{}');
-      fs.file('.packages').createSync();
-      fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-      final File pubspecFile = fs.file('pubspec.yaml')..createSync();
+      globals.fs.file('.packages').createSync();
+      globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+      final File pubspecFile = globals.fs.file('pubspec.yaml')..createSync();
       pubspecFile.writeAsStringSync('name: $appName');
       expect(
           createTestCommandRunner(command)
@@ -121,20 +123,20 @@
     final BuildCommand command = BuildCommand();
     applyMocksToCommand(command);
     const String appName = 'app_name';
-    fs
-        .file(fs.path.join('fuchsia', 'meta', '$appName.cmx'))
+    globals.fs
+        .file(globals.fs.path.join('fuchsia', 'meta', '$appName.cmx'))
         ..createSync(recursive: true)
         ..writeAsStringSync('{}');
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-    final File pubspecFile = fs.file('pubspec.yaml')..createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    final File pubspecFile = globals.fs.file('pubspec.yaml')..createSync();
     pubspecFile.writeAsStringSync('name: $appName');
 
     await createTestCommandRunner(command)
         .run(const <String>['build', 'fuchsia']);
     final String farPath =
-        fs.path.join(getFuchsiaBuildDirectory(), 'pkg', 'app_name-0.far');
-    expect(fs.file(farPath).existsSync(), isTrue);
+        globals.fs.path.join(getFuchsiaBuildDirectory(), 'pkg', 'app_name-0.far');
+    expect(globals.fs.file(farPath).existsSync(), isTrue);
   }, overrides: <Type, Generator>{
     Platform: () => linuxPlatform,
     FileSystem: () => MemoryFileSystem(),
@@ -155,11 +157,11 @@
 
   @override
   Future<bool> init(String buildPath, String appName) async {
-    if (!fs.directory(buildPath).existsSync()) {
+    if (!globals.fs.directory(buildPath).existsSync()) {
       return false;
     }
-    fs
-        .file(fs.path.join(buildPath, 'meta', 'package'))
+    globals.fs
+        .file(globals.fs.path.join(buildPath, 'meta', 'package'))
         .createSync(recursive: true);
     _appName = appName;
     return true;
@@ -167,36 +169,36 @@
 
   @override
   Future<bool> genkey(String buildPath, String outKeyPath) async {
-    if (!fs.file(fs.path.join(buildPath, 'meta', 'package')).existsSync()) {
+    if (!globals.fs.file(globals.fs.path.join(buildPath, 'meta', 'package')).existsSync()) {
       return false;
     }
-    fs.file(outKeyPath).createSync(recursive: true);
+    globals.fs.file(outKeyPath).createSync(recursive: true);
     return true;
   }
 
   @override
   Future<bool> build(String buildPath, String keyPath, String manifestPath) async {
-    if (!fs.file(fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
-        !fs.file(keyPath).existsSync() ||
-        !fs.file(manifestPath).existsSync()) {
+    if (!globals.fs.file(globals.fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
+        !globals.fs.file(keyPath).existsSync() ||
+        !globals.fs.file(manifestPath).existsSync()) {
       return false;
     }
-    fs.file(fs.path.join(buildPath, 'meta.far')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join(buildPath, 'meta.far')).createSync(recursive: true);
     return true;
   }
 
   @override
   Future<bool> archive(String buildPath, String keyPath, String manifestPath) async {
-    if (!fs.file(fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
-        !fs.file(keyPath).existsSync() ||
-        !fs.file(manifestPath).existsSync()) {
+    if (!globals.fs.file(globals.fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
+        !globals.fs.file(keyPath).existsSync() ||
+        !globals.fs.file(manifestPath).existsSync()) {
       return false;
     }
     if (_appName == null) {
       return false;
     }
-    fs
-        .file(fs.path.join(buildPath, '$_appName-0.far'))
+    globals.fs
+        .file(globals.fs.path.join(buildPath, '$_appName-0.far'))
         .createSync(recursive: true);
     return true;
   }
@@ -211,8 +213,8 @@
   }) async {
     final String outDir = getFuchsiaBuildDirectory();
     final String appName = fuchsiaProject.project.manifest.appName;
-    final String manifestPath = fs.path.join(outDir, '$appName.dilpmanifest');
-    fs.file(manifestPath).createSync(recursive: true);
+    final String manifestPath = globals.fs.path.join(outDir, '$appName.dilpmanifest');
+    globals.fs.file(manifestPath).createSync(recursive: true);
   }
 }
 
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_framework_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_framework_test.dart
index 3c9a557..77fe437 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_framework_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_framework_test.dart
@@ -10,6 +10,7 @@
 import 'package:flutter_tools/src/commands/build_ios_framework.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../../src/common.dart';
@@ -34,7 +35,7 @@
         mockCache = MockCache();
 
         when(mockFlutterVersion.gitTagVersion).thenReturn(mockGitTagVersion);
-        outputDirectory = fs.systemTempDirectory
+        outputDirectory = globals.fs.systemTempDirectory
             .createTempSync('flutter_build_ios_framework_test_output.')
             .childDirectory('Debug')
           ..createSync();
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart
index 88f0c4d..d2d9354 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart
@@ -4,10 +4,13 @@
 
 import 'package:args/command_runner.dart';
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+import 'package:mockito/mockito.dart';
+import 'package:process/process.dart';
+
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build.dart';
 import 'package:flutter_tools/src/commands/build_linux.dart';
@@ -15,8 +18,7 @@
 import 'package:flutter_tools/src/features.dart';
 import 'package:flutter_tools/src/linux/makefile.dart';
 import 'package:flutter_tools/src/project.dart';
-import 'package:mockito/mockito.dart';
-import 'package:process/process.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -55,10 +57,10 @@
 
   // Creates the mock files necessary to run a build.
   void setUpMockProjectFilesForBuild() {
-    fs.file('linux/build.sh').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file('linux/build.sh').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
   }
 
   // Sets up mock expectation for running 'make'.
@@ -110,7 +112,7 @@
     await createTestCommandRunner(command).run(
       const <String>['build', 'linux']
     );
-    expect(fs.file('linux/flutter/ephemeral/generated_config.mk').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/generated_config.mk').existsSync(), true);
   }, overrides: <Type, Generator>{
     FileSystem: () => MemoryFileSystem(),
     ProcessManager: () => mockProcessManager,
@@ -190,15 +192,15 @@
   });
 
   testUsingContext('linux can extract binary name from Makefile', () async {
-    fs.file('linux/Makefile')
+    globals.fs.file('linux/Makefile')
       ..createSync(recursive: true)
       ..writeAsStringSync(r'''
 # Comment
 SOMETHING_ELSE=FOO
 BINARY_NAME=fizz_bar
 ''');
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(makefileExecutableName(flutterProject.linux), 'fizz_bar');
@@ -236,7 +238,7 @@
   });
 
   testUsingContext('hidden when not enabled on Linux host', () {
-    when(platform.isLinux).thenReturn(true);
+    when(globals.platform.isLinux).thenReturn(true);
 
     expect(BuildLinuxCommand().hidden, true);
   }, overrides: <Type, Generator>{
@@ -245,7 +247,7 @@
   });
 
   testUsingContext('Not hidden when enabled and on Linux host', () {
-    when(platform.isLinux).thenReturn(true);
+    when(globals.platform.isLinux).thenReturn(true);
 
     expect(BuildLinuxCommand().hidden, false);
   }, overrides: <Type, Generator>{
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart
index 6d0ca8c..7f6d74f 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart
@@ -4,10 +4,11 @@
 
 import 'package:args/command_runner.dart';
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build.dart';
@@ -18,6 +19,7 @@
 import 'package:flutter_tools/src/project.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -67,17 +69,17 @@
 
   // Sets up the minimal mock project files necessary for macOS builds to succeed.
   void createMinimalMockProjectFiles() {
-    fs.directory('macos').createSync();
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.directory('macos').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
   }
 
   // Mocks the process manager to handle an xcodebuild call to build the app
   // in the given configuration.
   void setUpMockXcodeBuildHandler(String configuration) {
-    final FlutterProject flutterProject = FlutterProject.fromDirectory(fs.currentDirectory);
-    final Directory flutterBuildDir = fs.directory(getMacOSBuildDirectory());
+    final FlutterProject flutterProject = FlutterProject.fromDirectory(globals.fs.currentDirectory);
+    final Directory flutterBuildDir = globals.fs.directory(getMacOSBuildDirectory());
     when(mockProcessManager.start(<String>[
       '/usr/bin/env',
       'xcrun',
@@ -86,11 +88,11 @@
       '-configuration', configuration,
       '-scheme', 'Runner',
       '-derivedDataPath', flutterBuildDir.absolute.path,
-      'OBJROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Intermediates.noindex')}',
-      'SYMROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Products')}',
+      'OBJROOT=${globals.fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Intermediates.noindex')}',
+      'SYMROOT=${globals.fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Products')}',
       'COMPILER_INDEX_STORE_ENABLE=NO',
     ])).thenAnswer((Invocation invocation) async {
-      fs.file(fs.path.join('macos', 'Flutter', 'ephemeral', '.app_filename'))
+      globals.fs.file(globals.fs.path.join('macos', 'Flutter', 'ephemeral', '.app_filename'))
         ..createSync(recursive: true)
         ..writeAsStringSync('example.app');
       return mockProcess;
@@ -111,9 +113,9 @@
   testUsingContext('macOS build fails on non-macOS platform', () async {
     final BuildCommand command = BuildCommand();
     applyMocksToCommand(command);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
 
     expect(createTestCommandRunner(command).run(
       const <String>['build', 'macos']
@@ -202,7 +204,7 @@
   });
 
   testUsingContext('hidden when not enabled on macOS host', () {
-    when(platform.isMacOS).thenReturn(true);
+    when(globals.platform.isMacOS).thenReturn(true);
 
     expect(BuildMacosCommand().hidden, true);
   }, overrides: <Type, Generator>{
@@ -211,7 +213,7 @@
   });
 
   testUsingContext('Not hidden when enabled and on macOS host', () {
-    when(platform.isMacOS).thenReturn(true);
+    when(globals.platform.isMacOS).thenReturn(true);
 
     expect(BuildMacosCommand().hidden, false);
   }, overrides: <Type, Generator>{
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart
index 00b693d..52922ca 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 import 'package:args/command_runner.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/base/common.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/cache.dart';
@@ -19,6 +19,7 @@
 import 'package:flutter_tools/src/version.dart';
 import 'package:flutter_tools/src/web/compile.dart';
 import 'package:mockito/mockito.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/mocks.dart';
@@ -35,12 +36,12 @@
 
   setUp(() {
     testbed = Testbed(setup: () {
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync('name: foo\n');
-      fs.file('.packages').createSync();
-      fs.file(fs.path.join('web', 'index.html')).createSync(recursive: true);
-      fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+      globals.fs.file('.packages').createSync();
+      globals.fs.file(globals.fs.path.join('web', 'index.html')).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
     }, overrides: <Type, Generator>{
       Platform: () => mockPlatform,
       FlutterVersion: () => MockFlutterVersion(),
@@ -50,11 +51,11 @@
   });
 
   test('Refuses to build for web when missing index.html', () => testbed.run(() async {
-    fs.file(fs.path.join('web', 'index.html')).deleteSync();
+    globals.fs.file(globals.fs.path.join('web', 'index.html')).deleteSync();
 
     expect(buildWeb(
       FlutterProject.current(),
-      fs.path.join('lib', 'main.dart'),
+      globals.fs.path.join('lib', 'main.dart'),
       BuildInfo.debug,
       false,
       const <String>[],
@@ -62,7 +63,7 @@
   }));
 
   test('Refuses to build using runner when missing index.html', () => testbed.run(() async {
-    fs.file(fs.path.join('web', 'index.html')).deleteSync();
+    globals.fs.file(globals.fs.path.join('web', 'index.html')).deleteSync();
 
     final ResidentWebRunner runner = DwdsWebRunnerFactory().createWebRunner(
       null,
@@ -99,23 +100,23 @@
     applyMocksToCommand(buildCommand);
     final CommandRunner<void> runner = createTestCommandRunner(buildCommand);
     final List<String> dependencies = <String>[
-      fs.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'web.dart'),
-      fs.path.join('bin', 'cache', 'flutter_web_sdk'),
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
-      fs.path.join('bin', 'cache', 'dart-sdk '),
+      globals.fs.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'web.dart'),
+      globals.fs.path.join('bin', 'cache', 'flutter_web_sdk'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk '),
     ];
     for (String dependency in dependencies) {
-      fs.file(dependency).createSync(recursive: true);
+      globals.fs.file(dependency).createSync(recursive: true);
     }
 
     // Project files.
-    fs.file('.packages')
+    globals.fs.file('.packages')
       ..writeAsStringSync('''
 foo:lib/
 fizz:bar/lib/
 ''');
-    fs.file('pubspec.yaml')
+    globals.fs.file('pubspec.yaml')
       ..writeAsStringSync('''
 name: foo
 
@@ -126,7 +127,7 @@
     path:
       bar/
 ''');
-    fs.file(fs.path.join('bar', 'pubspec.yaml'))
+    globals.fs.file(globals.fs.path.join('bar', 'pubspec.yaml'))
       ..createSync(recursive: true)
       ..writeAsStringSync('''
 name: bar
@@ -138,12 +139,12 @@
         pluginClass: UrlLauncherPlugin
         fileName: url_launcher_web.dart
 ''');
-    fs.file(fs.path.join('bar', 'lib', 'url_launcher_web.dart'))
+    globals.fs.file(globals.fs.path.join('bar', 'lib', 'url_launcher_web.dart'))
       ..createSync(recursive: true)
       ..writeAsStringSync('''
 class UrlLauncherPlugin {}
 ''');
-    fs.file(fs.path.join('lib', 'main.dart'))
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
       ..writeAsStringSync('void main() { }');
 
     // Process calls. We're not testing that these invocations are correct because
@@ -153,7 +154,7 @@
     });
     await runner.run(<String>['build', 'web']);
 
-    expect(fs.file(fs.path.join('lib', 'generated_plugin_registrant.dart')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('lib', 'generated_plugin_registrant.dart')).existsSync(), true);
   }, overrides: <Type, Generator>{
     FeatureFlags: () => TestFeatureFlags(isWebEnabled: true),
     BuildSystem: () => MockBuildSystem(),
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
index a78a908..9a81864 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart
@@ -3,10 +3,11 @@
 // found in the LICENSE file.
 
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build.dart';
 import 'package:flutter_tools/src/commands/build_windows.dart';
@@ -16,6 +17,7 @@
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 import 'package:xml/xml.dart' as xml;
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -59,7 +61,7 @@
   testUsingContext('Windows build fails when there is no vcvars64.bat', () async {
     final BuildCommand command = BuildCommand();
     applyMocksToCommand(command);
-    fs.file(solutionPath).createSync(recursive: true);
+    globals.fs.file(solutionPath).createSync(recursive: true);
     expect(createTestCommandRunner(command).run(
       const <String>['build', 'windows']
     ), throwsA(isInstanceOf<ToolExit>()));
@@ -89,11 +91,11 @@
   testUsingContext('Windows build fails on non windows platform', () async {
     final BuildCommand command = BuildCommand();
     applyMocksToCommand(command);
-    fs.file(solutionPath).createSync(recursive: true);
+    globals.fs.file(solutionPath).createSync(recursive: true);
     when(mockVisualStudio.vcvarsPath).thenReturn(vcvarsPath);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
 
     expect(createTestCommandRunner(command).run(
       const <String>['build', 'windows']
@@ -109,18 +111,18 @@
   testUsingContext('Windows build does not spew stdout to status logger', () async {
     final BuildCommand command = BuildCommand();
     applyMocksToCommand(command);
-    fs.file(solutionPath).createSync(recursive: true);
+    globals.fs.file(solutionPath).createSync(recursive: true);
     when(mockVisualStudio.vcvarsPath).thenReturn(vcvarsPath);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
 
     when(mockProcessManager.start(<String>[
       r'C:\packages\flutter_tools\bin\vs_build.bat',
       vcvarsPath,
-      fs.path.basename(solutionPath),
+      globals.fs.path.basename(solutionPath),
       'Release',
-    ], workingDirectory: fs.path.dirname(solutionPath))).thenAnswer((Invocation invocation) async {
+    ], workingDirectory: globals.fs.path.dirname(solutionPath))).thenAnswer((Invocation invocation) async {
       return mockProcess;
     });
 
@@ -140,18 +142,18 @@
   testUsingContext('Windows build invokes msbuild and writes generated files', () async {
     final BuildCommand command = BuildCommand();
     applyMocksToCommand(command);
-    fs.file(solutionPath).createSync(recursive: true);
+    globals.fs.file(solutionPath).createSync(recursive: true);
     when(mockVisualStudio.vcvarsPath).thenReturn(vcvarsPath);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
 
     when(mockProcessManager.start(<String>[
       r'C:\packages\flutter_tools\bin\vs_build.bat',
       vcvarsPath,
-      fs.path.basename(solutionPath),
+      globals.fs.path.basename(solutionPath),
       'Release',
-    ], workingDirectory: fs.path.dirname(solutionPath))).thenAnswer((Invocation invocation) async {
+    ], workingDirectory: globals.fs.path.dirname(solutionPath))).thenAnswer((Invocation invocation) async {
       return mockProcess;
     });
 
@@ -160,7 +162,7 @@
     );
 
     // Spot-check important elements from the properties file.
-    final File propsFile = fs.file(r'C:\windows\flutter\ephemeral\Generated.props');
+    final File propsFile = globals.fs.file(r'C:\windows\flutter\ephemeral\Generated.props');
     expect(propsFile.existsSync(), true);
     final xml.XmlDocument props = xml.parse(propsFile.readAsStringSync());
     expect(props.findAllElements('PropertyGroup').first.getAttribute('Label'), 'UserMacros');
@@ -177,18 +179,18 @@
   testUsingContext('Release build prints an under-construction warning', () async {
     final BuildCommand command = BuildCommand();
     applyMocksToCommand(command);
-    fs.file(solutionPath).createSync(recursive: true);
+    globals.fs.file(solutionPath).createSync(recursive: true);
     when(mockVisualStudio.vcvarsPath).thenReturn(vcvarsPath);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
 
     when(mockProcessManager.start(<String>[
       r'C:\packages\flutter_tools\bin\vs_build.bat',
       vcvarsPath,
-      fs.path.basename(solutionPath),
+      globals.fs.path.basename(solutionPath),
       'Release',
-    ], workingDirectory: fs.path.dirname(solutionPath))).thenAnswer((Invocation invocation) async {
+    ], workingDirectory: globals.fs.path.dirname(solutionPath))).thenAnswer((Invocation invocation) async {
       return mockProcess;
     });
 
@@ -206,7 +208,7 @@
   });
 
   testUsingContext('hidden when not enabled on Windows host', () {
-    when(platform.isWindows).thenReturn(true);
+    when(globals.platform.isWindows).thenReturn(true);
 
     expect(BuildWindowsCommand().hidden, true);
   }, overrides: <Type, Generator>{
@@ -215,7 +217,7 @@
   });
 
   testUsingContext('Not hidden when enabled and on Windows host', () {
-    when(platform.isWindows).thenReturn(true);
+    when(globals.platform.isWindows).thenReturn(true);
 
     expect(BuildWindowsCommand().hidden, false);
   }, overrides: <Type, Generator>{
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
index fef7c1c..7145de8 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart
@@ -3,10 +3,11 @@
 // found in the LICENSE file.
 
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/commands/clean.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:flutter_tools/src/macos/xcode.dart';
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart
index 475b4bc..608c400 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart
@@ -8,11 +8,11 @@
 import 'package:flutter_tools/src/android/android_sdk.dart';
 import 'package:flutter_tools/src/android/android_studio.dart';
 import 'package:flutter_tools/src/base/common.dart';
-import 'package:flutter_tools/src/base/config.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/config.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/version.dart';
 import 'package:mockito/mockito.dart';
@@ -120,19 +120,19 @@
         '--enable-macos-desktop',
       ]);
 
-      expect(Config.instance.getValue('enable-web'), true);
-      expect(Config.instance.getValue('enable-linux-desktop'), true);
-      expect(Config.instance.getValue('enable-windows-desktop'), true);
-      expect(Config.instance.getValue('enable-macos-desktop'), true);
+      expect(globals.config.getValue('enable-web'), true);
+      expect(globals.config.getValue('enable-linux-desktop'), true);
+      expect(globals.config.getValue('enable-windows-desktop'), true);
+      expect(globals.config.getValue('enable-macos-desktop'), true);
 
       await commandRunner.run(<String>[
         'config', '--clear-features',
       ]);
 
-      expect(Config.instance.getValue('enable-web'), null);
-      expect(Config.instance.getValue('enable-linux-desktop'), null);
-      expect(Config.instance.getValue('enable-windows-desktop'), null);
-      expect(Config.instance.getValue('enable-macos-desktop'), null);
+      expect(globals.config.getValue('enable-web'), null);
+      expect(globals.config.getValue('enable-linux-desktop'), null);
+      expect(globals.config.getValue('enable-windows-desktop'), null);
+      expect(globals.config.getValue('enable-macos-desktop'), null);
 
       await commandRunner.run(<String>[
         'config',
@@ -142,10 +142,10 @@
         '--no-enable-macos-desktop',
       ]);
 
-      expect(Config.instance.getValue('enable-web'), false);
-      expect(Config.instance.getValue('enable-linux-desktop'), false);
-      expect(Config.instance.getValue('enable-windows-desktop'), false);
-      expect(Config.instance.getValue('enable-macos-desktop'), false);
+      expect(globals.config.getValue('enable-web'), false);
+      expect(globals.config.getValue('enable-linux-desktop'), false);
+      expect(globals.config.getValue('enable-windows-desktop'), false);
+      expect(globals.config.getValue('enable-macos-desktop'), false);
       verifyNoAnalytics();
     }, overrides: <Type, Generator>{
       AndroidStudio: () => mockAndroidStudio,
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart
index 943422b..dc77557 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart
@@ -3,11 +3,11 @@
 // found in the LICENSE file.
 
 import 'package:args/command_runner.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/create.dart';
 import 'package:flutter_tools/src/doctor.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -24,15 +24,15 @@
     setUp(() {
       testbed = Testbed(setup: () {
         final List<String> paths = <String>[
-          fs.path.join('flutter', 'packages', 'flutter', 'pubspec.yaml'),
-          fs.path.join('flutter', 'packages', 'flutter_driver', 'pubspec.yaml'),
-          fs.path.join('flutter', 'packages', 'flutter_test', 'pubspec.yaml'),
-          fs.path.join('flutter', 'bin', 'cache', 'artifacts', 'gradle_wrapper', 'wrapper'),
-          fs.path.join('usr', 'local', 'bin', 'adb'),
-          fs.path.join('Android', 'platform-tools', 'adb.exe'),
+          globals.fs.path.join('flutter', 'packages', 'flutter', 'pubspec.yaml'),
+          globals.fs.path.join('flutter', 'packages', 'flutter_driver', 'pubspec.yaml'),
+          globals.fs.path.join('flutter', 'packages', 'flutter_test', 'pubspec.yaml'),
+          globals.fs.path.join('flutter', 'bin', 'cache', 'artifacts', 'gradle_wrapper', 'wrapper'),
+          globals.fs.path.join('usr', 'local', 'bin', 'adb'),
+          globals.fs.path.join('Android', 'platform-tools', 'adb.exe'),
         ];
         for (String path in paths) {
-          fs.file(path).createSync(recursive: true);
+          globals.fs.file(path).createSync(recursive: true);
         }
       }, overrides: <Type, Generator>{
         DoctorValidatorsProvider: () => FakeDoctorValidatorsProvider(),
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart
index fd4f51a79..ba5053b 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart
@@ -10,7 +10,7 @@
 import 'package:flutter_tools/src/base/utils.dart';
 import 'package:flutter_tools/src/commands/daemon.dart';
 import 'package:flutter_tools/src/fuchsia/fuchsia_workflow.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/ios/ios_workflow.dart';
 import 'package:flutter_tools/src/resident_runner.dart';
 
@@ -61,7 +61,7 @@
         notifyingLogger: notifyingLogger,
         dartDefines: const <String>[],
       );
-      printError('daemon.logMessage test');
+      globals.printError('daemon.logMessage test');
       final Map<String, dynamic> response = await responses.stream.firstWhere((Map<String, dynamic> map) {
         return map['event'] == 'daemon.logMessage' && map['params']['level'] == 'error';
       });
@@ -89,7 +89,7 @@
           logToStdout: true,
           dartDefines: const <String>[],
         );
-        printStatus('daemon.logMessage test');
+        globals.printStatus('daemon.logMessage test');
         // Service the event loop.
         await Future<void>.value();
       }, zoneSpecification: ZoneSpecification(print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart
index d0e28b9..5b3e077 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart
@@ -6,15 +6,13 @@
 
 import 'package:flutter_tools/src/artifacts.dart';
 import 'package:flutter_tools/src/base/common.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
-import 'package:flutter_tools/src/base/process_manager.dart';
+
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/base/user_messages.dart';
 import 'package:flutter_tools/src/doctor.dart';
 import 'package:flutter_tools/src/features.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/proxy_validator.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/vscode/vscode.dart';
@@ -24,6 +22,7 @@
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 import 'package:quiver/testing/async.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -493,7 +492,7 @@
 
     testUsingContext('gen_snapshot does not work', () async {
       when(mockProcessManager.runSync(
-        <String>[artifacts.getArtifactPath(Artifact.genSnapshot)],
+        <String>[globals.artifacts.getArtifactPath(Artifact.genSnapshot)],
         workingDirectory: anyNamed('workingDirectory'),
         environment: anyNamed('environment'),
       )).thenReturn(ProcessResult(101, 1, '', ''));
@@ -503,7 +502,7 @@
       for (String msg in userMessages.flutterBinariesDoNotRun.split('\n')) {
         expect(statusLines, contains(contains(msg)));
       }
-      if (platform.isLinux) {
+      if (globals.platform.isLinux) {
         for (String msg in userMessages.flutterBinariesLinuxRepairCommands.split('\n')) {
           expect(statusLines, contains(contains(msg)));
         }
@@ -522,7 +521,7 @@
       when(mockFlutterVersion.frameworkDate).thenThrow(versionCheckError);
 
       when(mockProcessManager.runSync(
-        <String>[artifacts.getArtifactPath(Artifact.genSnapshot)],
+        <String>[globals.artifacts.getArtifactPath(Artifact.genSnapshot)],
         workingDirectory: anyNamed('workingDirectory'),
         environment: anyNamed('environment'),
       )).thenReturn(ProcessResult(101, 255, '', ''));
@@ -705,7 +704,7 @@
   });
 
   testUsingContext('WebWorkflow is a part of validator workflows if enabled', () async {
-    when(processManager.canRun(any)).thenReturn(true);
+    when(globals.processManager.canRun(any)).thenReturn(true);
 
     expect(DoctorValidatorsProvider.defaultInstance.workflows.contains(webWorkflow), true);
   }, overrides: <Type, Generator>{
@@ -720,7 +719,7 @@
   IntelliJValidatorTestTarget(String title, String installPath) : super(title, installPath);
 
   @override
-  String get pluginsPath => fs.path.join('test', 'data', 'intellij', 'plugins');
+  String get pluginsPath => globals.fs.path.join('test', 'data', 'intellij', 'plugins');
 
   @override
   String get version => 'test.test.test';
@@ -1046,9 +1045,9 @@
   static VsCodeValidatorTestTargets get installedWithoutExtension =>
       VsCodeValidatorTestTargets._(validInstall, missingExtensions);
 
-  static final String validInstall = fs.path.join('test', 'data', 'vscode', 'application');
-  static final String validExtensions = fs.path.join('test', 'data', 'vscode', 'extensions');
-  static final String missingExtensions = fs.path.join('test', 'data', 'vscode', 'notExtensions');
+  static final String validInstall = globals.fs.path.join('test', 'data', 'vscode', 'application');
+  static final String validExtensions = globals.fs.path.join('test', 'data', 'vscode', 'extensions');
+  static final String missingExtensions = globals.fs.path.join('test', 'data', 'vscode', 'notExtensions');
 }
 
 class MockProcessManager extends Mock implements ProcessManager {}
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart
index 3e17f8f..43cb66b 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart
@@ -5,16 +5,18 @@
 import 'dart:async';
 
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/android/android_device.dart';
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/drive.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:mockito/mockito.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -66,9 +68,9 @@
     testUsingContext('returns 1 when test file is not found', () async {
       testDeviceManager.addDevice(MockDevice());
 
-      final String testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
-      final String testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
-      fs.file(testApp).createSync(recursive: true);
+      final String testApp = globals.fs.path.join(tempDir.path, 'test', 'e2e.dart');
+      final String testFile = globals.fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
+      globals.fs.file(testApp).createSync(recursive: true);
 
       final List<String> args = <String>[
         'drive',
@@ -91,8 +93,8 @@
       testDeviceManager.addDevice(MockDevice());
       appStarter = expectAsync1((DriveCommand command) async => null);
 
-      final String testApp = fs.path.join(tempDir.path, 'test_driver', 'e2e.dart');
-      final String testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
+      final String testApp = globals.fs.path.join(tempDir.path, 'test_driver', 'e2e.dart');
+      final String testFile = globals.fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
 
       final MemoryFileSystem memFs = fs;
       await memFs.file(testApp).writeAsString('main() { }');
@@ -116,8 +118,8 @@
     });
 
     testUsingContext('returns 1 when app file is outside package', () async {
-      final String appFile = fs.path.join(tempDir.dirname, 'other_app', 'app.dart');
-      fs.file(appFile).createSync(recursive: true);
+      final String appFile = globals.fs.path.join(tempDir.dirname, 'other_app', 'app.dart');
+      globals.fs.file(appFile).createSync(recursive: true);
       final List<String> args = <String>[
         '--no-wrap',
         'drive',
@@ -139,8 +141,8 @@
     });
 
     testUsingContext('returns 1 when app file is in the root dir', () async {
-      final String appFile = fs.path.join(tempDir.path, 'main.dart');
-      fs.file(appFile).createSync(recursive: true);
+      final String appFile = globals.fs.path.join(tempDir.path, 'main.dart');
+      globals.fs.file(appFile).createSync(recursive: true);
       final List<String> args = <String>[
         '--no-wrap',
         'drive',
@@ -165,8 +167,8 @@
     testUsingContext('returns 0 when test ends successfully', () async {
       testDeviceManager.addDevice(MockDevice());
 
-      final String testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
-      final String testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
+      final String testApp = globals.fs.path.join(tempDir.path, 'test', 'e2e.dart');
+      final String testFile = globals.fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
 
       appStarter = expectAsync1((DriveCommand command) async {
         return LaunchResult.succeeded();
@@ -210,8 +212,8 @@
     testUsingContext('returns exitCode set by test runner', () async {
       testDeviceManager.addDevice(MockDevice());
 
-      final String testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
-      final String testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
+      final String testApp = globals.fs.path.join(tempDir.path, 'test', 'e2e.dart');
+      final String testFile = globals.fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
 
       appStarter = expectAsync1((DriveCommand command) async {
         return LaunchResult.succeeded();
@@ -370,8 +372,8 @@
         )).thenAnswer((_) => Future<LaunchResult>.value(mockLaunchResult));
         when(mockDevice.isAppInstalled(any)).thenAnswer((_) => Future<bool>.value(false));
 
-        testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
-        testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
+        testApp = globals.fs.path.join(tempDir.path, 'test', 'e2e.dart');
+        testFile = globals.fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
 
         testRunner = (List<String> testArgs, Map<String, String> environment) async {
           throwToolExit(null, exitCode: 123);
@@ -503,8 +505,8 @@
         when(mockDevice.isAppInstalled(any))
             .thenAnswer((_) => Future<bool>.value(false));
 
-        testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
-        testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
+        testApp = globals.fs.path.join(tempDir.path, 'test', 'e2e.dart');
+        testFile = globals.fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
 
         testRunner = (List<String> testArgs, Map<String, String> environment) async {
           throwToolExit(null, exitCode: 123);
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/generate_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/generate_test.dart
index 68e3223..334d5af 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/generate_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/generate_test.dart
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/codegen.dart';
 import 'package:flutter_tools/src/commands/generate.dart';
 import 'package:flutter_tools/src/convert.dart';
 import 'package:mockito/mockito.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -47,10 +47,10 @@
   test('Outputs error information from flutter generate', () => testbed.run(() async {
     final GenerateCommand command = GenerateCommand();
     applyMocksToCommand(command);
-    fs.file(fs.path.join('lib', 'main.dart'))
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
       ..createSync(recursive: true);
 
-    fs.currentDirectory
+    globals.fs.currentDirectory
       .childDirectory('.dart_tool')
       .childDirectory('build')
       .childDirectory('abcdefg')
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/ide_config_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/ide_config_test.dart
index 9aec064..3e22868 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/ide_config_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/ide_config_test.dart
@@ -9,6 +9,7 @@
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/template.dart';
 import 'package:flutter_tools/src/commands/ide_config.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -24,33 +25,33 @@
       final String tempPath = tempDir.absolute.path;
       final List<String> paths =
         (root ?? tempDir).listSync(recursive: true).map((FileSystemEntity entity) {
-          final String relativePath = fs.path.relative(entity.path, from: tempPath);
+          final String relativePath = globals.fs.path.relative(entity.path, from: tempPath);
           return relativePath;
         }).toList();
       final Map<String, String> contents = <String, String>{};
       for (String path in paths) {
-        final String absPath = fs.path.join(tempPath, path);
-        if (fs.isDirectorySync(absPath)) {
+        final String absPath = globals.fs.path.join(tempPath, path);
+        if (globals.fs.isDirectorySync(absPath)) {
           contents[path] = 'dir';
-        } else if (fs.isFileSync(absPath)) {
-          contents[path] = fs.file(absPath).readAsStringSync();
+        } else if (globals.fs.isFileSync(absPath)) {
+          contents[path] = globals.fs.file(absPath).readAsStringSync();
         }
       }
       return contents;
     }
 
     Map<String, String> _getManifest(Directory base, String marker, { bool isTemplate = false }) {
-      final String basePath = fs.path.relative(base.path, from: tempDir.absolute.path);
+      final String basePath = globals.fs.path.relative(base.path, from: tempDir.absolute.path);
       final String suffix = isTemplate ? Template.copyTemplateExtension : '';
       return <String, String>{
-        fs.path.join(basePath, '.idea'): 'dir',
-        fs.path.join(basePath, '.idea', 'modules.xml$suffix'): 'modules $marker',
-        fs.path.join(basePath, '.idea', 'vcs.xml$suffix'): 'vcs $marker',
-        fs.path.join(basePath, '.idea', '.name$suffix'): 'codeStyleSettings $marker',
-        fs.path.join(basePath, '.idea', 'runConfigurations'): 'dir',
-        fs.path.join(basePath, '.idea', 'runConfigurations', 'hello_world.xml$suffix'): 'hello_world $marker',
-        fs.path.join(basePath, 'flutter.iml$suffix'): 'flutter $marker',
-        fs.path.join(basePath, 'packages', 'new', 'deep.iml$suffix'): 'deep $marker',
+        globals.fs.path.join(basePath, '.idea'): 'dir',
+        globals.fs.path.join(basePath, '.idea', 'modules.xml$suffix'): 'modules $marker',
+        globals.fs.path.join(basePath, '.idea', 'vcs.xml$suffix'): 'vcs $marker',
+        globals.fs.path.join(basePath, '.idea', '.name$suffix'): 'codeStyleSettings $marker',
+        globals.fs.path.join(basePath, '.idea', 'runConfigurations'): 'dir',
+        globals.fs.path.join(basePath, '.idea', 'runConfigurations', 'hello_world.xml$suffix'): 'hello_world $marker',
+        globals.fs.path.join(basePath, 'flutter.iml$suffix'): 'flutter $marker',
+        globals.fs.path.join(basePath, 'packages', 'new', 'deep.iml$suffix'): 'deep $marker',
       };
     }
 
@@ -70,8 +71,8 @@
     }
 
     bool _fileOrDirectoryExists(String path) {
-      final String absPath = fs.path.join(tempDir.absolute.path, path);
-      return fs.file(absPath).existsSync() || fs.directory(absPath).existsSync();
+      final String absPath = globals.fs.path.join(tempDir.absolute.path, path);
+      return globals.fs.file(absPath).existsSync() || globals.fs.directory(absPath).existsSync();
     }
 
     Future<void> _updateIdeConfig({
@@ -90,16 +91,16 @@
       ]);
 
       for (String path in expectedContents.keys) {
-        final String absPath = fs.path.join(tempDir.absolute.path, path);
-        expect(_fileOrDirectoryExists(fs.path.join(dir.path, path)), true,
+        final String absPath = globals.fs.path.join(tempDir.absolute.path, path);
+        expect(_fileOrDirectoryExists(globals.fs.path.join(dir.path, path)), true,
             reason: "$path doesn't exist");
-        if (fs.file(absPath).existsSync()) {
-          expect(fs.file(absPath).readAsStringSync(), equals(expectedContents[path]),
+        if (globals.fs.file(absPath).existsSync()) {
+          expect(globals.fs.file(absPath).readAsStringSync(), equals(expectedContents[path]),
               reason: "$path contents don't match");
         }
       }
       for (String path in unexpectedPaths) {
-        expect(_fileOrDirectoryExists(fs.path.join(dir.path, path)), false, reason: '$path exists');
+        expect(_fileOrDirectoryExists(globals.fs.path.join(dir.path, path)), false, reason: '$path exists');
       }
     }
 
@@ -108,7 +109,7 @@
     });
 
     setUp(() {
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_ide_config_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_ide_config_test.');
       final Directory packagesDir = tempDir.childDirectory('packages')..createSync(recursive: true);
       toolsDir = packagesDir.childDirectory('flutter_tools')..createSync();
       templateDir = toolsDir.childDirectory('ide_templates')..createSync();
@@ -189,7 +190,7 @@
         'template',
         isTemplate: true,
       );
-      final String flutterIml = fs.path.join(
+      final String flutterIml = globals.fs.path.join(
         'packages',
         'flutter_tools',
         'ide_templates',
@@ -259,7 +260,7 @@
         'existing',
         isTemplate: true,
       );
-      final String flutterIml = fs.path.join(
+      final String flutterIml = globals.fs.path.join(
         'packages',
         'flutter_tools',
         'ide_templates',
@@ -288,25 +289,25 @@
         tempDir,
         'existing',
       );
-      flutterManifest.remove(fs.path.join('packages', 'new', 'deep.iml'));
+      flutterManifest.remove(globals.fs.path.join('packages', 'new', 'deep.iml'));
       _populateDir(flutterManifest);
       final Map<String, String> updatedTemplates = _getManifest(
         intellijDir,
         'existing',
         isTemplate: true,
       );
-      String deepIml = fs.path.join(
+      String deepIml = globals.fs.path.join(
         'packages',
         'flutter_tools',
         'ide_templates',
         'intellij');
       // Remove the all the dir entries too.
       updatedTemplates.remove(deepIml);
-      deepIml = fs.path.join(deepIml, 'packages');
+      deepIml = globals.fs.path.join(deepIml, 'packages');
       updatedTemplates.remove(deepIml);
-      deepIml = fs.path.join(deepIml, 'new');
+      deepIml = globals.fs.path.join(deepIml, 'new');
       updatedTemplates.remove(deepIml);
-      deepIml = fs.path.join(deepIml, 'deep.iml');
+      deepIml = globals.fs.path.join(deepIml, 'deep.iml');
       updatedTemplates.remove(deepIml);
       final Map<String, String> expectedContents = <String, String>{
         ...flutterManifest,
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
index 9fb909c..466f4c8 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
@@ -20,7 +20,7 @@
 import 'package:flutter_tools/src/commands/run.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/features.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/resident_runner.dart';
@@ -61,9 +61,9 @@
     });
 
     testUsingContext('does not support "--use-application-binary" and "--fast-start"', () async {
-      fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
+      globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
 
       final RunCommand command = RunCommand();
       applyMocksToCommand(command);
@@ -97,9 +97,9 @@
       when(deviceManager.getDevices()).thenAnswer((Invocation invocation) {
         return Stream<Device>.value(mockDevice);
       });
-      fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
+      globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
 
       final RunCommand command = RunCommand();
       applyMocksToCommand(command);
@@ -114,7 +114,7 @@
         expect(e, isInstanceOf<ToolExit>());
       }
 
-      final BufferLogger bufferLogger = logger as BufferLogger;
+      final BufferLogger bufferLogger = globals.logger as BufferLogger;
       expect(bufferLogger.statusText, contains(
         'Using --fast-start option with device mockdevice, but this device '
         'does not support it. Overriding the setting to false.'
@@ -263,14 +263,14 @@
           (Invocation invocation) => Future<List<Device>>.value(<Device>[mockDevice])
         );
 
-        final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_run_test.');
+        final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_run_test.');
         tempDir.childDirectory('ios').childFile('AppDelegate.swift').createSync(recursive: true);
         tempDir.childFile('.packages').createSync();
         tempDir.childDirectory('lib').childFile('main.dart').createSync(recursive: true);
         tempDir.childFile('pubspec.yaml')
           ..createSync()
           ..writeAsStringSync('# Hello, World');
-        fs.currentDirectory = tempDir;
+        globals.fs.currentDirectory = tempDir;
 
         try {
           await createTestCommandRunner(command).run(<String>[
@@ -482,8 +482,8 @@
       });
 
       testUsingContext('populates the environment', () async {
-        final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_run_test.');
-        fs.currentDirectory = tempDir;
+        final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_run_test.');
+        globals.fs.currentDirectory = tempDir;
 
         final Directory libDir = tempDir.childDirectory('lib');
         libDir.createSync();
@@ -509,8 +509,8 @@
       });
 
       testUsingContext('populates dartDefines in --machine mode', () async {
-        final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_run_test.');
-        fs.currentDirectory = tempDir;
+        final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_run_test.');
+        globals.fs.currentDirectory = tempDir;
 
         final Directory libDir = tempDir.childDirectory('lib');
         libDir.createSync();
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart
index ac21ec7..d9bb0a4 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart
@@ -10,6 +10,7 @@
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/shell_completion.dart';
 import 'package:process/process.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -48,8 +49,8 @@
       await createTestCommandRunner(command).run(
         <String>['bash-completion', outputFile],
       );
-      expect(fs.isFileSync(outputFile), isTrue);
-      expect(fs.file(outputFile).readAsStringSync(), contains('__flutter_completion'));
+      expect(globals.fs.isFileSync(outputFile), isTrue);
+      expect(globals.fs.file(outputFile).readAsStringSync(), contains('__flutter_completion'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -59,7 +60,7 @@
     testUsingContext("won't overwrite existing output file ", () async {
       final ShellCompletionCommand command = ShellCompletionCommand();
       const String outputFile = 'bash-setup.sh';
-      fs.file(outputFile).createSync();
+      globals.fs.file(outputFile).createSync();
       try {
         await createTestCommandRunner(command).run(
           <String>['bash-completion', outputFile],
@@ -69,8 +70,8 @@
         expect(error.exitCode ?? 1, 1);
         expect(error.message, contains('Use --overwrite'));
       }
-      expect(fs.isFileSync(outputFile), isTrue);
-      expect(fs.file(outputFile).readAsStringSync(), isEmpty);
+      expect(globals.fs.isFileSync(outputFile), isTrue);
+      expect(globals.fs.file(outputFile).readAsStringSync(), isEmpty);
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -80,12 +81,12 @@
     testUsingContext('will overwrite existing output file if given --overwrite', () async {
       final ShellCompletionCommand command = ShellCompletionCommand();
       const String outputFile = 'bash-setup.sh';
-      fs.file(outputFile).createSync();
+      globals.fs.file(outputFile).createSync();
       await createTestCommandRunner(command).run(
         <String>['bash-completion', '--overwrite', outputFile],
       );
-      expect(fs.isFileSync(outputFile), isTrue);
-      expect(fs.file(outputFile).readAsStringSync(), contains('__flutter_completion'));
+      expect(globals.fs.isFileSync(outputFile), isTrue);
+      expect(globals.fs.file(outputFile).readAsStringSync(), contains('__flutter_completion'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
diff --git a/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart b/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart
index 5933d47..7d06528 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart
@@ -4,14 +4,16 @@
 
 import 'dart:async';
 
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/analyze.dart';
 import 'package:flutter_tools/src/commands/create.dart';
 import 'package:flutter_tools/src/dart/pub.dart';
 import 'package:flutter_tools/src/runner/flutter_command.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -22,7 +24,7 @@
 };
 
 void main() {
-  final String analyzerSeparator = platform.isWindows ? '-' : '•';
+  final String analyzerSeparator = globals.platform.isWindows ? '-' : '•';
 
   group('analyze once', () {
     Directory tempDir;
@@ -31,9 +33,9 @@
 
     setUpAll(() {
       Cache.disableLocking();
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_1.').absolute;
-      projectPath = fs.path.join(tempDir.path, 'flutter_project');
-      libMain = fs.file(fs.path.join(projectPath, 'lib', 'main.dart'));
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_1.').absolute;
+      projectPath = globals.fs.path.join(tempDir.path, 'flutter_project');
+      libMain = globals.fs.file(globals.fs.path.join(projectPath, 'lib', 'main.dart'));
     });
 
     tearDownAll(() {
@@ -47,7 +49,7 @@
         arguments: <String>['--no-wrap', 'create', projectPath],
         statusTextContains: <String>[
           'All done!',
-          'Your application code is in ${fs.path.normalize(fs.path.join(fs.path.relative(projectPath), 'lib', 'main.dart'))}',
+          'Your application code is in ${globals.fs.path.normalize(globals.fs.path.join(globals.fs.path.relative(projectPath), 'lib', 'main.dart'))}',
         ],
       );
       expect(libMain.existsSync(), isTrue);
@@ -58,7 +60,7 @@
     // Analyze in the current directory - no arguments
     testUsingContext('working directory', () async {
       await runCommand(
-        command: AnalyzeCommand(workingDirectory: fs.directory(projectPath)),
+        command: AnalyzeCommand(workingDirectory: globals.fs.directory(projectPath)),
         arguments: <String>['analyze'],
         statusTextContains: <String>['No issues found!'],
       );
@@ -98,7 +100,7 @@
 
       // Analyze in the current directory - no arguments
       await runCommand(
-        command: AnalyzeCommand(workingDirectory: fs.directory(projectPath)),
+        command: AnalyzeCommand(workingDirectory: globals.fs.directory(projectPath)),
         arguments: <String>['analyze'],
         statusTextContains: <String>[
           'Analyzing',
@@ -117,7 +119,7 @@
     testUsingContext('working directory with local options', () async {
       // Insert an analysis_options.yaml file in the project
       // which will trigger a lint for broken code that was inserted earlier
-      final File optionsFile = fs.file(fs.path.join(projectPath, 'analysis_options.yaml'));
+      final File optionsFile = globals.fs.file(globals.fs.path.join(projectPath, 'analysis_options.yaml'));
       await optionsFile.writeAsString('''
   include: package:flutter/analysis_options_user.yaml
   linter:
@@ -127,7 +129,7 @@
 
       // Analyze in the current directory - no arguments
       await runCommand(
-        command: AnalyzeCommand(workingDirectory: fs.directory(projectPath)),
+        command: AnalyzeCommand(workingDirectory: globals.fs.directory(projectPath)),
         arguments: <String>['analyze'],
         statusTextContains: <String>[
           'Analyzing',
@@ -144,17 +146,17 @@
     });
 
     testUsingContext('no duplicate issues', () async {
-      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_2.').absolute;
+      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_2.').absolute;
 
       try {
-        final File foo = fs.file(fs.path.join(tempDir.path, 'foo.dart'));
+        final File foo = globals.fs.file(globals.fs.path.join(tempDir.path, 'foo.dart'));
         foo.writeAsStringSync('''
 import 'bar.dart';
 
 void foo() => bar();
 ''');
 
-        final File bar = fs.file(fs.path.join(tempDir.path, 'bar.dart'));
+        final File bar = globals.fs.file(globals.fs.path.join(tempDir.path, 'bar.dart'));
         bar.writeAsStringSync('''
 import 'dart:async'; // unused
 
@@ -184,11 +186,11 @@
       const String contents = '''
 StringBuffer bar = StringBuffer('baz');
 ''';
-      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_3.');
+      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_3.');
       tempDir.childFile('main.dart').writeAsStringSync(contents);
       try {
         await runCommand(
-          command: AnalyzeCommand(workingDirectory: fs.directory(tempDir)),
+          command: AnalyzeCommand(workingDirectory: globals.fs.directory(tempDir)),
           arguments: <String>['analyze'],
           statusTextContains: <String>['No issues found!'],
         );
@@ -205,11 +207,11 @@
 // TODO(foobar):
 StringBuffer bar = StringBuffer('baz');
 ''';
-      final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_4.');
+      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_4.');
       tempDir.childFile('main.dart').writeAsStringSync(contents);
       try {
         await runCommand(
-          command: AnalyzeCommand(workingDirectory: fs.directory(tempDir)),
+          command: AnalyzeCommand(workingDirectory: globals.fs.directory(tempDir)),
           arguments: <String>['analyze'],
           statusTextContains: <String>['No issues found!'],
         );
diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart
index 5254a36..3018b67 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart
@@ -15,6 +15,7 @@
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -26,7 +27,7 @@
   MockBundleBuilder mockBundleBuilder;
 
   setUp(() {
-    tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+    tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
 
     mockBundleBuilder = MockBundleBuilder();
     when(
@@ -98,9 +99,9 @@
   });
 
   testUsingContext('bundle fails to build for Windows if feature is disabled', () async {
-    fs.file('lib/main.dart').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync(recursive: true);
-    fs.file('.packages').createSync(recursive: true);
+    globals.fs.file('lib/main.dart').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync(recursive: true);
+    globals.fs.file('.packages').createSync(recursive: true);
     final CommandRunner<void> runner = createTestCommandRunner(BuildBundleCommand()
         ..bundleBuilder = MockBundleBuilder());
 
@@ -116,9 +117,9 @@
   });
 
   testUsingContext('bundle fails to build for Linux if feature is disabled', () async {
-    fs.file('lib/main.dart').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('lib/main.dart').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final CommandRunner<void> runner = createTestCommandRunner(BuildBundleCommand()
         ..bundleBuilder = MockBundleBuilder());
 
@@ -134,9 +135,9 @@
   });
 
   testUsingContext('bundle fails to build for macOS if feature is disabled', () async {
-    fs.file('lib/main.dart').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('lib/main.dart').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final CommandRunner<void> runner = createTestCommandRunner(BuildBundleCommand()
         ..bundleBuilder = MockBundleBuilder());
 
@@ -152,9 +153,9 @@
   });
 
   testUsingContext('bundle can build for Windows if feature is enabled', () async {
-    fs.file('lib/main.dart').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('lib/main.dart').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final CommandRunner<void> runner = createTestCommandRunner(BuildBundleCommand()
         ..bundleBuilder = MockBundleBuilder());
 
@@ -170,9 +171,9 @@
   });
 
   testUsingContext('bundle can build for Linux if feature is enabled', () async {
-    fs.file('lib/main.dart').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('lib/main.dart').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final CommandRunner<void> runner = createTestCommandRunner(BuildBundleCommand()
         ..bundleBuilder = MockBundleBuilder());
 
@@ -188,9 +189,9 @@
   });
 
   testUsingContext('bundle can build for macOS if feature is enabled', () async {
-    fs.file('lib/main.dart').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('lib/main.dart').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final CommandRunner<void> runner = createTestCommandRunner(BuildBundleCommand()
         ..bundleBuilder = MockBundleBuilder());
 
@@ -206,14 +207,14 @@
   });
 
   testUsingContext('passes track widget creation through', () async {
-    fs.file('lib/main.dart').createSync(recursive: true);
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('lib/main.dart').createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final CommandRunner<void> runner = createTestCommandRunner(BuildBundleCommand());
     when(buildSystem.build(any, any)).thenAnswer((Invocation invocation) async {
       final Environment environment = invocation.positionalArguments[1] as Environment;
       expect(environment.defines, <String, String>{
-        kTargetFile: fs.path.join('lib', 'main.dart'),
+        kTargetFile: globals.fs.path.join('lib', 'main.dart'),
         kBuildMode: 'debug',
         kTargetPlatform: 'android-arm',
         kTrackWidgetCreation: 'true',
diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
index 102c0de..b1d284e 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
@@ -7,10 +7,11 @@
 import 'dart:typed_data';
 
 import 'package:args/command_runner.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/net.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/create.dart';
 import 'package:flutter_tools/src/dart/pub.dart';
@@ -18,6 +19,7 @@
 import 'package:flutter_tools/src/features.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
@@ -50,7 +52,7 @@
 
   setUp(() {
     loggingProcessManager = LoggingProcessManager();
-    tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_create_test.');
+    tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_create_test.');
     projectDir = tempDir.childDirectory('flutter_project');
     mockFlutterVersion = MockFlutterVersion();
   });
@@ -455,12 +457,12 @@
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
     void expectExists(String relPath) {
-      expect(fs.isFileSync('${projectDir.path}/$relPath'), true);
+      expect(globals.fs.isFileSync('${projectDir.path}/$relPath'), true);
     }
 
     expectExists('android/gradle.properties');
 
-    final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
+    final String actualContents = await globals.fs.file(projectDir.path + '/android/gradle.properties').readAsString();
 
     expect(actualContents.contains('useAndroidX'), true);
   });
@@ -476,12 +478,12 @@
     await runner.run(<String>['create', '--no-pub', '--no-androidx', projectDir.path]);
 
     void expectExists(String relPath) {
-      expect(fs.isFileSync('${projectDir.path}/$relPath'), true);
+      expect(globals.fs.isFileSync('${projectDir.path}/$relPath'), true);
     }
 
     expectExists('android/gradle.properties');
 
-    final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
+    final String actualContents = await globals.fs.file(projectDir.path + '/android/gradle.properties').readAsString();
 
     expect(actualContents.contains('useAndroidX'), false);
   });
@@ -531,12 +533,12 @@
     await runner.run(<String>['create', '--no-pub', '--template=plugin', projectDir.path]);
 
     void expectExists(String relPath) {
-      expect(fs.isFileSync('${projectDir.path}/$relPath'), true);
+      expect(globals.fs.isFileSync('${projectDir.path}/$relPath'), true);
     }
 
     expectExists('android/gradle.properties');
 
-    final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
+    final String actualContents = await globals.fs.file(projectDir.path + '/android/gradle.properties').readAsString();
 
     expect(actualContents.contains('useAndroidX'), true);
   });
@@ -552,12 +554,12 @@
     await runner.run(<String>['create', '--no-pub', '--template=plugin', '--no-androidx', projectDir.path]);
 
     void expectExists(String relPath) {
-      expect(fs.isFileSync('${projectDir.path}/$relPath'), true);
+      expect(globals.fs.isFileSync('${projectDir.path}/$relPath'), true);
     }
 
     expectExists('android/gradle.properties');
 
-    final String actualContents = await fs.file(projectDir.path + '/android/gradle.properties').readAsString();
+    final String actualContents = await globals.fs.file(projectDir.path + '/android/gradle.properties').readAsString();
 
     expect(actualContents.contains('useAndroidX'), false);
   });
@@ -633,13 +635,13 @@
     await runner.run(<String>['create', '--template=module', '--no-pub', '--org', 'com.foo.bar', projectDir.path]);
 
     void expectExists(String relPath, [bool expectation = true]) {
-      expect(fs.isFileSync('${projectDir.path}/$relPath'), expectation);
+      expect(globals.fs.isFileSync('${projectDir.path}/$relPath'), expectation);
     }
 
     expectExists('lib/main.dart');
     expectExists('test/widget_test.dart');
 
-    final String actualContents = await fs.file(projectDir.path + '/test/widget_test.dart').readAsString();
+    final String actualContents = await globals.fs.file(projectDir.path + '/test/widget_test.dart').readAsString();
 
     expect(actualContents.contains('flutter_test.dart'), true);
 
@@ -658,55 +660,55 @@
       }
     }
 
-    await _runFlutterTest(projectDir, target: fs.path.join(projectDir.path, 'test', 'widget_test.dart'));
+    await _runFlutterTest(projectDir, target: globals.fs.path.join(projectDir.path, 'test', 'widget_test.dart'));
 
     // Generated Xcode settings
-    final String xcodeConfigPath = fs.path.join('.ios', 'Flutter', 'Generated.xcconfig');
+    final String xcodeConfigPath = globals.fs.path.join('.ios', 'Flutter', 'Generated.xcconfig');
     expectExists(xcodeConfigPath);
-    final File xcodeConfigFile = fs.file(fs.path.join(projectDir.path, xcodeConfigPath));
+    final File xcodeConfigFile = globals.fs.file(globals.fs.path.join(projectDir.path, xcodeConfigPath));
     final String xcodeConfig = xcodeConfigFile.readAsStringSync();
     expect(xcodeConfig, contains('FLUTTER_ROOT='));
     expect(xcodeConfig, contains('FLUTTER_APPLICATION_PATH='));
     expect(xcodeConfig, contains('FLUTTER_TARGET='));
 
     // Generated export environment variables script
-    final String buildPhaseScriptPath = fs.path.join('.ios', 'Flutter', 'flutter_export_environment.sh');
+    final String buildPhaseScriptPath = globals.fs.path.join('.ios', 'Flutter', 'flutter_export_environment.sh');
     expectExists(buildPhaseScriptPath);
-    final File buildPhaseScriptFile = fs.file(fs.path.join(projectDir.path, buildPhaseScriptPath));
+    final File buildPhaseScriptFile = globals.fs.file(globals.fs.path.join(projectDir.path, buildPhaseScriptPath));
     final String buildPhaseScript = buildPhaseScriptFile.readAsStringSync();
     expect(buildPhaseScript, contains('FLUTTER_ROOT='));
     expect(buildPhaseScript, contains('FLUTTER_APPLICATION_PATH='));
     expect(buildPhaseScript, contains('FLUTTER_TARGET='));
 
     // Generated podspec
-    final String podspecPath = fs.path.join('.ios', 'Flutter', 'flutter_project.podspec');
+    final String podspecPath = globals.fs.path.join('.ios', 'Flutter', 'flutter_project.podspec');
     expectExists(podspecPath);
-    final File podspecFile = fs.file(fs.path.join(projectDir.path, podspecPath));
+    final File podspecFile = globals.fs.file(globals.fs.path.join(projectDir.path, podspecPath));
     final String podspec = podspecFile.readAsStringSync();
     expect(podspec, contains('Flutter module - flutter_project'));
 
     // App identification
-    final String xcodeProjectPath = fs.path.join('.ios', 'Runner.xcodeproj', 'project.pbxproj');
+    final String xcodeProjectPath = globals.fs.path.join('.ios', 'Runner.xcodeproj', 'project.pbxproj');
     expectExists(xcodeProjectPath);
-    final File xcodeProjectFile = fs.file(fs.path.join(projectDir.path, xcodeProjectPath));
+    final File xcodeProjectFile = globals.fs.file(globals.fs.path.join(projectDir.path, xcodeProjectPath));
     final String xcodeProject = xcodeProjectFile.readAsStringSync();
     expect(xcodeProject, contains('PRODUCT_BUNDLE_IDENTIFIER = com.foo.bar.flutterProject'));
     // Xcode build system
-    final String xcodeWorkspaceSettingsPath = fs.path.join('.ios', 'Runner.xcworkspace', 'xcshareddata', 'WorkspaceSettings.xcsettings');
+    final String xcodeWorkspaceSettingsPath = globals.fs.path.join('.ios', 'Runner.xcworkspace', 'xcshareddata', 'WorkspaceSettings.xcsettings');
     expectExists(xcodeWorkspaceSettingsPath, false);
 
-    final String versionPath = fs.path.join('.metadata');
+    final String versionPath = globals.fs.path.join('.metadata');
     expectExists(versionPath);
-    final String version = fs.file(fs.path.join(projectDir.path, versionPath)).readAsStringSync();
+    final String version = globals.fs.file(globals.fs.path.join(projectDir.path, versionPath)).readAsStringSync();
     expect(version, contains('version:'));
     expect(version, contains('revision: 12345678'));
     expect(version, contains('channel: omega'));
 
     // IntelliJ metadata
-    final String intelliJSdkMetadataPath = fs.path.join('.idea', 'libraries', 'Dart_SDK.xml');
+    final String intelliJSdkMetadataPath = globals.fs.path.join('.idea', 'libraries', 'Dart_SDK.xml');
     expectExists(intelliJSdkMetadataPath);
-    final String sdkMetaContents = fs
-        .file(fs.path.join(
+    final String sdkMetaContents = globals.fs
+        .file(globals.fs.path.join(
           projectDir.path,
           intelliJSdkMetadataPath,
         ))
@@ -729,7 +731,7 @@
     await runner.run(<String>['create', '--template=app', '--no-pub', '--org', 'com.foo.bar', projectDir.path]);
 
     void expectExists(String relPath) {
-      expect(fs.isFileSync('${projectDir.path}/$relPath'), true);
+      expect(globals.fs.isFileSync('${projectDir.path}/$relPath'), true);
     }
 
     expectExists('lib/main.dart');
@@ -750,34 +752,34 @@
       }
     }
 
-    await _runFlutterTest(projectDir, target: fs.path.join(projectDir.path, 'test', 'widget_test.dart'));
+    await _runFlutterTest(projectDir, target: globals.fs.path.join(projectDir.path, 'test', 'widget_test.dart'));
 
     // Generated Xcode settings
-    final String xcodeConfigPath = fs.path.join('ios', 'Flutter', 'Generated.xcconfig');
+    final String xcodeConfigPath = globals.fs.path.join('ios', 'Flutter', 'Generated.xcconfig');
     expectExists(xcodeConfigPath);
-    final File xcodeConfigFile = fs.file(fs.path.join(projectDir.path, xcodeConfigPath));
+    final File xcodeConfigFile = globals.fs.file(globals.fs.path.join(projectDir.path, xcodeConfigPath));
     final String xcodeConfig = xcodeConfigFile.readAsStringSync();
     expect(xcodeConfig, contains('FLUTTER_ROOT='));
     expect(xcodeConfig, contains('FLUTTER_APPLICATION_PATH='));
     // App identification
-    final String xcodeProjectPath = fs.path.join('ios', 'Runner.xcodeproj', 'project.pbxproj');
+    final String xcodeProjectPath = globals.fs.path.join('ios', 'Runner.xcodeproj', 'project.pbxproj');
     expectExists(xcodeProjectPath);
-    final File xcodeProjectFile = fs.file(fs.path.join(projectDir.path, xcodeProjectPath));
+    final File xcodeProjectFile = globals.fs.file(globals.fs.path.join(projectDir.path, xcodeProjectPath));
     final String xcodeProject = xcodeProjectFile.readAsStringSync();
     expect(xcodeProject, contains('PRODUCT_BUNDLE_IDENTIFIER = com.foo.bar.flutterProject'));
 
-    final String versionPath = fs.path.join('.metadata');
+    final String versionPath = globals.fs.path.join('.metadata');
     expectExists(versionPath);
-    final String version = fs.file(fs.path.join(projectDir.path, versionPath)).readAsStringSync();
+    final String version = globals.fs.file(globals.fs.path.join(projectDir.path, versionPath)).readAsStringSync();
     expect(version, contains('version:'));
     expect(version, contains('revision: 12345678'));
     expect(version, contains('channel: omega'));
 
     // IntelliJ metadata
-    final String intelliJSdkMetadataPath = fs.path.join('.idea', 'libraries', 'Dart_SDK.xml');
+    final String intelliJSdkMetadataPath = globals.fs.path.join('.idea', 'libraries', 'Dart_SDK.xml');
     expectExists(intelliJSdkMetadataPath);
-    final String sdkMetaContents = fs
-        .file(fs.path.join(
+    final String sdkMetaContents = globals.fs
+        .file(globals.fs.path.join(
           projectDir.path,
           intelliJSdkMetadataPath,
         ))
@@ -797,9 +799,9 @@
     final CreateCommand command = CreateCommand();
     final CommandRunner<void> runner = createTestCommandRunner(command);
 
-    String tmpProjectDir = fs.path.join(tempDir.path, 'hello_flutter');
+    String tmpProjectDir = globals.fs.path.join(tempDir.path, 'hello_flutter');
     await runner.run(<String>['create', '--template=app', '--no-pub', '--org', 'com.example', tmpProjectDir]);
-    FlutterProject project = FlutterProject.fromDirectory(fs.directory(tmpProjectDir));
+    FlutterProject project = FlutterProject.fromDirectory(globals.fs.directory(tmpProjectDir));
     expect(
         await project.ios.productBundleIdentifier,
         'com.example.helloFlutter',
@@ -809,9 +811,9 @@
         'com.example.hello_flutter',
     );
 
-    tmpProjectDir = fs.path.join(tempDir.path, 'test_abc');
+    tmpProjectDir = globals.fs.path.join(tempDir.path, 'test_abc');
     await runner.run(<String>['create', '--template=app', '--no-pub', '--org', 'abc^*.1#@', tmpProjectDir]);
-    project = FlutterProject.fromDirectory(fs.directory(tmpProjectDir));
+    project = FlutterProject.fromDirectory(globals.fs.directory(tmpProjectDir));
     expect(
         await project.ios.productBundleIdentifier,
         'abc.1.testAbc',
@@ -821,9 +823,9 @@
         'abc.u1.test_abc',
     );
 
-    tmpProjectDir = fs.path.join(tempDir.path, 'flutter_project');
+    tmpProjectDir = globals.fs.path.join(tempDir.path, 'flutter_project');
     await runner.run(<String>['create', '--template=app', '--no-pub', '--org', '#+^%', tmpProjectDir]);
-    project = FlutterProject.fromDirectory(fs.directory(tmpProjectDir));
+    project = FlutterProject.fromDirectory(globals.fs.directory(tmpProjectDir));
     expect(
         await project.ios.productBundleIdentifier,
         'flutterProject.untitled',
@@ -847,7 +849,7 @@
 
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
-    final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
+    final String metadata = globals.fs.file(globals.fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
     expect(metadata, contains('project_type: app\n'));
   });
 
@@ -860,11 +862,11 @@
     await runner.run(<String>['create', '--no-pub', '--template=app', projectDir.path]);
 
     // Remove the .metadata to simulate an older instantiation that didn't generate those.
-    fs.file(fs.path.join(projectDir.path, '.metadata')).deleteSync();
+    globals.fs.file(globals.fs.path.join(projectDir.path, '.metadata')).deleteSync();
 
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
-    final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
+    final String metadata = globals.fs.file(globals.fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
     expect(metadata, contains('project_type: app\n'));
   });
 
@@ -878,7 +880,7 @@
 
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
-    final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
+    final String metadata = globals.fs.file(globals.fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
     expect(metadata, contains('project_type: app\n'));
   });
 
@@ -892,7 +894,7 @@
 
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
-    final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
+    final String metadata = globals.fs.file(globals.fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
     expect(metadata, contains('project_type: module\n'));
   });
 
@@ -906,7 +908,7 @@
 
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
-    final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
+    final String metadata = globals.fs.file(globals.fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
     expect(metadata, contains('project_type: plugin'));
   });
 
@@ -920,7 +922,7 @@
 
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
-    final String metadata = fs.file(fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
+    final String metadata = globals.fs.file(globals.fs.path.join(projectDir.path, '.metadata')).readAsStringSync();
     expect(metadata, contains('project_type: package'));
   });
 
@@ -1038,7 +1040,7 @@
       <String>['--no-pub', '--template=app', '--org', 'com.bar.foo'],
       <String>[],
     );
-    fs.directory(fs.path.join(projectDir.path, 'ios')).deleteSync(recursive: true);
+    globals.fs.directory(globals.fs.path.join(projectDir.path, 'ios')).deleteSync(recursive: true);
     await _createProject(
       projectDir,
       <String>['--no-pub', '--template=app', '--org', 'com.bar.baz'],
@@ -1067,7 +1069,7 @@
     Cache.flutterRoot = '../..';
     final CreateCommand command = CreateCommand();
     final CommandRunner<void> runner = createTestCommandRunner(command);
-    final File existingFile = fs.file(fs.path.join(projectDir.path, 'bad'));
+    final File existingFile = globals.fs.file(globals.fs.path.join(projectDir.path, 'bad'));
     if (!existingFile.existsSync()) {
       existingFile.createSync(recursive: true);
     }
@@ -1081,7 +1083,7 @@
     Cache.flutterRoot = '../..';
     final CreateCommand command = CreateCommand();
     final CommandRunner<void> runner = createTestCommandRunner(command);
-    final File existingFile = fs.file(fs.path.join(projectDir.path, 'bad'));
+    final File existingFile = globals.fs.file(globals.fs.path.join(projectDir.path, 'bad'));
     if (!existingFile.existsSync()) {
       existingFile.createSync(recursive: true);
     }
@@ -1093,14 +1095,14 @@
 
   testUsingContext('overwrites existing directory when requested', () async {
     Cache.flutterRoot = '../..';
-    final Directory existingDirectory = fs.directory(fs.path.join(projectDir.path, 'bad'));
+    final Directory existingDirectory = globals.fs.directory(globals.fs.path.join(projectDir.path, 'bad'));
     if (!existingDirectory.existsSync()) {
       existingDirectory.createSync(recursive: true);
     }
-    final File existingFile = fs.file(fs.path.join(existingDirectory.path, 'lib', 'main.dart'));
+    final File existingFile = globals.fs.file(globals.fs.path.join(existingDirectory.path, 'lib', 'main.dart'));
     existingFile.createSync(recursive: true);
     await _createProject(
-      fs.directory(existingDirectory.path),
+      globals.fs.directory(existingDirectory.path),
       <String>['--overwrite', '-i', 'objc', '-a', 'java'],
       <String>[
         'android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java',
@@ -1169,7 +1171,7 @@
   });
 
   testUsingContext('can write samples index to disk', () async {
-    final String outputFile = fs.path.join(tempDir.path, 'flutter_samples.json');
+    final String outputFile = globals.fs.path.join(tempDir.path, 'flutter_samples.json');
     final CreateCommand command = CreateCommand();
     final CommandRunner<void> runner = createTestCommandRunner(command);
     final List<String> args = <String>[
@@ -1179,7 +1181,7 @@
     ];
 
     await runner.run(args);
-    final File expectedFile = fs.file(outputFile);
+    final File expectedFile = globals.fs.file(outputFile);
     expect(expectedFile.existsSync(), isTrue);
     expect(expectedFile.readAsStringSync(), equals(samplesIndexJson));
   }, overrides: <Type, Generator>{
@@ -1187,7 +1189,7 @@
         () => MockHttpClient(200, result: samplesIndexJson),
   });
   testUsingContext('provides an error to the user if samples json download fails', () async {
-    final String outputFile = fs.path.join(tempDir.path, 'flutter_samples.json');
+    final String outputFile = globals.fs.path.join(tempDir.path, 'flutter_samples.json');
     final CreateCommand command = CreateCommand();
     final CommandRunner<void> runner = createTestCommandRunner(command);
     final List<String> args = <String>[
@@ -1197,7 +1199,7 @@
     ];
 
     await expectLater(runner.run(args), throwsToolExit(exitCode: 2, message: 'Failed to write samples'));
-    expect(fs.file(outputFile).existsSync(), isFalse);
+    expect(globals.fs.file(outputFile).existsSync(), isFalse);
   }, overrides: <Type, Generator>{
     HttpClientFactory: () =>
         () => MockHttpClient(404, result: 'not found'),
@@ -1220,8 +1222,8 @@
   ]);
 
   bool pathExists(String path) {
-    final String fullPath = fs.path.join(dir.path, path);
-    return fs.typeSync(fullPath) != FileSystemEntityType.notFound;
+    final String fullPath = globals.fs.path.join(dir.path, path);
+    return globals.fs.typeSync(fullPath) != FileSystemEntityType.notFound;
   }
 
   final List<String> failures = <String>[
@@ -1246,22 +1248,22 @@
 }
 
 Future<void> _ensureFlutterToolsSnapshot() async {
-  final String flutterToolsPath = fs.path.absolute(fs.path.join(
+  final String flutterToolsPath = globals.fs.path.absolute(globals.fs.path.join(
     'bin',
     'flutter_tools.dart',
   ));
-  final String flutterToolsSnapshotPath = fs.path.absolute(fs.path.join(
+  final String flutterToolsSnapshotPath = globals.fs.path.absolute(globals.fs.path.join(
     '..',
     '..',
     'bin',
     'cache',
     'flutter_tools.snapshot',
   ));
-  final String dotPackages = fs.path.absolute(fs.path.join(
+  final String dotPackages = globals.fs.path.absolute(globals.fs.path.join(
     '.packages',
   ));
 
-  final File snapshotFile = fs.file(flutterToolsSnapshotPath);
+  final File snapshotFile = globals.fs.file(flutterToolsSnapshotPath);
   if (snapshotFile.existsSync()) {
     snapshotFile.renameSync(flutterToolsSnapshotPath + '.bak');
   }
@@ -1284,7 +1286,7 @@
 }
 
 Future<void> _restoreFlutterToolsSnapshot() async {
-  final String flutterToolsSnapshotPath = fs.path.absolute(fs.path.join(
+  final String flutterToolsSnapshotPath = globals.fs.path.absolute(globals.fs.path.join(
     '..',
     '..',
     'bin',
@@ -1292,7 +1294,7 @@
     'flutter_tools.snapshot',
   ));
 
-  final File snapshotBackup = fs.file(flutterToolsSnapshotPath + '.bak');
+  final File snapshotBackup = globals.fs.file(flutterToolsSnapshotPath + '.bak');
   if (!snapshotBackup.existsSync()) {
     // No backup to restore.
     return;
@@ -1302,7 +1304,7 @@
 }
 
 Future<void> _analyzeProject(String workingDir) async {
-  final String flutterToolsSnapshotPath = fs.path.absolute(fs.path.join(
+  final String flutterToolsSnapshotPath = globals.fs.path.absolute(globals.fs.path.join(
     '..',
     '..',
     'bin',
@@ -1329,7 +1331,7 @@
 }
 
 Future<void> _runFlutterTest(Directory workingDir, { String target }) async {
-  final String flutterToolsSnapshotPath = fs.path.absolute(fs.path.join(
+  final String flutterToolsSnapshotPath = globals.fs.path.absolute(globals.fs.path.join(
     '..',
     '..',
     'bin',
diff --git a/packages/flutter_tools/test/commands.shard/permeable/format_test.dart b/packages/flutter_tools/test/commands.shard/permeable/format_test.dart
index 2b6d0b1..b591275 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/format_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/format_test.dart
@@ -6,6 +6,7 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/format.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -16,7 +17,7 @@
 
     setUp(() {
       Cache.disableLocking();
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_format_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_format_test.');
     });
 
     tearDown(() {
@@ -26,7 +27,7 @@
     testUsingContext('a file', () async {
       final String projectPath = await createProject(tempDir);
 
-      final File srcFile = fs.file(fs.path.join(projectPath, 'lib', 'main.dart'));
+      final File srcFile = globals.fs.file(globals.fs.path.join(projectPath, 'lib', 'main.dart'));
       final String original = srcFile.readAsStringSync();
       srcFile.writeAsStringSync(original.replaceFirst('main()', 'main(  )'));
 
@@ -41,8 +42,8 @@
     testUsingContext('dry-run', () async {
       final String projectPath = await createProject(tempDir);
 
-      final File srcFile = fs.file(
-          fs.path.join(projectPath, 'lib', 'main.dart'));
+      final File srcFile = globals.fs.file(
+          globals.fs.path.join(projectPath, 'lib', 'main.dart'));
       final String nonFormatted = srcFile.readAsStringSync().replaceFirst(
           'main()', 'main(  )');
       srcFile.writeAsStringSync(nonFormatted);
@@ -58,8 +59,8 @@
     testUsingContext('dry-run with set-exit-if-changed', () async {
       final String projectPath = await createProject(tempDir);
 
-      final File srcFile = fs.file(
-          fs.path.join(projectPath, 'lib', 'main.dart'));
+      final File srcFile = globals.fs.file(
+          globals.fs.path.join(projectPath, 'lib', 'main.dart'));
       final String nonFormatted = srcFile.readAsStringSync().replaceFirst(
           'main()', 'main(  )');
       srcFile.writeAsStringSync(nonFormatted);
@@ -80,8 +81,8 @@
       const int lineLengthLong = 120;
       final String projectPath = await createProject(tempDir);
 
-      final File srcFile = fs.file(
-          fs.path.join(projectPath, 'lib', 'main.dart'));
+      final File srcFile = globals.fs.file(
+          globals.fs.path.join(projectPath, 'lib', 'main.dart'));
       final String nonFormatted = srcFile.readAsStringSync();
       srcFile.writeAsStringSync(
           nonFormatted.replaceFirst('main()',
diff --git a/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart b/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart
index 375a390..657b580 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart
@@ -14,6 +14,7 @@
 import 'package:flutter_tools/src/features.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:process/process.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -42,7 +43,7 @@
     Directory tempDir;
 
     setUp(() {
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
     });
 
     tearDown(() {
@@ -51,7 +52,7 @@
 
     Future<String> createProjectWithPlugin(String plugin, { List<String> arguments }) async {
       final String projectPath = await createProject(tempDir, arguments: arguments);
-      final File pubspec = fs.file(fs.path.join(projectPath, 'pubspec.yaml'));
+      final File pubspec = globals.fs.file(globals.fs.path.join(projectPath, 'pubspec.yaml'));
       String content = await pubspec.readAsString();
       content = content.replaceFirst(
         '\ndependencies:\n',
@@ -75,7 +76,7 @@
 
     void expectExists(String projectPath, String relPath) {
       expect(
-        fs.isFileSync(fs.path.join(projectPath, relPath)),
+        globals.fs.isFileSync(globals.fs.path.join(projectPath, relPath)),
         true,
         reason: '$projectPath/$relPath should exist, but does not',
       );
@@ -84,7 +85,7 @@
     void expectContains(String projectPath, String relPath, String substring) {
       expectExists(projectPath, relPath);
       expect(
-        fs.file(fs.path.join(projectPath, relPath)).readAsStringSync(),
+        globals.fs.file(globals.fs.path.join(projectPath, relPath)).readAsStringSync(),
         contains(substring),
         reason: '$projectPath/$relPath has unexpected content',
       );
@@ -92,7 +93,7 @@
 
     void expectNotExists(String projectPath, String relPath) {
       expect(
-        fs.isFileSync(fs.path.join(projectPath, relPath)),
+        globals.fs.isFileSync(globals.fs.path.join(projectPath, relPath)),
         false,
         reason: '$projectPath/$relPath should not exist, but does',
       );
@@ -101,7 +102,7 @@
     void expectNotContains(String projectPath, String relPath, String substring) {
       expectExists(projectPath, relPath);
       expect(
-        fs.file(fs.path.join(projectPath, relPath)).readAsStringSync(),
+        globals.fs.file(globals.fs.path.join(projectPath, relPath)).readAsStringSync(),
         isNot(contains(substring)),
         reason: '$projectPath/$relPath has unexpected content',
       );
@@ -193,7 +194,7 @@
         pluginWitnesses,
       ].expand<String>((List<String> list) => list);
       for (String path in allFiles) {
-        final File file = fs.file(fs.path.join(projectPath, path));
+        final File file = globals.fs.file(globals.fs.path.join(projectPath, path));
         if (file.existsSync()) {
           file.deleteSync();
         }
@@ -329,7 +330,7 @@
         tempDir,
         arguments: <String>['--template=plugin', '--no-pub'],
       );
-      final String exampleProjectPath = fs.path.join(projectPath, 'example');
+      final String exampleProjectPath = globals.fs.path.join(projectPath, 'example');
       removeGeneratedFiles(projectPath);
       removeGeneratedFiles(exampleProjectPath);
 
diff --git a/packages/flutter_tools/test/commands.shard/permeable/test_test.dart b/packages/flutter_tools/test/commands.shard/permeable/test_test.dart
index 78924d8..b35dc7f 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/test_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/test_test.dart
@@ -9,6 +9,7 @@
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/dart/sdk.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -18,8 +19,8 @@
 Future<void> _testExclusionLock;
 
 void main() {
-  final String automatedTestsDirectory = fs.path.join('..', '..', 'dev', 'automated_tests');
-  final String flutterTestDirectory = fs.path.join(automatedTestsDirectory, 'flutter_test');
+  final String automatedTestsDirectory = globals.fs.path.join('..', '..', 'dev', 'automated_tests');
+  final String flutterTestDirectory = globals.fs.path.join(automatedTestsDirectory, 'flutter_test');
 
   testUsingContext('flutter test should not have extraneous error messages', () async {
     Cache.flutterRoot = '../..';
@@ -47,7 +48,7 @@
   });
 
   testUsingContext('flutter test should report a nice error when a pubspec.yaml is missing a flutter_test dependency', () async {
-    final String missingDependencyTests = fs.path.join('..', '..', 'dev', 'missing_dependency_tests');
+    final String missingDependencyTests = globals.fs.path.join('..', '..', 'dev', 'missing_dependency_tests');
     Cache.flutterRoot = '../..';
     return _testFile('trivial', missingDependencyTests, missingDependencyTests);
   });
@@ -140,8 +141,8 @@
   List<String> extraArguments = const <String>[],
 }) async {
   exitCode ??= isNonZero;
-  final String fullTestExpectation = fs.path.join(testDirectory, '${testName}_expectation.txt');
-  final File expectationFile = fs.file(fullTestExpectation);
+  final String fullTestExpectation = globals.fs.path.join(testDirectory, '${testName}_expectation.txt');
+  final File expectationFile = globals.fs.file(fullTestExpectation);
   if (!expectationFile.existsSync()) {
     fail('missing expectation file: $expectationFile');
   }
@@ -167,7 +168,7 @@
   }
   output.add('<<stderr>>');
   output.addAll((exec.stderr as String).split('\n'));
-  final List<String> expectations = fs.file(fullTestExpectation).readAsLinesSync();
+  final List<String> expectations = globals.fs.file(fullTestExpectation).readAsLinesSync();
   bool allowSkip = false;
   int expectationLineNumber = 0;
   int outputLineNumber = 0;
@@ -229,14 +230,14 @@
   if (testName == null) {
     // Test everything in the directory.
     testPath = testDirectory;
-    final Directory directoryToTest = fs.directory(testPath);
+    final Directory directoryToTest = globals.fs.directory(testPath);
     if (!directoryToTest.existsSync()) {
       fail('missing test directory: $directoryToTest');
     }
   } else {
     // Test just a specific test file.
-    testPath = fs.path.join(testDirectory, '${testName}_test.dart');
-    final File testFile = fs.file(testPath);
+    testPath = globals.fs.path.join(testDirectory, '${testName}_test.dart');
+    final File testFile = globals.fs.file(testPath);
     if (!testFile.existsSync()) {
       fail('missing test file: $testFile');
     }
@@ -244,7 +245,7 @@
 
   final List<String> args = <String>[
     ...dartVmFlags,
-    fs.path.absolute(fs.path.join('bin', 'flutter_tools.dart')),
+    globals.fs.path.absolute(globals.fs.path.join('bin', 'flutter_tools.dart')),
     'test',
     '--no-color',
     ...extraArguments,
@@ -259,7 +260,7 @@
   _testExclusionLock = testExclusionCompleter.future;
   try {
     return await Process.run(
-      fs.path.join(dartSdkPath, 'bin', 'dart'),
+      globals.fs.path.join(dartSdkPath, 'bin', 'dart'),
       args,
       workingDirectory: workingDirectory,
       stdoutEncoding: utf8,
diff --git a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart
index b911682..e8961e0 100644
--- a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart
@@ -5,7 +5,7 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/base/os.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/upgrade.dart';
@@ -16,6 +16,7 @@
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 import 'package:process/process.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -38,7 +39,7 @@
       processManager = MockProcessManager();
       when(processManager.start(
         <String>[
-          fs.path.join('bin', 'flutter'),
+          globals.fs.path.join('bin', 'flutter'),
           'upgrade',
           '--continue',
           '--no-version-check',
@@ -130,9 +131,9 @@
         flutterVersion,
       );
       expect(await result, null);
-      verifyNever(processManager.start(
+      verifyNever(globals.processManager.start(
         <String>[
-          fs.path.join('bin', 'flutter'),
+          globals.fs.path.join('bin', 'flutter'),
           'upgrade',
           '--continue',
           '--no-version-check',
@@ -147,7 +148,7 @@
     });
 
     testUsingContext('verifyUpstreamConfigured', () async {
-      when(processManager.run(
+      when(globals.processManager.run(
         <String>['git', 'rev-parse', '@{u}'],
         environment:anyNamed('environment'),
         workingDirectory: anyNamed('workingDirectory')),
@@ -164,9 +165,9 @@
     testUsingContext('flutterUpgradeContinue passes env variables to child process', () async {
       await realCommandRunner.flutterUpgradeContinue();
 
-      final VerificationResult result = verify(processManager.start(
+      final VerificationResult result = verify(globals.processManager.start(
         <String>[
-          fs.path.join('bin', 'flutter'),
+          globals.fs.path.join('bin', 'flutter'),
           'upgrade',
           '--continue',
           '--no-version-check',
@@ -184,13 +185,13 @@
 
     testUsingContext('precacheArtifacts passes env variables to child process', () async {
       final List<String> precacheCommand = <String>[
-        fs.path.join('bin', 'flutter'),
+        globals.fs.path.join('bin', 'flutter'),
         '--no-color',
         '--no-version-check',
         'precache',
       ];
 
-      when(processManager.start(
+      when(globals.processManager.start(
         precacheCommand,
         environment: anyNamed('environment'),
         workingDirectory: anyNamed('workingDirectory'),
@@ -200,7 +201,7 @@
 
       await realCommandRunner.precacheArtifacts();
 
-      final VerificationResult result = verify(processManager.start(
+      final VerificationResult result = verify(globals.processManager.start(
         precacheCommand,
         environment: captureAnyNamed('environment'),
         workingDirectory: anyNamed('workingDirectory'),
@@ -230,7 +231,7 @@
             stdout: 'v1.12.16-19-gb45b676af',
           ),
         ]);
-        tempDir = fs.systemTempDirectory.createTempSync('flutter_upgrade_test.');
+        tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_upgrade_test.');
         flutterToolState = tempDir.childFile('.flutter_tool_state');
         mockFlutterVersion = MockFlutterVersion(isStable: true);
       });
@@ -288,7 +289,7 @@
       Directory tempDir;
 
       setUp(() async {
-        tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_upgrade_test.');
+        tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_upgrade_test.');
       });
 
       tearDown(() {
@@ -298,16 +299,16 @@
       testUsingContext('in project', () async {
         final String projectPath = await createProject(tempDir);
         expect(findProjectRoot(projectPath), projectPath);
-        expect(findProjectRoot(fs.path.join(projectPath, 'lib')), projectPath);
+        expect(findProjectRoot(globals.fs.path.join(projectPath, 'lib')), projectPath);
 
-        final String hello = fs.path.join(Cache.flutterRoot, 'examples', 'hello_world');
+        final String hello = globals.fs.path.join(Cache.flutterRoot, 'examples', 'hello_world');
         expect(findProjectRoot(hello), hello);
-        expect(findProjectRoot(fs.path.join(hello, 'lib')), hello);
+        expect(findProjectRoot(globals.fs.path.join(hello, 'lib')), hello);
       });
 
       testUsingContext('outside project', () async {
         final String projectPath = await createProject(tempDir);
-        expect(findProjectRoot(fs.directory(projectPath).parent.path), null);
+        expect(findProjectRoot(globals.fs.directory(projectPath).parent.path), null);
         expect(findProjectRoot(Cache.flutterRoot), null);
       });
     });
diff --git a/packages/flutter_tools/test/general.shard/analytics_test.dart b/packages/flutter_tools/test/general.shard/analytics_test.dart
index a6accb3..1bc5d2e 100644
--- a/packages/flutter_tools/test/general.shard/analytics_test.dart
+++ b/packages/flutter_tools/test/general.shard/analytics_test.dart
@@ -7,7 +7,7 @@
 import 'package:flutter_tools/src/base/config.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/base/time.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build.dart';
@@ -18,6 +18,7 @@
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/runner/flutter_command.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 
@@ -36,7 +37,7 @@
 
     setUp(() {
       Cache.flutterRoot = '../..';
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_analytics_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_analytics_test.');
       mockFlutterConfig = MockFlutterConfig();
     });
 
@@ -100,7 +101,7 @@
       usage.sendCommand('test');
 
       final String featuresKey = cdKey(CustomDimensions.enabledFlutterFeatures);
-      expect(fs.file('test').readAsStringSync(), contains('$featuresKey: enable-web'));
+      expect(globals.fs.file('test').readAsStringSync(), contains('$featuresKey: enable-web'));
     }, overrides: <Type, Generator>{
       FlutterVersion: () => FlutterVersion(const SystemClock()),
       Config: () => mockFlutterConfig,
@@ -122,7 +123,7 @@
       usage.sendCommand('test');
 
       final String featuresKey = cdKey(CustomDimensions.enabledFlutterFeatures);
-      expect(fs.file('test').readAsStringSync(), contains('$featuresKey: enable-web,enable-linux-desktop,enable-macos-desktop'));
+      expect(globals.fs.file('test').readAsStringSync(), contains('$featuresKey: enable-web,enable-linux-desktop,enable-macos-desktop'));
     }, overrides: <Type, Generator>{
       FlutterVersion: () => FlutterVersion(const SystemClock()),
       Config: () => mockFlutterConfig,
@@ -218,7 +219,7 @@
 
       usage.sendCommand('test');
 
-      final String log = fs.file('analytics.log').readAsStringSync();
+      final String log = globals.fs.file('analytics.log').readAsStringSync();
       final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(kMillis);
       expect(log.contains(formatDateTime(dateTime)), isTrue);
     }, overrides: <Type, Generator>{
@@ -244,7 +245,7 @@
 
       usage.sendEvent('test', 'test');
 
-      final String log = fs.file('analytics.log').readAsStringSync();
+      final String log = globals.fs.file('analytics.log').readAsStringSync();
       final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(kMillis);
       expect(log.contains(formatDateTime(dateTime)), isTrue);
     }, overrides: <Type, Generator>{
@@ -264,7 +265,7 @@
     Directory tempDir;
 
     setUp(() {
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_analytics_bots_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_analytics_bots_test.');
     });
 
     tearDown(() {
diff --git a/packages/flutter_tools/test/general.shard/android/android_device_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_test.dart
index 110f902..d2d82a7 100644
--- a/packages/flutter_tools/test/general.shard/android/android_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_device_test.dart
@@ -11,16 +11,16 @@
 import 'package:flutter_tools/src/android/android_device.dart';
 import 'package:flutter_tools/src/android/android_sdk.dart';
 import 'package:flutter_tools/src/application_package.dart';
-import 'package:flutter_tools/src/base/config.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/process.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -111,8 +111,8 @@
         final AndroidDevice device = AndroidDevice(deviceId, modelID: 'TestModel');
 
         final Directory sdkDir = MockAndroidSdk.createSdkDirectory();
-        Config.instance.setValue('android-sdk', sdkDir.path);
-        final File adbExe = fs.file(getAdbPath(androidSdk));
+        globals.config.setValue('android-sdk', sdkDir.path);
+        final File adbExe = globals.fs.file(getAdbPath(androidSdk));
 
         when(mockAndroidSdk.licensesAvailable).thenReturn(true);
         when(mockAndroidSdk.latestVersion).thenReturn(MockAndroidSdkVersion());
@@ -153,8 +153,8 @@
         final AndroidDevice device = AndroidDevice(deviceId, modelID: 'TestModel');
 
         final Directory sdkDir = MockAndroidSdk.createSdkDirectory();
-        Config.instance.setValue('android-sdk', sdkDir.path);
-        final File adbExe = fs.file(getAdbPath(androidSdk));
+        globals.config.setValue('android-sdk', sdkDir.path);
+        final File adbExe = globals.fs.file(getAdbPath(androidSdk));
 
         when(mockAndroidSdk.licensesAvailable).thenReturn(true);
         when(mockAndroidSdk.latestVersion).thenReturn(MockAndroidSdkVersion());
@@ -194,9 +194,9 @@
 
     testUsingContext('throws on missing adb path', () {
       final Directory sdkDir = MockAndroidSdk.createSdkDirectory();
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
-      final File adbExe = fs.file(getAdbPath(androidSdk));
+      final File adbExe = globals.fs.file(getAdbPath(androidSdk));
       when(mockProcessManager.runSync(
         <String>[adbExe.path, 'devices', '-l'],
       )).thenThrow(ArgumentError(adbExe.path));
@@ -209,9 +209,9 @@
 
     testUsingContext('throws on failing adb', () {
       final Directory sdkDir = MockAndroidSdk.createSdkDirectory();
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
-      final File adbExe = fs.file(getAdbPath(androidSdk));
+      final File adbExe = globals.fs.file(getAdbPath(androidSdk));
       when(mockProcessManager.runSync(
         <String>[adbExe.path, 'devices', '-l'],
       )).thenThrow(ProcessException(adbExe.path, <String>['devices', '-l']));
@@ -497,7 +497,7 @@
   });
 
   testUsingContext('isSupportedForProject is true on module project', () async {
-    fs.file('pubspec.yaml')
+    globals.fs.file('pubspec.yaml')
       ..createSync()
       ..writeAsStringSync(r'''
 name: example
@@ -505,7 +505,7 @@
 flutter:
   module: {}
 ''');
-    fs.file('.packages').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(AndroidDevice('test').isSupportedForProject(flutterProject), true);
@@ -515,9 +515,9 @@
   });
 
   testUsingContext('isSupportedForProject is true with editable host app', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.directory('android').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.directory('android').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(AndroidDevice('test').isSupportedForProject(flutterProject), true);
@@ -527,8 +527,8 @@
   });
 
   testUsingContext('isSupportedForProject is false with no host app and no module', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(AndroidDevice('test').isSupportedForProject(flutterProject), false);
diff --git a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart
index 56baf77..736531b 100644
--- a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart
@@ -6,10 +6,10 @@
 import 'package:flutter_tools/src/android/android_sdk.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart' show ProcessResult;
-import 'package:flutter_tools/src/base/platform.dart';
-import 'package:flutter_tools/src/base/config.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -38,7 +38,7 @@
 
     testUsingContext('parse sdk', () {
       sdkDir = MockAndroidSdk.createSdkDirectory();
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
       final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
       expect(sdk.latestVersion, isNotNull);
@@ -50,7 +50,7 @@
 
     testUsingContext('parse sdk N', () {
       sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true);
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
       final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
       expect(sdk.latestVersion, isNotNull);
@@ -62,10 +62,10 @@
 
     testUsingContext('returns sdkmanager path', () {
       sdkDir = MockAndroidSdk.createSdkDirectory();
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
       final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
-      expect(sdk.sdkManagerPath, fs.path.join(sdk.directory, 'tools', 'bin', 'sdkmanager'));
+      expect(sdk.sdkManagerPath, globals.fs.path.join(sdk.directory, 'tools', 'bin', 'sdkmanager'));
     }, overrides: <Type, Generator>{
       FileSystem: () => fs,
       ProcessManager: () => FakeProcessManager.any(),
@@ -73,11 +73,11 @@
 
     testUsingContext('returns sdkmanager version', () {
       sdkDir = MockAndroidSdk.createSdkDirectory();
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
       final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
-      when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
-      when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
+      when(globals.processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
+      when(globals.processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
           environment: argThat(isNotNull,  named: 'environment')))
           .thenReturn(ProcessResult(1, 0, '26.1.1\n', ''));
       expect(sdk.sdkManagerVersion, '26.1.1');
@@ -88,10 +88,10 @@
 
     testUsingContext('returns validate sdk is well formed', () {
       sdkDir = MockBrokenAndroidSdk.createSdkDirectory();
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
       final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
-      when(processManager.canRun(sdk.adbPath)).thenReturn(true);
+      when(globals.processManager.canRun(sdk.adbPath)).thenReturn(true);
 
       final List<String> validationIssues = sdk.validateSdkWellFormed();
       expect(validationIssues.first, 'No valid Android SDK platforms found in'
@@ -105,11 +105,11 @@
 
     testUsingContext('does not throw on sdkmanager version check failure', () {
       sdkDir = MockAndroidSdk.createSdkDirectory();
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
       final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
-      when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
-      when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
+      when(globals.processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
+      when(globals.processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
           environment: argThat(isNotNull,  named: 'environment')))
           .thenReturn(ProcessResult(1, 1, '26.1.1\n', 'Mystery error'));
       expect(sdk.sdkManagerVersion, isNull);
@@ -120,10 +120,10 @@
 
     testUsingContext('throws on sdkmanager version check if sdkmanager not found', () {
       sdkDir = MockAndroidSdk.createSdkDirectory(withSdkManager: false);
-      Config.instance.setValue('android-sdk', sdkDir.path);
+      globals.config.setValue('android-sdk', sdkDir.path);
 
       final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
-      when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(false);
+      when(globals.processManager.canRun(sdk.sdkManagerPath)).thenReturn(false);
       expect(() => sdk.sdkManagerVersion, throwsToolExit());
     }, overrides: <Type, Generator>{
       FileSystem: () => fs,
@@ -138,11 +138,11 @@
         testUsingContext('detection on $os', () {
           sdkDir = MockAndroidSdk.createSdkDirectory(
               withAndroidN: true, withNdkDir: osDir, withNdkSysroot: true);
-          Config.instance.setValue('android-sdk', sdkDir.path);
+          globals.config.setValue('android-sdk', sdkDir.path);
 
           final String realSdkDir = sdkDir.path;
-          final String realNdkDir = fs.path.join(realSdkDir, 'ndk-bundle');
-          final String realNdkCompiler = fs.path.join(
+          final String realNdkDir = globals.fs.path.join(realSdkDir, 'ndk-bundle');
+          final String realNdkCompiler = globals.fs.path.join(
               realNdkDir,
               'toolchains',
               'arm-linux-androideabi-4.9',
@@ -151,7 +151,7 @@
               'bin',
               'arm-linux-androideabi-gcc');
           final String realNdkSysroot =
-              fs.path.join(realNdkDir, 'platforms', 'android-9', 'arch-arm');
+              globals.fs.path.join(realNdkDir, 'platforms', 'android-9', 'arch-arm');
 
           final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
           expect(sdk.directory, realSdkDir);
@@ -168,25 +168,25 @@
         testUsingContext('newer NDK require explicit -fuse-ld on $os', () {
           sdkDir = MockAndroidSdk.createSdkDirectory(
               withAndroidN: true, withNdkDir: osDir, withNdkSysroot: true, ndkVersion: 18);
-          Config.instance.setValue('android-sdk', sdkDir.path);
+          globals.config.setValue('android-sdk', sdkDir.path);
 
           final String realSdkDir = sdkDir.path;
-          final String realNdkDir = fs.path.join(realSdkDir, 'ndk-bundle');
-          final String realNdkToolchainBin = fs.path.join(
+          final String realNdkDir = globals.fs.path.join(realSdkDir, 'ndk-bundle');
+          final String realNdkToolchainBin = globals.fs.path.join(
               realNdkDir,
               'toolchains',
               'arm-linux-androideabi-4.9',
               'prebuilt',
               osDir,
               'bin');
-          final String realNdkCompiler = fs.path.join(
+          final String realNdkCompiler = globals.fs.path.join(
               realNdkToolchainBin,
               'arm-linux-androideabi-gcc');
-          final String realNdkLinker = fs.path.join(
+          final String realNdkLinker = globals.fs.path.join(
               realNdkToolchainBin,
               'arm-linux-androideabi-ld');
           final String realNdkSysroot =
-              fs.path.join(realNdkDir, 'platforms', 'android-9', 'arch-arm');
+              globals.fs.path.join(realNdkDir, 'platforms', 'android-9', 'arch-arm');
 
           final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
           expect(sdk.directory, realSdkDir);
@@ -204,7 +204,7 @@
       for (String os in <String>['linux', 'macos']) {
         testUsingContext('detection on $os (no ndk available)', () {
           sdkDir = MockAndroidSdk.createSdkDirectory(withAndroidN: true);
-          Config.instance.setValue('android-sdk', sdkDir.path);
+          globals.config.setValue('android-sdk', sdkDir.path);
 
           final String realSdkDir = sdkDir.path;
           final AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
@@ -230,8 +230,8 @@
     bool withNdkSysroot = false,
     bool withSdkManager = true,
   }) {
-    final Directory dir = fs.systemTempDirectory.createTempSync('flutter_mock_android_sdk.');
-    final String exe = platform.isWindows ? '.exe' : '';
+    final Directory dir = globals.fs.systemTempDirectory.createTempSync('flutter_mock_android_sdk.');
+    final String exe = globals.platform.isWindows ? '.exe' : '';
     _createSdkFile(dir, 'licenses/dummy');
     _createSdkFile(dir, 'platform-tools/adb$exe');
 
diff --git a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart
index e36dbce..7f39b2e 100644
--- a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart
@@ -5,9 +5,11 @@
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/android/android_studio.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/ios/plist_parser.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -55,12 +57,12 @@
       const String installPath = '/opt/android-studio-with-cheese-5.0';
       const String studioHome = '$homeLinux/.AndroidStudioWithCheese5.0';
       const String homeFile = '$studioHome/system/.home';
-      fs.directory(installPath).createSync(recursive: true);
-      fs.file(homeFile).createSync(recursive: true);
-      fs.file(homeFile).writeAsStringSync(installPath);
+      globals.fs.directory(installPath).createSync(recursive: true);
+      globals.fs.file(homeFile).createSync(recursive: true);
+      globals.fs.file(homeFile).writeAsStringSync(installPath);
 
       final AndroidStudio studio =
-      AndroidStudio.fromHomeDot(fs.directory(studioHome));
+      AndroidStudio.fromHomeDot(globals.fs.directory(studioHome));
       expect(studio, isNotNull);
       expect(studio.pluginsPath,
           equals('/home/me/.AndroidStudioWithCheese5.0/config/plugins'));
@@ -75,15 +77,15 @@
 
   group('pluginsPath on Mac', () {
     testUsingContext('extracts custom paths for directly downloaded Android Studio on Mac', () {
-      final String studioInApplicationPlistFolder = fs.path.join('/', 'Application', 'Android Studio.app', 'Contents');
-      fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);
+      final String studioInApplicationPlistFolder = globals.fs.path.join('/', 'Application', 'Android Studio.app', 'Contents');
+      globals.fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);
 
-      final String plistFilePath = fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
+      final String plistFilePath = globals.fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
       when(plistUtils.parseFile(plistFilePath)).thenReturn(macStudioInfoPlist);
-      final AndroidStudio studio = AndroidStudio.fromMacOSBundle(fs.directory(studioInApplicationPlistFolder)?.parent?.path);
+      final AndroidStudio studio = AndroidStudio.fromMacOSBundle(globals.fs.directory(studioInApplicationPlistFolder)?.parent?.path);
       expect(studio, isNotNull);
       expect(studio.pluginsPath,
-          equals(fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3')));
+          equals(globals.fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3')));
     }, overrides: <Type, Generator>{
       FileSystem: () => fs,
       ProcessManager: () => FakeProcessManager.any(),
@@ -94,26 +96,26 @@
     });
 
     testUsingContext('extracts custom paths for Android Studio downloaded by JetBrainsToolbox on Mac', () {
-      final String jetbrainsStudioInApplicationPlistFolder = fs.path.join(homeMac, 'Application', 'JetBrains Toolbox', 'Android Studio.app', 'Contents');
-      fs.directory(jetbrainsStudioInApplicationPlistFolder).createSync(recursive: true);
+      final String jetbrainsStudioInApplicationPlistFolder = globals.fs.path.join(homeMac, 'Application', 'JetBrains Toolbox', 'Android Studio.app', 'Contents');
+      globals.fs.directory(jetbrainsStudioInApplicationPlistFolder).createSync(recursive: true);
       const Map<String, dynamic> jetbrainsInfoPlist = <String, dynamic>{
         'CFBundleLongVersionString': '3.3',
         'CFBundleShortVersionString': '3.3',
         'CFBundleVersion': '3.3',
         'JetBrainsToolboxApp': '$homeMac/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/183.5256920/Android Studio 3.3.app',
       };
-      final String jetbrainsPlistFilePath = fs.path.join(jetbrainsStudioInApplicationPlistFolder, 'Info.plist');
+      final String jetbrainsPlistFilePath = globals.fs.path.join(jetbrainsStudioInApplicationPlistFolder, 'Info.plist');
       when(plistUtils.parseFile(jetbrainsPlistFilePath)).thenReturn(jetbrainsInfoPlist);
 
-      final String studioInApplicationPlistFolder = fs.path.join(fs.path.join(homeMac, 'Library', 'Application Support'), 'JetBrains', 'Toolbox', 'apps', 'AndroidStudio', 'ch-0', '183.5256920', fs.path.join('Android Studio 3.3.app', 'Contents'));
-      fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);
-      final String studioPlistFilePath = fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
+      final String studioInApplicationPlistFolder = globals.fs.path.join(globals.fs.path.join(homeMac, 'Library', 'Application Support'), 'JetBrains', 'Toolbox', 'apps', 'AndroidStudio', 'ch-0', '183.5256920', globals.fs.path.join('Android Studio 3.3.app', 'Contents'));
+      globals.fs.directory(studioInApplicationPlistFolder).createSync(recursive: true);
+      final String studioPlistFilePath = globals.fs.path.join(studioInApplicationPlistFolder, 'Info.plist');
       when(plistUtils.parseFile(studioPlistFilePath)).thenReturn(macStudioInfoPlist);
 
-      final AndroidStudio studio = AndroidStudio.fromMacOSBundle(fs.directory(jetbrainsStudioInApplicationPlistFolder)?.parent?.path);
+      final AndroidStudio studio = AndroidStudio.fromMacOSBundle(globals.fs.directory(jetbrainsStudioInApplicationPlistFolder)?.parent?.path);
       expect(studio, isNotNull);
       expect(studio.pluginsPath,
-          equals(fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3')));
+          equals(globals.fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3')));
     }, overrides: <Type, Generator>{
       FileSystem: () => fs,
       ProcessManager: () => FakeProcessManager.any(),
diff --git a/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart b/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart
index 89e4ecb..b56103a 100644
--- a/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:flutter_tools/src/doctor.dart';
 import 'package:flutter_tools/src/android/android_studio_validator.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart b/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart
index 8945c1b..67db28c 100644
--- a/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart
@@ -12,6 +12,8 @@
 import 'package:flutter_tools/src/base/user_messages.dart';
 import 'package:flutter_tools/src/base/version.dart';
 import 'package:flutter_tools/src/doctor.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 import 'package:process/process.dart';
@@ -291,7 +293,7 @@
 
     //Test with older version of JDK
     const String javaVersionText = 'openjdk version "1.7.0_212"';
-    when(processManager.run(argThat(contains('-version')))).thenAnswer((_) =>
+    when(globals.processManager.run(argThat(contains('-version')))).thenAnswer((_) =>
       Future<ProcessResult>.value(ProcessResult(0, 0, null, javaVersionText)));
     final String errorMessage = userMessages.androidJavaMinimumVersion(javaVersionText);
 
diff --git a/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart
index 6735fea..0c7a01c 100644
--- a/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart
@@ -8,9 +8,11 @@
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 import 'package:process/process.dart';
@@ -284,7 +286,7 @@
     });
 
     testUsingContext('handler - plugins and no AndroidX', () async {
-      fs.file('.flutter-plugins').createSync(recursive: true);
+      globals.fs.file('.flutter-plugins').createSync(recursive: true);
 
       final GradleBuildStatus status = await androidXFailureHandler
         .handler(
@@ -316,7 +318,7 @@
     });
 
     testUsingContext('handler - plugins, AndroidX, and AAR', () async {
-      fs.file('.flutter-plugins').createSync(recursive: true);
+      globals.fs.file('.flutter-plugins').createSync(recursive: true);
 
       final GradleBuildStatus status = await androidXFailureHandler.handler(
         line: '',
@@ -342,7 +344,7 @@
     });
 
     testUsingContext('handler - plugins, AndroidX, and no AAR', () async {
-      fs.file('.flutter-plugins').createSync(recursive: true);
+      globals.fs.file('.flutter-plugins').createSync(recursive: true);
 
       final GradleBuildStatus status = await androidXFailureHandler.handler(
         line: '',
diff --git a/packages/flutter_tools/test/general.shard/android/gradle_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_test.dart
index 1c026bf..17cb651 100644
--- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart
@@ -16,13 +16,13 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 import 'package:process/process.dart';
@@ -41,11 +41,11 @@
       final AndroidProject androidProject = MockAndroidProject();
       when(project.android).thenReturn(androidProject);
       when(project.isModule).thenReturn(false);
-      when(androidProject.buildDirectory).thenReturn(fs.directory('foo'));
+      when(androidProject.buildDirectory).thenReturn(globals.fs.directory('foo'));
 
       expect(
         getApkDirectory(project).path,
-        equals(fs.path.join('foo', 'app', 'outputs', 'apk')),
+        equals(globals.fs.path.join('foo', 'app', 'outputs', 'apk')),
       );
     });
 
@@ -54,11 +54,11 @@
       final AndroidProject androidProject = MockAndroidProject();
       when(project.android).thenReturn(androidProject);
       when(project.isModule).thenReturn(true);
-      when(androidProject.buildDirectory).thenReturn(fs.directory('foo'));
+      when(androidProject.buildDirectory).thenReturn(globals.fs.directory('foo'));
 
       expect(
         getApkDirectory(project).path,
-        equals(fs.path.join('foo', 'host', 'outputs', 'apk')),
+        equals(globals.fs.path.join('foo', 'host', 'outputs', 'apk')),
       );
     });
 
@@ -67,11 +67,11 @@
       final AndroidProject androidProject = MockAndroidProject();
       when(project.android).thenReturn(androidProject);
       when(project.isModule).thenReturn(false);
-      when(androidProject.buildDirectory).thenReturn(fs.directory('foo'));
+      when(androidProject.buildDirectory).thenReturn(globals.fs.directory('foo'));
 
       expect(
         getBundleDirectory(project).path,
-        equals(fs.path.join('foo', 'app', 'outputs', 'bundle')),
+        equals(globals.fs.path.join('foo', 'app', 'outputs', 'bundle')),
       );
     });
 
@@ -80,18 +80,18 @@
       final AndroidProject androidProject = MockAndroidProject();
       when(project.android).thenReturn(androidProject);
       when(project.isModule).thenReturn(true);
-      when(androidProject.buildDirectory).thenReturn(fs.directory('foo'));
+      when(androidProject.buildDirectory).thenReturn(globals.fs.directory('foo'));
 
       expect(
         getBundleDirectory(project).path,
-        equals(fs.path.join('foo', 'host', 'outputs', 'bundle')),
+        equals(globals.fs.path.join('foo', 'host', 'outputs', 'bundle')),
       );
     });
 
     test('getRepoDirectory', () {
       expect(
-        getRepoDirectory(fs.directory('foo')).path,
-        equals(fs.path.join('foo','outputs', 'repo')),
+        getRepoDirectory(globals.fs.directory('foo')).path,
+        equals(globals.fs.path.join('foo','outputs', 'repo')),
       );
     });
   });
@@ -138,7 +138,7 @@
       final FlutterProject project = generateFakeAppBundle('foo_barRelease', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.release, 'foo_bar'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barRelease', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barRelease', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -148,7 +148,7 @@
       final FlutterProject project = generateFakeAppBundle('fooRelease', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.release, 'foo'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'fooRelease', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'fooRelease', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -158,7 +158,7 @@
       final FlutterProject project = generateFakeAppBundle('release', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.release, null));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'release', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'release', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -168,7 +168,7 @@
       final FlutterProject project = generateFakeAppBundle('foo_barDebug', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.debug, 'foo_bar'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barDebug', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barDebug', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -178,7 +178,7 @@
       final FlutterProject project = generateFakeAppBundle('fooDebug', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.debug, 'foo'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'fooDebug', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'fooDebug', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -188,7 +188,7 @@
       final FlutterProject project = generateFakeAppBundle('debug', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.debug, null));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'debug', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'debug', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -198,7 +198,7 @@
       final FlutterProject project = generateFakeAppBundle('foo_barProfile', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.profile, 'foo_bar'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barProfile', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barProfile', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -208,7 +208,7 @@
       final FlutterProject project = generateFakeAppBundle('fooProfile', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.profile, 'foo'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'fooProfile', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'fooProfile', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -218,7 +218,7 @@
       final FlutterProject project = generateFakeAppBundle('profile', 'app.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.profile, null));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'profile', 'app.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'profile', 'app.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -228,7 +228,7 @@
       final FlutterProject project = generateFakeAppBundle('release', 'app-release.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.release, null));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'release', 'app-release.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'release', 'app-release.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -238,7 +238,7 @@
       final FlutterProject project = generateFakeAppBundle('profile', 'app-profile.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.profile, null));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'profile', 'app-profile.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'profile', 'app-profile.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -248,7 +248,7 @@
       final FlutterProject project = generateFakeAppBundle('debug', 'app-debug.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.debug, null));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'debug', 'app-debug.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'debug', 'app-debug.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -258,7 +258,7 @@
       final FlutterProject project = generateFakeAppBundle('foo_barRelease', 'app-foo_bar-release.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.release, 'foo_bar'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barRelease', 'app-foo_bar-release.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barRelease', 'app-foo_bar-release.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -268,7 +268,7 @@
       final FlutterProject project = generateFakeAppBundle('foo_barProfile', 'app-foo_bar-profile.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.profile, 'foo_bar'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barProfile', 'app-foo_bar-profile.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant', 'app', 'outputs', 'bundle', 'foo_barProfile', 'app-foo_bar-profile.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -278,7 +278,7 @@
       final FlutterProject project = generateFakeAppBundle('foo_barDebug', 'app-foo_bar-debug.aab');
       final File bundle = findBundleFile(project, const BuildInfo(BuildMode.debug, 'foo_bar'));
       expect(bundle, isNotNull);
-      expect(bundle.path, fs.path.join('irrelevant','app', 'outputs', 'bundle', 'foo_barDebug', 'app-foo_bar-debug.aab'));
+      expect(bundle.path, globals.fs.path.join('irrelevant','app', 'outputs', 'bundle', 'foo_barDebug', 'app-foo_bar-debug.aab'));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -322,9 +322,9 @@
 
       when(project.android).thenReturn(androidProject);
       when(project.isModule).thenReturn(false);
-      when(androidProject.buildDirectory).thenReturn(fs.directory('irrelevant'));
+      when(androidProject.buildDirectory).thenReturn(globals.fs.directory('irrelevant'));
 
-      final Directory apkDirectory = fs.directory(fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release'));
+      final Directory apkDirectory = globals.fs.directory(globals.fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release'));
       apkDirectory.createSync(recursive: true);
       apkDirectory.childFile('app-release.apk').createSync();
 
@@ -333,7 +333,7 @@
         const AndroidBuildInfo(BuildInfo(BuildMode.release, '')),
       );
       expect(apks.isNotEmpty, isTrue);
-      expect(apks.first.path, equals(fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release', 'app-release.apk')));
+      expect(apks.first.path, equals(globals.fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release', 'app-release.apk')));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -345,9 +345,9 @@
 
       when(project.android).thenReturn(androidProject);
       when(project.isModule).thenReturn(false);
-      when(androidProject.buildDirectory).thenReturn(fs.directory('irrelevant'));
+      when(androidProject.buildDirectory).thenReturn(globals.fs.directory('irrelevant'));
 
-      final Directory apkDirectory = fs.directory(fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release'));
+      final Directory apkDirectory = globals.fs.directory(globals.fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release'));
       apkDirectory.createSync(recursive: true);
       apkDirectory.childFile('app-flavor1-release.apk').createSync();
 
@@ -356,7 +356,7 @@
         const AndroidBuildInfo(BuildInfo(BuildMode.release, 'flavor1')),
       );
       expect(apks.isNotEmpty, isTrue);
-      expect(apks.first.path, equals(fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release', 'app-flavor1-release.apk')));
+      expect(apks.first.path, equals(globals.fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'release', 'app-flavor1-release.apk')));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -368,9 +368,9 @@
 
       when(project.android).thenReturn(androidProject);
       when(project.isModule).thenReturn(false);
-      when(androidProject.buildDirectory).thenReturn(fs.directory('irrelevant'));
+      when(androidProject.buildDirectory).thenReturn(globals.fs.directory('irrelevant'));
 
-      final Directory apkDirectory = fs.directory(fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'flavor1', 'release'));
+      final Directory apkDirectory = globals.fs.directory(globals.fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'flavor1', 'release'));
       apkDirectory.createSync(recursive: true);
       apkDirectory.childFile('app-flavor1-release.apk').createSync();
 
@@ -379,7 +379,7 @@
         const AndroidBuildInfo(BuildInfo(BuildMode.release, 'flavor1')),
       );
       expect(apks.isNotEmpty, isTrue);
-      expect(apks.first.path, equals(fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'flavor1', 'release', 'app-flavor1-release.apk')));
+      expect(apks.first.path, equals(globals.fs.path.join('irrelevant', 'app', 'outputs', 'apk', 'flavor1', 'release', 'app-flavor1-release.apk')));
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(),
       ProcessManager: () => FakeProcessManager.any(),
@@ -456,7 +456,7 @@
 
     setUp(() {
       mockLogger = BufferLogger();
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_settings_aar_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_settings_aar_test.');
     });
 
     testUsingContext('create settings_aar.gradle when current settings.gradle loads plugins', () {
@@ -484,16 +484,16 @@
 
       tempDir.childFile('settings.gradle').writeAsStringSync(currentSettingsGradle);
 
-      final String toolGradlePath = fs.path.join(
-          fs.path.absolute(Cache.flutterRoot),
+      final String toolGradlePath = globals.fs.path.join(
+          globals.fs.path.absolute(Cache.flutterRoot),
           'packages',
           'flutter_tools',
           'gradle');
-      fs.directory(toolGradlePath).createSync(recursive: true);
-      fs.file(fs.path.join(toolGradlePath, 'deprecated_settings.gradle'))
+      globals.fs.directory(toolGradlePath).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join(toolGradlePath, 'deprecated_settings.gradle'))
           .writeAsStringSync(currentSettingsGradle);
 
-      fs.file(fs.path.join(toolGradlePath, 'settings_aar.gradle.tmpl'))
+      globals.fs.file(globals.fs.path.join(toolGradlePath, 'settings_aar.gradle.tmpl'))
           .writeAsStringSync(settingsAarFile);
 
       createSettingsAarGradle(tempDir);
@@ -518,16 +518,16 @@
 
       tempDir.childFile('settings.gradle').writeAsStringSync(currentSettingsGradle);
 
-      final String toolGradlePath = fs.path.join(
-          fs.path.absolute(Cache.flutterRoot),
+      final String toolGradlePath = globals.fs.path.join(
+          globals.fs.path.absolute(Cache.flutterRoot),
           'packages',
           'flutter_tools',
           'gradle');
-      fs.directory(toolGradlePath).createSync(recursive: true);
-      fs.file(fs.path.join(toolGradlePath, 'deprecated_settings.gradle'))
+      globals.fs.directory(toolGradlePath).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join(toolGradlePath, 'deprecated_settings.gradle'))
           .writeAsStringSync(currentSettingsGradle);
 
-      fs.file(fs.path.join(toolGradlePath, 'settings_aar.gradle.tmpl'))
+      globals.fs.file(globals.fs.path.join(toolGradlePath, 'settings_aar.gradle.tmpl'))
           .writeAsStringSync(settingsAarFile);
 
       createSettingsAarGradle(tempDir);
@@ -579,9 +579,9 @@
     }) async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.android_arm, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'android_arm'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'android_arm'));
 
-      final File manifestFile = fs.file('path/to/project/pubspec.yaml');
+      final File manifestFile = globals.fs.file('path/to/project/pubspec.yaml');
       manifestFile.createSync(recursive: true);
       manifestFile.writeAsStringSync(manifest);
 
@@ -594,7 +594,7 @@
         requireAndroidSdk: false,
       );
 
-      final File localPropertiesFile = fs.file('path/to/project/android/local.properties');
+      final File localPropertiesFile = globals.fs.file('path/to/project/android/local.properties');
       expect(propertyFor('flutter.versionName', localPropertiesFile), expectedBuildName);
       expect(propertyFor('flutter.versionCode', localPropertiesFile), expectedBuildNumber);
     }
@@ -822,7 +822,7 @@
     });
 
     testUsingContext('returns true when the project is using AndroidX', () async {
-      final Directory androidDirectory = fs.systemTempDirectory.createTempSync('flutter_android.');
+      final Directory androidDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_android.');
 
       androidDirectory
         .childFile('gradle.properties')
@@ -836,7 +836,7 @@
     });
 
     testUsingContext('returns false when the project is not using AndroidX', () async {
-      final Directory androidDirectory = fs.systemTempDirectory.createTempSync('flutter_android.');
+      final Directory androidDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_android.');
 
       androidDirectory
         .childFile('gradle.properties')
@@ -850,7 +850,7 @@
     });
 
     testUsingContext('returns false when gradle.properties does not exist', () async {
-      final Directory androidDirectory = fs.systemTempDirectory.createTempSync('flutter_android.');
+      final Directory androidDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_android.');
 
       expect(isAppUsingAndroidX(androidDirectory), isFalse);
 
@@ -880,13 +880,13 @@
     });
 
     testUsingContext('calls gradle', () async {
-      final Directory androidDirectory = fs.directory('android.');
+      final Directory androidDirectory = globals.fs.directory('android.');
       androidDirectory.createSync();
       androidDirectory
         .childFile('pubspec.yaml')
         .writeAsStringSync('name: irrelevant');
 
-      final Directory plugin1 = fs.directory('plugin1.');
+      final Directory plugin1 = globals.fs.directory('plugin1.');
       plugin1
         ..createSync()
         ..childFile('pubspec.yaml')
@@ -902,7 +902,7 @@
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      final Directory plugin2 = fs.directory('plugin2.');
+      final Directory plugin2 = globals.fs.directory('plugin2.');
       plugin2
         ..createSync()
         ..childFile('pubspec.yaml')
@@ -937,8 +937,8 @@
         buildDirectory: buildDirectory,
       );
 
-      final String flutterRoot = fs.path.absolute(Cache.flutterRoot);
-      final String initScript = fs.path.join(
+      final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot);
+      final String initScript = globals.fs.path.join(
         flutterRoot,
         'packages',
         'flutter_tools',
@@ -983,13 +983,13 @@
     });
 
     testUsingContext('skips plugin without a android/build.gradle file', () async {
-      final Directory androidDirectory = fs.directory('android.');
+      final Directory androidDirectory = globals.fs.directory('android.');
       androidDirectory.createSync();
       androidDirectory
         .childFile('pubspec.yaml')
         .writeAsStringSync('name: irrelevant');
 
-      final Directory plugin1 = fs.directory('plugin1.');
+      final Directory plugin1 = globals.fs.directory('plugin1.');
       plugin1
         ..createSync()
         ..childFile('pubspec.yaml')
@@ -1022,8 +1022,8 @@
         buildDirectory: buildDirectory,
       );
 
-      final String flutterRoot = fs.path.absolute(Cache.flutterRoot);
-      final String initScript = fs.path.join(
+      final String flutterRoot = globals.fs.path.absolute(Cache.flutterRoot);
+      final String initScript = globals.fs.path.join(
         flutterRoot,
         'packages',
         'flutter_tools',
@@ -1103,15 +1103,15 @@
         environment: anyNamed('environment')))
       .thenAnswer((_) => Future<Process>.value(process));
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
@@ -1182,15 +1182,15 @@
         return Future<Process>.value(process);
       });
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
@@ -1257,15 +1257,15 @@
         environment: anyNamed('environment')))
       .thenThrow(const ProcessException('', <String>[], 'Some gradle message'));
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
@@ -1330,15 +1330,15 @@
         environment: anyNamed('environment')))
       .thenThrow(const ProcessException('', <String>[], 'Unrecognized'));
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
@@ -1390,21 +1390,21 @@
         return Future<Process>.value(process);
       });
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
         ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
 
-      fs.directory('build')
+      globals.fs.directory('build')
         .childDirectory('app')
         .childDirectory('outputs')
         .childDirectory('apk')
@@ -1468,15 +1468,15 @@
         return Future<Process>.value(process);
       });
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
@@ -1554,21 +1554,21 @@
           ));
       });
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
         ..writeAsStringSync('apply from: irrelevant/flutter.gradle');
 
-      fs.directory('build')
+      globals.fs.directory('build')
         .childDirectory('app')
         .childDirectory('outputs')
         .childDirectory('apk')
@@ -1603,7 +1603,7 @@
     });
 
     testUsingContext('doesn\'t indicate how to consume an AAR when printHowToConsumeAaar is false', () async {
-      final File manifestFile = fs.file('pubspec.yaml');
+      final File manifestFile = globals.fs.file('pubspec.yaml');
       manifestFile.createSync(recursive: true);
       manifestFile.writeAsStringSync('''
         flutter:
@@ -1612,12 +1612,12 @@
         '''
       );
 
-      fs.file('.android/gradlew').createSync(recursive: true);
+      globals.fs.file('.android/gradlew').createSync(recursive: true);
 
-      fs.file('.android/gradle.properties')
+      globals.fs.file('.android/gradle.properties')
         .writeAsStringSync('irrelevant');
 
-      fs.file('.android/build.gradle')
+      globals.fs.file('.android/build.gradle')
         .createSync(recursive: true);
 
       // Let any process start. Assert after.
@@ -1627,12 +1627,12 @@
         workingDirectory: anyNamed('workingDirectory'),
       )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
 
-      fs.directory('build/outputs/repo').createSync(recursive: true);
+      globals.fs.directory('build/outputs/repo').createSync(recursive: true);
 
       await buildGradleAar(
         androidBuildInfo: const AndroidBuildInfo(BuildInfo(BuildMode.release, null)),
         project: FlutterProject.current(),
-        outputDirectory: fs.directory('build/'),
+        outputDirectory: globals.fs.directory('build/'),
         target: '',
         buildNumber: '1.0',
       );
@@ -1658,9 +1658,9 @@
     testUsingContext('build apk uses selected local engine', () async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.android_arm, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'android_arm'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'android_arm'));
 
-      fs.file('out/android_arm/flutter_embedding_release.pom')
+      globals.fs.file('out/android_arm/flutter_embedding_release.pom')
         ..createSync(recursive: true)
         ..writeAsStringSync(
 '''<?xml version="1.0" encoding="UTF-8"?>
@@ -1670,21 +1670,21 @@
   </dependencies>
 </project>
 ''');
-      fs.file('out/android_arm/armeabi_v7a_release.pom').createSync(recursive: true);
-      fs.file('out/android_arm/armeabi_v7a_release.jar').createSync(recursive: true);
-      fs.file('out/android_arm/flutter_embedding_release.jar').createSync(recursive: true);
-      fs.file('out/android_arm/flutter_embedding_release.pom').createSync(recursive: true);
+      globals.fs.file('out/android_arm/armeabi_v7a_release.pom').createSync(recursive: true);
+      globals.fs.file('out/android_arm/armeabi_v7a_release.jar').createSync(recursive: true);
+      globals.fs.file('out/android_arm/flutter_embedding_release.jar').createSync(recursive: true);
+      globals.fs.file('out/android_arm/flutter_embedding_release.pom').createSync(recursive: true);
 
-      fs.file('android/gradlew').createSync(recursive: true);
+      globals.fs.file('android/gradlew').createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childFile('gradle.properties')
         .createSync(recursive: true);
 
-      fs.file('android/build.gradle')
+      globals.fs.file('android/build.gradle')
         .createSync(recursive: true);
 
-      fs.directory('android')
+      globals.fs.directory('android')
         .childDirectory('app')
         .childFile('build.gradle')
         ..createSync(recursive: true)
@@ -1749,9 +1749,9 @@
     testUsingContext('build aar uses selected local engine', () async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.android_arm, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'android_arm'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'android_arm'));
 
-      fs.file('out/android_arm/flutter_embedding_release.pom')
+      globals.fs.file('out/android_arm/flutter_embedding_release.pom')
         ..createSync(recursive: true)
         ..writeAsStringSync(
 '''<?xml version="1.0" encoding="UTF-8"?>
@@ -1761,12 +1761,12 @@
   </dependencies>
 </project>
 ''');
-      fs.file('out/android_arm/armeabi_v7a_release.pom').createSync(recursive: true);
-      fs.file('out/android_arm/armeabi_v7a_release.jar').createSync(recursive: true);
-      fs.file('out/android_arm/flutter_embedding_release.jar').createSync(recursive: true);
-      fs.file('out/android_arm/flutter_embedding_release.pom').createSync(recursive: true);
+      globals.fs.file('out/android_arm/armeabi_v7a_release.pom').createSync(recursive: true);
+      globals.fs.file('out/android_arm/armeabi_v7a_release.jar').createSync(recursive: true);
+      globals.fs.file('out/android_arm/flutter_embedding_release.jar').createSync(recursive: true);
+      globals.fs.file('out/android_arm/flutter_embedding_release.pom').createSync(recursive: true);
 
-      final File manifestFile = fs.file('pubspec.yaml');
+      final File manifestFile = globals.fs.file('pubspec.yaml');
       manifestFile.createSync(recursive: true);
       manifestFile.writeAsStringSync('''
         flutter:
@@ -1775,12 +1775,12 @@
         '''
       );
 
-      fs.file('.android/gradlew').createSync(recursive: true);
+      globals.fs.file('.android/gradlew').createSync(recursive: true);
 
-      fs.file('.android/gradle.properties')
+      globals.fs.file('.android/gradle.properties')
         .writeAsStringSync('irrelevant');
 
-      fs.file('.android/build.gradle')
+      globals.fs.file('.android/build.gradle')
         .createSync(recursive: true);
 
       // Let any process start. Assert after.
@@ -1790,12 +1790,12 @@
         workingDirectory: anyNamed('workingDirectory'),
       )).thenAnswer((_) async => ProcessResult(1, 0, '', ''));
 
-      fs.directory('build/outputs/repo').createSync(recursive: true);
+      globals.fs.directory('build/outputs/repo').createSync(recursive: true);
 
       await buildGradleAar(
         androidBuildInfo: const AndroidBuildInfo(BuildInfo(BuildMode.release, null)),
         project: FlutterProject.current(),
-        outputDirectory: fs.directory('build/'),
+        outputDirectory: globals.fs.directory('build/'),
         target: '',
         buildNumber: '2.0',
       );
@@ -1830,7 +1830,7 @@
       printHowToConsumeAar(
         buildModes: const <String>{'release', 'debug', 'profile'},
         androidPackage: 'com.mycompany',
-        repoDirectory: fs.directory('build/'),
+        repoDirectory: globals.fs.directory('build/'),
         buildNumber: '2.2',
       );
 
@@ -1883,7 +1883,7 @@
       printHowToConsumeAar(
         buildModes: const <String>{'release'},
         androidPackage: 'com.mycompany',
-        repoDirectory: fs.directory('build/'),
+        repoDirectory: globals.fs.directory('build/'),
       );
 
       expect(
@@ -1922,7 +1922,7 @@
       printHowToConsumeAar(
         buildModes: const <String>{'debug'},
         androidPackage: 'com.mycompany',
-        repoDirectory: fs.directory('build/'),
+        repoDirectory: globals.fs.directory('build/'),
       );
 
       expect(
@@ -1961,7 +1961,7 @@
       printHowToConsumeAar(
         buildModes: const <String>{'profile'},
         androidPackage: 'com.mycompany',
-        repoDirectory: fs.directory('build/'),
+        repoDirectory: globals.fs.directory('build/'),
         buildNumber: '1.0',
       );
 
@@ -2017,7 +2017,7 @@
 
   when(project.isModule).thenReturn(false);
   when(project.android).thenReturn(androidProject);
-  when(androidProject.buildDirectory).thenReturn(fs.directory('irrelevant'));
+  when(androidProject.buildDirectory).thenReturn(globals.fs.directory('irrelevant'));
 
   final Directory bundleDirectory = getBundleDirectory(project);
   bundleDirectory
diff --git a/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart
index d0cca2a..f405124 100644
--- a/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart
@@ -6,9 +6,9 @@
 import 'package:flutter_tools/src/android/gradle_utils.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/os.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -42,7 +42,7 @@
     });
 
     testUsingContext('injects the wrapper when all files are missing', () {
-      final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+      final Directory sampleAppAndroid = globals.fs.directory('/sample-app/android');
       sampleAppAndroid.createSync(recursive: true);
 
       gradleUtils.injectGradleWrapperIfNeeded(sampleAppAndroid);
@@ -78,7 +78,7 @@
     });
 
     testUsingContext('injects the wrapper when some files are missing', () {
-      final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+      final Directory sampleAppAndroid = globals.fs.directory('/sample-app/android');
       sampleAppAndroid.createSync(recursive: true);
 
       // There's an existing gradlew
@@ -128,7 +128,7 @@
     });
 
     testUsingContext('throws ToolExit if gradle.properties doesn\'t exist', () {
-      final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+      final Directory sampleAppAndroid = globals.fs.directory('/sample-app/android');
       sampleAppAndroid.createSync(recursive: true);
 
       expect(() {
@@ -162,7 +162,7 @@
     });
 
     testUsingContext('does not update gradle.properties if it already uses R8', () {
-      final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+      final Directory sampleAppAndroid = globals.fs.directory('/sample-app/android');
       sampleAppAndroid.createSync(recursive: true);
       sampleAppAndroid.childFile('gradle.properties')
         .writeAsStringSync('android.enableR8=true');
@@ -179,7 +179,7 @@
     });
 
     testUsingContext('sets android.enableR8=true', () {
-      final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+      final Directory sampleAppAndroid = globals.fs.directory('/sample-app/android');
       sampleAppAndroid.createSync(recursive: true);
       sampleAppAndroid.childFile('gradle.properties')
         .writeAsStringSync('org.gradle.jvmargs=-Xmx1536M\n');
@@ -200,7 +200,7 @@
     });
 
     testUsingContext('appends android.enableR8=true to the new line', () {
-      final Directory sampleAppAndroid = fs.directory('/sample-app/android');
+      final Directory sampleAppAndroid = globals.fs.directory('/sample-app/android');
       sampleAppAndroid.createSync(recursive: true);
       sampleAppAndroid.childFile('gradle.properties')
         .writeAsStringSync('org.gradle.jvmargs=-Xmx1536M');
@@ -222,7 +222,7 @@
   });
 
   group('GradleUtils.getExecutable', () {
-    final String gradlewFilename = platform.isWindows ? 'gradlew.bat' : 'gradlew';
+    final String gradlewFilename = globals.platform.isWindows ? 'gradlew.bat' : 'gradlew';
 
     MemoryFileSystem memoryFileSystem;
     OperatingSystemUtils operatingSystemUtils;
@@ -235,7 +235,7 @@
     });
 
     testUsingContext('returns the gradlew path', () {
-      final Directory androidDirectory = fs.directory('/android')..createSync();
+      final Directory androidDirectory = globals.fs.directory('/android')..createSync();
       androidDirectory.childFile('gradlew')..createSync();
       androidDirectory.childFile('gradlew.bat')..createSync();
       androidDirectory.childFile('gradle.properties').createSync();
diff --git a/packages/flutter_tools/test/general.shard/application_package_test.dart b/packages/flutter_tools/test/general.shard/application_package_test.dart
index d049188..cfa21ee 100644
--- a/packages/flutter_tools/test/general.shard/application_package_test.dart
+++ b/packages/flutter_tools/test/general.shard/application_package_test.dart
@@ -12,14 +12,15 @@
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/os.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/fuchsia/application_package.dart';
 import 'package:flutter_tools/src/ios/plist_parser.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -62,14 +63,14 @@
       )).thenAnswer((_) async => ProcessResult(1, 0, 'stdout', 'stderr'));
       when(mockProcessManager.runSync(any)).thenReturn(ProcessResult(1, 0, 'stdout', 'stderr'));
       final FlutterProject project = FlutterProject.current();
-      gradle = fs.file(project.android.hostAppGradleRoot.childFile(
-        platform.isWindows ? 'gradlew.bat' : 'gradlew',
+      gradle = globals.fs.file(project.android.hostAppGradleRoot.childFile(
+        globals.platform.isWindows ? 'gradlew.bat' : 'gradlew',
       ).path)..createSync(recursive: true);
     });
 
     testUsingContext('Licenses not available, platform and buildtools available, apk exists', () async {
       const String aaptPath = 'aaptPath';
-      final File apkFile = fs.file('app.apk');
+      final File apkFile = globals.fs.file('app.apk');
       final AndroidSdkVersion sdkVersion = MockitoAndroidSdkVersion();
       when(sdkVersion.aaptPath).thenReturn(aaptPath);
       when(sdk.latestVersion).thenReturn(sdkVersion);
@@ -99,24 +100,24 @@
       when(sdk.latestVersion).thenReturn(null);
       final FlutterProject project = FlutterProject.current();
       final File gradle = project.android.hostAppGradleRoot.childFile(
-        platform.isWindows ? 'gradlew.bat' : 'gradlew',
+        globals.platform.isWindows ? 'gradlew.bat' : 'gradlew',
       )..createSync(recursive: true);
 
       project.android.hostAppGradleRoot
         .childFile('gradle.properties')
         .writeAsStringSync('irrelevant');
 
-      final Directory gradleWrapperDir = fs.systemTempDirectory.createTempSync('flutter_application_package_test_gradle_wrapper.');
+      final Directory gradleWrapperDir = globals.fs.systemTempDirectory.createTempSync('flutter_application_package_test_gradle_wrapper.');
       when(mockCache.getArtifactDirectory('gradle_wrapper')).thenReturn(gradleWrapperDir);
 
-      fs.directory(gradleWrapperDir.childDirectory('gradle').childDirectory('wrapper'))
+      globals.fs.directory(gradleWrapperDir.childDirectory('gradle').childDirectory('wrapper'))
           .createSync(recursive: true);
-      fs.file(fs.path.join(gradleWrapperDir.path, 'gradlew')).writeAsStringSync('irrelevant');
-      fs.file(fs.path.join(gradleWrapperDir.path, 'gradlew.bat')).writeAsStringSync('irrelevant');
+      globals.fs.file(globals.fs.path.join(gradleWrapperDir.path, 'gradlew')).writeAsStringSync('irrelevant');
+      globals.fs.file(globals.fs.path.join(gradleWrapperDir.path, 'gradlew.bat')).writeAsStringSync('irrelevant');
 
       await ApplicationPackageFactory.instance.getPackageForPlatform(
         TargetPlatform.android_arm,
-        applicationBinary: fs.file('app.apk'),
+        applicationBinary: globals.fs.file('app.apk'),
       );
       verify(
         mockProcessManager.run(
@@ -215,7 +216,7 @@
 
     testUsingContext('Error on non-existing file', () {
       final PrebuiltIOSApp iosApp =
-          IOSApp.fromPrebuiltApp(fs.file('not_existing.ipa')) as PrebuiltIOSApp;
+          IOSApp.fromPrebuiltApp(globals.fs.file('not_existing.ipa')) as PrebuiltIOSApp;
       expect(iosApp, isNull);
       expect(
         testLogger.errorText,
@@ -224,17 +225,17 @@
     }, overrides: overrides);
 
     testUsingContext('Error on non-app-bundle folder', () {
-      fs.directory('regular_folder').createSync();
+      globals.fs.directory('regular_folder').createSync();
       final PrebuiltIOSApp iosApp =
-          IOSApp.fromPrebuiltApp(fs.file('regular_folder')) as PrebuiltIOSApp;
+          IOSApp.fromPrebuiltApp(globals.fs.file('regular_folder')) as PrebuiltIOSApp;
       expect(iosApp, isNull);
       expect(
           testLogger.errorText, 'Folder "regular_folder" is not an app bundle.\n');
     }, overrides: overrides);
 
     testUsingContext('Error on no info.plist', () {
-      fs.directory('bundle.app').createSync();
-      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('bundle.app')) as PrebuiltIOSApp;
+      globals.fs.directory('bundle.app').createSync();
+      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('bundle.app')) as PrebuiltIOSApp;
       expect(iosApp, isNull);
       expect(
         testLogger.errorText,
@@ -243,9 +244,9 @@
     }, overrides: overrides);
 
     testUsingContext('Error on bad info.plist', () {
-      fs.directory('bundle.app').createSync();
-      fs.file('bundle.app/Info.plist').writeAsStringSync(badPlistData);
-      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('bundle.app')) as PrebuiltIOSApp;
+      globals.fs.directory('bundle.app').createSync();
+      globals.fs.file('bundle.app/Info.plist').writeAsStringSync(badPlistData);
+      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('bundle.app')) as PrebuiltIOSApp;
       expect(iosApp, isNull);
       expect(
         testLogger.errorText,
@@ -255,9 +256,9 @@
     }, overrides: overrides);
 
     testUsingContext('Success with app bundle', () {
-      fs.directory('bundle.app').createSync();
-      fs.file('bundle.app/Info.plist').writeAsStringSync(plistData);
-      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('bundle.app')) as PrebuiltIOSApp;
+      globals.fs.directory('bundle.app').createSync();
+      globals.fs.file('bundle.app/Info.plist').writeAsStringSync(plistData);
+      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('bundle.app')) as PrebuiltIOSApp;
       expect(testLogger.errorText, isEmpty);
       expect(iosApp.bundleDir.path, 'bundle.app');
       expect(iosApp.id, 'fooBundleId');
@@ -265,9 +266,9 @@
     }, overrides: overrides);
 
     testUsingContext('Bad ipa zip-file, no payload dir', () {
-      fs.file('app.ipa').createSync();
-      when(os.unzip(fs.file('app.ipa'), any)).thenAnswer((Invocation _) { });
-      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('app.ipa')) as PrebuiltIOSApp;
+      globals.fs.file('app.ipa').createSync();
+      when(os.unzip(globals.fs.file('app.ipa'), any)).thenAnswer((Invocation _) { });
+      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('app.ipa')) as PrebuiltIOSApp;
       expect(iosApp, isNull);
       expect(
         testLogger.errorText,
@@ -276,7 +277,7 @@
     }, overrides: overrides);
 
     testUsingContext('Bad ipa zip-file, two app bundles', () {
-      fs.file('app.ipa').createSync();
+      globals.fs.file('app.ipa').createSync();
       when(os.unzip(any, any)).thenAnswer((Invocation invocation) {
         final File zipFile = invocation.positionalArguments[0] as File;
         if (zipFile.path != 'app.ipa') {
@@ -284,34 +285,34 @@
         }
         final Directory targetDirectory = invocation.positionalArguments[1] as Directory;
         final String bundlePath1 =
-            fs.path.join(targetDirectory.path, 'Payload', 'bundle1.app');
+            globals.fs.path.join(targetDirectory.path, 'Payload', 'bundle1.app');
         final String bundlePath2 =
-            fs.path.join(targetDirectory.path, 'Payload', 'bundle2.app');
-        fs.directory(bundlePath1).createSync(recursive: true);
-        fs.directory(bundlePath2).createSync(recursive: true);
+            globals.fs.path.join(targetDirectory.path, 'Payload', 'bundle2.app');
+        globals.fs.directory(bundlePath1).createSync(recursive: true);
+        globals.fs.directory(bundlePath2).createSync(recursive: true);
       });
-      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('app.ipa')) as PrebuiltIOSApp;
+      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('app.ipa')) as PrebuiltIOSApp;
       expect(iosApp, isNull);
       expect(testLogger.errorText,
           'Invalid prebuilt iOS ipa. Does not contain a single app bundle.\n');
     }, overrides: overrides);
 
     testUsingContext('Success with ipa', () {
-      fs.file('app.ipa').createSync();
+      globals.fs.file('app.ipa').createSync();
       when(os.unzip(any, any)).thenAnswer((Invocation invocation) {
         final File zipFile = invocation.positionalArguments[0] as File;
         if (zipFile.path != 'app.ipa') {
           return null;
         }
         final Directory targetDirectory = invocation.positionalArguments[1] as Directory;
-        final Directory bundleAppDir = fs.directory(
-            fs.path.join(targetDirectory.path, 'Payload', 'bundle.app'));
+        final Directory bundleAppDir = globals.fs.directory(
+            globals.fs.path.join(targetDirectory.path, 'Payload', 'bundle.app'));
         bundleAppDir.createSync(recursive: true);
-        fs
-            .file(fs.path.join(bundleAppDir.path, 'Info.plist'))
+        globals.fs
+            .file(globals.fs.path.join(bundleAppDir.path, 'Info.plist'))
             .writeAsStringSync(plistData);
       });
-      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('app.ipa')) as PrebuiltIOSApp;
+      final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(globals.fs.file('app.ipa')) as PrebuiltIOSApp;
       expect(testLogger.errorText, isEmpty);
       expect(iosApp.bundleDir.path, endsWith('bundle.app'));
       expect(iosApp.id, 'fooBundleId');
@@ -319,30 +320,30 @@
     }, overrides: overrides);
 
     testUsingContext('returns null when there is no ios or .ios directory', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
       final BuildableIOSApp iosApp = await IOSApp.fromIosProject(
-        FlutterProject.fromDirectory(fs.currentDirectory).ios) as BuildableIOSApp;
+        FlutterProject.fromDirectory(globals.fs.currentDirectory).ios) as BuildableIOSApp;
 
       expect(iosApp, null);
     }, overrides: overrides);
 
     testUsingContext('returns null when there is no Runner.xcodeproj', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
-      fs.file('ios/FooBar.xcodeproj').createSync(recursive: true);
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
+      globals.fs.file('ios/FooBar.xcodeproj').createSync(recursive: true);
       final BuildableIOSApp iosApp = await IOSApp.fromIosProject(
-        FlutterProject.fromDirectory(fs.currentDirectory).ios) as BuildableIOSApp;
+        FlutterProject.fromDirectory(globals.fs.currentDirectory).ios) as BuildableIOSApp;
 
       expect(iosApp, null);
     }, overrides: overrides);
 
     testUsingContext('returns null when there is no Runner.xcodeproj/project.pbxproj', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
-      fs.file('ios/Runner.xcodeproj').createSync(recursive: true);
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
+      globals.fs.file('ios/Runner.xcodeproj').createSync(recursive: true);
       final BuildableIOSApp iosApp = await IOSApp.fromIosProject(
-        FlutterProject.fromDirectory(fs.currentDirectory).ios) as BuildableIOSApp;
+        FlutterProject.fromDirectory(globals.fs.currentDirectory).ios) as BuildableIOSApp;
 
       expect(iosApp, null);
     }, overrides: overrides);
@@ -358,7 +359,7 @@
 
     testUsingContext('Error on non-existing file', () {
       final PrebuiltFuchsiaApp fuchsiaApp =
-          FuchsiaApp.fromPrebuiltApp(fs.file('not_existing.far')) as PrebuiltFuchsiaApp;
+          FuchsiaApp.fromPrebuiltApp(globals.fs.file('not_existing.far')) as PrebuiltFuchsiaApp;
       expect(fuchsiaApp, isNull);
       expect(
         testLogger.errorText,
@@ -367,9 +368,9 @@
     }, overrides: overrides);
 
     testUsingContext('Error on non-far file', () {
-      fs.directory('regular_folder').createSync();
+      globals.fs.directory('regular_folder').createSync();
       final PrebuiltFuchsiaApp fuchsiaApp =
-          FuchsiaApp.fromPrebuiltApp(fs.file('regular_folder')) as PrebuiltFuchsiaApp;
+          FuchsiaApp.fromPrebuiltApp(globals.fs.file('regular_folder')) as PrebuiltFuchsiaApp;
       expect(fuchsiaApp, isNull);
       expect(
         testLogger.errorText,
@@ -378,16 +379,16 @@
     }, overrides: overrides);
 
     testUsingContext('Success with far file', () {
-      fs.file('bundle.far').createSync();
-      final PrebuiltFuchsiaApp fuchsiaApp = FuchsiaApp.fromPrebuiltApp(fs.file('bundle.far')) as PrebuiltFuchsiaApp;
+      globals.fs.file('bundle.far').createSync();
+      final PrebuiltFuchsiaApp fuchsiaApp = FuchsiaApp.fromPrebuiltApp(globals.fs.file('bundle.far')) as PrebuiltFuchsiaApp;
       expect(testLogger.errorText, isEmpty);
       expect(fuchsiaApp.id, 'bundle.far');
     }, overrides: overrides);
 
     testUsingContext('returns null when there is no fuchsia', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
-      final BuildableFuchsiaApp fuchsiaApp = FuchsiaApp.fromFuchsiaProject(FlutterProject.fromDirectory(fs.currentDirectory).fuchsia) as BuildableFuchsiaApp;
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
+      final BuildableFuchsiaApp fuchsiaApp = FuchsiaApp.fromFuchsiaProject(FlutterProject.fromDirectory(globals.fs.currentDirectory).fuchsia) as BuildableFuchsiaApp;
 
       expect(fuchsiaApp, null);
     }, overrides: overrides);
@@ -639,7 +640,7 @@
 class MockPlistUtils extends Mock implements PlistParser {
   @override
   String getValueFromFile(String path, String key) {
-    final File file = fs.file(path);
+    final File file = globals.fs.file(path);
     if (!file.existsSync()) {
       return null;
     }
diff --git a/packages/flutter_tools/test/general.shard/artifacts_test.dart b/packages/flutter_tools/test/general.shard/artifacts_test.dart
index da35d1c..d902357 100644
--- a/packages/flutter_tools/test/general.shard/artifacts_test.dart
+++ b/packages/flutter_tools/test/general.shard/artifacts_test.dart
@@ -3,11 +3,13 @@
 // found in the LICENSE file.
 
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/artifacts.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -36,11 +38,11 @@
       testUsingContext('getArtifactPath', () {
         expect(
           artifacts.getArtifactPath(Artifact.flutterFramework, platform: TargetPlatform.ios, mode: BuildMode.release),
-          fs.path.join(tempDir.path, 'bin', 'cache', 'artifacts', 'engine', 'ios-release', 'Flutter.framework'),
+          globals.fs.path.join(tempDir.path, 'bin', 'cache', 'artifacts', 'engine', 'ios-release', 'Flutter.framework'),
         );
         expect(
           artifacts.getArtifactPath(Artifact.flutterTester),
-          fs.path.join(tempDir.path, 'bin', 'cache', 'artifacts', 'engine', 'linux-x64', 'flutter_tester'),
+          globals.fs.path.join(tempDir.path, 'bin', 'cache', 'artifacts', 'engine', 'linux-x64', 'flutter_tester'),
         );
       }, overrides: <Type, Generator>{
         Cache: () => Cache(rootOverride: tempDir),
@@ -83,15 +85,15 @@
       testUsingContext('getArtifactPath', () {
         expect(
           artifacts.getArtifactPath(Artifact.flutterFramework, platform: TargetPlatform.ios, mode: BuildMode.release),
-          fs.path.join(tempDir.path, 'out', 'android_debug_unopt', 'Flutter.framework'),
+          globals.fs.path.join(tempDir.path, 'out', 'android_debug_unopt', 'Flutter.framework'),
         );
         expect(
           artifacts.getArtifactPath(Artifact.flutterTester),
-          fs.path.join(tempDir.path, 'out', 'android_debug_unopt', 'flutter_tester'),
+          globals.fs.path.join(tempDir.path, 'out', 'android_debug_unopt', 'flutter_tester'),
         );
         expect(
           artifacts.getArtifactPath(Artifact.engineDartSdkPath),
-          fs.path.join(tempDir.path, 'out', 'host_debug_unopt', 'dart-sdk'),
+          globals.fs.path.join(tempDir.path, 'out', 'host_debug_unopt', 'dart-sdk'),
         );
       }, overrides: <Type, Generator>{
         FileSystem: () => memoryFileSystem,
diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart
index c6e26fd..222c96f 100644
--- a/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart
+++ b/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart
@@ -10,8 +10,9 @@
 
 import 'package:flutter_tools/src/asset.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -24,7 +25,7 @@
     // fixed we fix them here.
     // TODO(dantup): Remove this function once the above issue is fixed and
     // rolls into Flutter.
-    return path?.replaceAll('/', fs.path.separator);
+    return path?.replaceAll('/', globals.fs.path.separator);
   }
   void writePubspecFile(String path, String name, { String fontsSection }) {
     if (fontsSection == null) {
@@ -37,7 +38,7 @@
 ''';
     }
 
-    fs.file(fixPath(path))
+    globals.fs.file(fixPath(path))
       ..createSync(recursive: true)
       ..writeAsStringSync('''
 name: $name
@@ -55,7 +56,7 @@
   }
 
   void writePackagesFile(String packages) {
-    fs.file('.packages')
+    globals.fs.file('.packages')
       ..createSync()
       ..writeAsStringSync(packages);
   }
@@ -95,7 +96,7 @@
   }
 
   void writeFontAsset(String path, String font) {
-    fs.file(fixPath('$path$font'))
+    globals.fs.file(fixPath('$path$font'))
       ..createSync(recursive: true)
       ..writeAsStringSync(font);
   }
@@ -105,7 +106,7 @@
 
     setUp(() async {
       testFileSystem = MemoryFileSystem(
-        style: platform.isWindows
+        style: globals.platform.isWindows
           ? FileSystemStyle.windows
           : FileSystemStyle.posix,
       );
@@ -114,7 +115,7 @@
 
     testUsingContext('App includes neither font manifest nor fonts when no defines fonts', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -131,7 +132,7 @@
 
     testUsingContext('App font uses font file from package', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       const String fontsSection = '''
        - family: foo
@@ -160,7 +161,7 @@
 
     testUsingContext('App font uses local font file and package font file', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       const String fontsSection = '''
        - family: foo
@@ -193,7 +194,7 @@
 
     testUsingContext('App uses package font with own font file', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -227,7 +228,7 @@
 
     testUsingContext('App uses package font with font file from another package', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/\ntest_package2:p2/p/lib/');
@@ -262,7 +263,7 @@
 
     testUsingContext('App uses package font with properties and own font file', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -298,7 +299,7 @@
 
     testUsingContext('App uses local font and package font with own font file.', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       const String fontsSection = '''
        - family: foo
diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart
index eb1f72d..25e2089 100644
--- a/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart
+++ b/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart
@@ -10,8 +10,9 @@
 
 import 'package:flutter_tools/src/asset.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -24,7 +25,7 @@
     // fixed we fix them here.
     // TODO(dantup): Remove this function once the above issue is fixed and
     // rolls into Flutter.
-    return path?.replaceAll('/', fs.path.separator);
+    return path?.replaceAll('/', globals.fs.path.separator);
   }
   void writePubspecFile(String path, String name, { List<String> assets }) {
     String assetsSection;
@@ -45,7 +46,7 @@
       assetsSection = buffer.toString();
     }
 
-    fs.file(fixPath(path))
+    globals.fs.file(fixPath(path))
       ..createSync(recursive: true)
       ..writeAsStringSync('''
 name: $name
@@ -61,7 +62,7 @@
   }
 
   void writePackagesFile(String packages) {
-    fs.file('.packages')
+    globals.fs.file('.packages')
       ..createSync()
       ..writeAsStringSync(packages);
   }
@@ -93,9 +94,9 @@
 
   void writeAssets(String path, List<String> assets) {
     for (String asset in assets) {
-      final String fullPath = fixPath(fs.path.join(path, asset));
+      final String fullPath = fixPath(globals.fs.path.join(path, asset));
 
-      fs.file(fullPath)
+      globals.fs.file(fullPath)
         ..createSync(recursive: true)
         ..writeAsStringSync(asset);
     }
@@ -105,7 +106,7 @@
 
   setUp(() async {
     testFileSystem = MemoryFileSystem(
-      style: platform.isWindows
+      style: globals.platform.isWindows
         ? FileSystemStyle.windows
         : FileSystemStyle.posix,
     );
@@ -115,7 +116,7 @@
   group('AssetBundle assets from packages', () {
     testUsingContext('No assets are bundled when the package has no assets', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -140,7 +141,7 @@
 
     testUsingContext('No assets are bundled when the package has an asset that is not listed', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -168,7 +169,7 @@
 
     testUsingContext('One asset is bundled when the package has and lists one asset its pubspec', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -196,7 +197,7 @@
 
     testUsingContext("One asset is bundled when the package has one asset, listed in the app's pubspec", () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       final List<String> assetEntries = <String>['packages/test_package/a/foo'];
       writePubspecFile(
@@ -224,7 +225,7 @@
 
     testUsingContext('One asset and its variant are bundled when the package has an asset and a variant, and lists the asset in its pubspec', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -252,7 +253,7 @@
 
     testUsingContext('One asset and its variant are bundled when the package has an asset and a variant, and the app lists the asset in its pubspec', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile(
         'pubspec.yaml',
@@ -283,7 +284,7 @@
 
     testUsingContext('Two assets are bundled when the package has and lists two assets in its pubspec', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -312,7 +313,7 @@
 
     testUsingContext("Two assets are bundled when the package has two assets, listed in the app's pubspec", () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       final List<String> assetEntries = <String>[
         'packages/test_package/a/foo',
@@ -348,7 +349,7 @@
 
     testUsingContext('Two assets are bundled when two packages each have and list an asset their pubspec', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile(
         'pubspec.yaml',
@@ -388,7 +389,7 @@
 
     testUsingContext("Two assets are bundled when two packages each have an asset, listed in the app's pubspec", () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       final List<String> assetEntries = <String>[
         'packages/test_package/a/foo',
@@ -431,7 +432,7 @@
 
     testUsingContext('One asset is bundled when the app depends on a package, listing in its pubspec an asset from another package', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
       writePubspecFile(
         'pubspec.yaml',
         'test',
@@ -467,7 +468,7 @@
 
   testUsingContext('Asset paths can contain URL reserved characters', () async {
     establishFlutterRoot();
-    writeEmptySchemaFile(fs);
+    writeEmptySchemaFile(globals.fs);
 
     writePubspecFile('pubspec.yaml', 'test');
     writePackagesFile('test_package:p/p/lib/');
@@ -497,7 +498,7 @@
   group('AssetBundle assets from scanned paths', () {
     testUsingContext('Two assets are bundled when scanning their directory', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -528,7 +529,7 @@
 
     testUsingContext('Two assets are bundled when listing one and scanning second directory', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -559,7 +560,7 @@
 
     testUsingContext('One asset is bundled with variant, scanning wrong directory', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -587,7 +588,7 @@
   group('AssetBundle assets from scanned paths with MemoryFileSystem', () {
     testUsingContext('One asset is bundled with variant, scanning directory', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -617,7 +618,7 @@
 
     testUsingContext('No asset is bundled with variant, no assets or directories are listed', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
@@ -646,7 +647,7 @@
 
     testUsingContext('Expect error generating manifest, wrong non-existing directory is listed', () async {
       establishFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
       writePubspecFile('pubspec.yaml', 'test');
       writePackagesFile('test_package:p/p/lib/');
diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart
index c530ea4..39c8b02 100644
--- a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart
+++ b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart
@@ -10,10 +10,10 @@
 import 'package:flutter_tools/src/asset.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/bundle.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/devfs.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../src/common.dart';
@@ -29,7 +29,7 @@
 
     setUp(() async {
       testFileSystem = MemoryFileSystem(
-        style: platform.isWindows
+        style: globals.platform.isWindows
           ? FileSystemStyle.windows
           : FileSystemStyle.posix,
       );
@@ -46,7 +46,7 @@
     });
 
     testUsingContext('empty pubspec', () async {
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync('');
 
@@ -64,9 +64,9 @@
     });
 
     testUsingContext('wildcard directories are updated when filesystem changes', () async {
-      final File packageFile = fs.file('.packages')..createSync();
-      fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
-      fs.file('pubspec.yaml')
+      final File packageFile = globals.fs.file('.packages')..createSync();
+      globals.fs.file(globals.fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync(r'''
 name: example
@@ -85,7 +85,7 @@
       expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), false);
 
       // Simulate modifying the files by updating the filestat time manually.
-      fs.file(fs.path.join('assets', 'foo', 'fizz.txt'))
+      globals.fs.file(globals.fs.path.join('assets', 'foo', 'fizz.txt'))
         ..createSync(recursive: true)
         ..setLastModifiedSync(packageFile.lastModifiedSync().add(const Duration(hours: 1)));
 
@@ -104,8 +104,8 @@
     });
 
     testUsingContext('handle removal of wildcard directories', () async {
-      fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
-      final File pubspec = fs.file('pubspec.yaml')
+      globals.fs.file(globals.fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
+      final File pubspec = globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync(r'''
 name: example
@@ -113,7 +113,7 @@
   assets:
     - assets/foo/
 ''');
-      fs.file('.packages').createSync();
+      globals.fs.file('.packages').createSync();
       final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
       await bundle.build(manifestPath: 'pubspec.yaml');
       // Expected assets:
@@ -126,15 +126,15 @@
 
       // Delete the wildcard directory and update pubspec file.
       final DateTime modifiedTime = pubspec.lastModifiedSync().add(const Duration(hours: 1));
-      fs.directory(fs.path.join('assets', 'foo')).deleteSync(recursive: true);
-      fs.file('pubspec.yaml')
+      globals.fs.directory(globals.fs.path.join('assets', 'foo')).deleteSync(recursive: true);
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync(r'''
 name: example''')
         ..setLastModifiedSync(modifiedTime);
 
       // touch .packages to make sure its change time is after pubspec.yaml's
-      fs.file('.packages')
+      globals.fs.file('.packages')
         ..setLastModifiedSync(modifiedTime);
 
       // Even though the previous file was removed, it is left in the
@@ -155,11 +155,11 @@
 
     // https://github.com/flutter/flutter/issues/42723
     testUsingContext('Test regression for mistyped file', () async {
-      fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true);
       // Create a directory in the same path to test that we're only looking at File
       // objects.
-      fs.directory(fs.path.join('assets', 'foo', 'bar')).createSync();
-      fs.file('pubspec.yaml')
+      globals.fs.directory(globals.fs.path.join('assets', 'foo', 'bar')).createSync();
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync(r'''
 name: example
@@ -167,7 +167,7 @@
   assets:
     - assets/foo/
 ''');
-      fs.file('.packages').createSync();
+      globals.fs.file('.packages').createSync();
       final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
       await bundle.build(manifestPath: 'pubspec.yaml');
       // Expected assets:
diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart
index 2dab3d3..dcd7627 100644
--- a/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart
+++ b/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart
@@ -9,8 +9,9 @@
 
 import 'package:flutter_tools/src/asset.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -23,14 +24,14 @@
     // fixed we fix them here.
     // TODO(dantup): Remove this function once the above issue is fixed and
     // rolls into Flutter.
-    return path?.replaceAll('/', fs.path.separator);
+    return path?.replaceAll('/', globals.fs.path.separator);
   }
 
   group('AssetBundle asset variants', () {
     FileSystem testFileSystem;
     setUp(() async {
       testFileSystem = MemoryFileSystem(
-        style: platform.isWindows
+        style: globals.platform.isWindows
           ? FileSystemStyle.windows
           : FileSystemStyle.posix,
       );
@@ -41,9 +42,9 @@
       // Setting flutterRoot here so that it picks up the MemoryFileSystem's
       // path separator.
       Cache.flutterRoot = getFlutterRoot();
-      writeEmptySchemaFile(fs);
+      writeEmptySchemaFile(globals.fs);
 
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync(
 '''
@@ -56,7 +57,7 @@
     - a/b/c/foo
 '''
       );
-      fs.file('.packages')..createSync();
+      globals.fs.file('.packages')..createSync();
 
       final List<String> assets = <String>[
         'a/b/c/foo',
@@ -65,7 +66,7 @@
         'a/b/c/var3/foo',
       ];
       for (String asset in assets) {
-        fs.file(fixPath(asset))
+        globals.fs.file(fixPath(asset))
           ..createSync(recursive: true)
           ..writeAsStringSync(asset);
       }
@@ -79,7 +80,7 @@
         expect(utf8.decode(await bundle.entries[asset].contentsAsBytes()), asset);
       }
 
-      fs.file(fixPath('a/b/c/foo')).deleteSync();
+      globals.fs.file(fixPath('a/b/c/foo')).deleteSync();
       bundle = AssetBundleFactory.instance.createBundle();
       await bundle.build(manifestPath: 'pubspec.yaml');
 
diff --git a/packages/flutter_tools/test/general.shard/asset_test.dart b/packages/flutter_tools/test/general.shard/asset_test.dart
index 25cc64e..73e0a46 100644
--- a/packages/flutter_tools/test/general.shard/asset_test.dart
+++ b/packages/flutter_tools/test/general.shard/asset_test.dart
@@ -5,15 +5,15 @@
 import 'dart:async';
 
 import 'package:flutter_tools/src/asset.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/context.dart';
 
 void main() {
   group('Assets', () {
-    final String dataPath = fs.path.join(
+    final String dataPath = globals.fs.path.join(
       getFlutterRoot(),
       'packages',
       'flutter_tools',
@@ -31,8 +31,8 @@
     testUsingContext('app font uses local font file', () async {
       final AssetBundle asset = AssetBundleFactory.instance.createBundle();
       await asset.build(
-        manifestPath : fs.path.join(dataPath, 'main', 'pubspec.yaml'),
-        packagesPath: fs.path.join(dataPath, 'main', '.packages'),
+        manifestPath : globals.fs.path.join(dataPath, 'main', 'pubspec.yaml'),
+        packagesPath: globals.fs.path.join(dataPath, 'main', '.packages'),
         includeDefaultFonts: false,
       );
 
@@ -45,7 +45,7 @@
     });
 
     testUsingContext('handles empty pubspec with .packages', () async {
-      final String dataPath = fs.path.join(
+      final String dataPath = globals.fs.path.join(
         getFlutterRoot(),
         'packages',
         'flutter_tools',
@@ -55,8 +55,8 @@
       );
       final AssetBundle asset = AssetBundleFactory.instance.createBundle();
       await asset.build(
-        manifestPath : fs.path.join(dataPath, 'main', 'pubspec.yaml'), // file doesn't exist
-        packagesPath: fs.path.join(dataPath, 'main', '.packages'),
+        manifestPath : globals.fs.path.join(dataPath, 'main', 'pubspec.yaml'), // file doesn't exist
+        packagesPath: globals.fs.path.join(dataPath, 'main', '.packages'),
         includeDefaultFonts: false,
       );
       expect(asset.wasBuiltOnce(), true);
diff --git a/packages/flutter_tools/test/general.shard/base/build_test.dart b/packages/flutter_tools/test/general.shard/base/build_test.dart
index ecea2c3..62c4c18 100644
--- a/packages/flutter_tools/test/general.shard/base/build_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/build_test.dart
@@ -17,6 +17,7 @@
 import 'package:flutter_tools/src/base/process.dart';
 import 'package:flutter_tools/src/macos/xcode.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -66,7 +67,7 @@
       return 1;
     }
     outputs.forEach((String filePath, String fileContent) {
-      fs.file(filePath).writeAsString(fileContent);
+      globals.fs.file(filePath).writeAsString(fileContent);
     });
     return 0;
   }
@@ -264,7 +265,7 @@
     };
 
     testUsingContext('iOS debug AOT snapshot is invalid', () async {
-      final String outputPath = fs.path.join('build', 'foo');
+      final String outputPath = globals.fs.path.join('build', 'foo');
       expect(await snapshotter.build(
         platform: TargetPlatform.ios,
         buildMode: BuildMode.debug,
@@ -276,7 +277,7 @@
     }, overrides: contextOverrides);
 
     testUsingContext('Android arm debug AOT snapshot is invalid', () async {
-      final String outputPath = fs.path.join('build', 'foo');
+      final String outputPath = globals.fs.path.join('build', 'foo');
       expect(await snapshotter.build(
         platform: TargetPlatform.android_arm,
         buildMode: BuildMode.debug,
@@ -288,7 +289,7 @@
     }, overrides: contextOverrides);
 
     testUsingContext('Android arm64 debug AOT snapshot is invalid', () async {
-      final String outputPath = fs.path.join('build', 'foo');
+      final String outputPath = globals.fs.path.join('build', 'foo');
       expect(await snapshotter.build(
         platform: TargetPlatform.android_arm64,
         buildMode: BuildMode.debug,
@@ -300,12 +301,12 @@
     }, overrides: contextOverrides);
 
     testUsingContext('iOS profile AOT with bitcode uses right flags', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
-      final String assembly = fs.path.join(outputPath, 'snapshot_assembly.S');
+      final String assembly = globals.fs.path.join(outputPath, 'snapshot_assembly.S');
       genSnapshot.outputs = <String, String>{
         assembly: 'blah blah\n.section __DWARF\nblah blah\n',
       };
@@ -351,18 +352,18 @@
       expect(clangArgs, contains('-isysroot'));
       expect(clangArgs, contains(kSDKPath));
 
-      final File assemblyFile = fs.file(assembly);
+      final File assemblyFile = globals.fs.file(assembly);
       expect(assemblyFile.existsSync(), true);
       expect(assemblyFile.readAsStringSync().contains('.section __DWARF'), true);
     }, overrides: contextOverrides);
 
     testUsingContext('iOS release AOT with bitcode uses right flags', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
-      final String assembly = fs.path.join(outputPath, 'snapshot_assembly.S');
+      final String assembly = globals.fs.path.join(outputPath, 'snapshot_assembly.S');
       genSnapshot.outputs = <String, String>{
         assembly: 'blah blah\n.section __DWARF\nblah blah\n',
       };
@@ -408,8 +409,8 @@
       expect(clangArgs, contains('-isysroot'));
       expect(clangArgs, contains(kSDKPath));
 
-      final File assemblyFile = fs.file(assembly);
-      final File assemblyBitcodeFile = fs.file('$assembly.stripped.S');
+      final File assemblyFile = globals.fs.file(assembly);
+      final File assemblyBitcodeFile = globals.fs.file('$assembly.stripped.S');
       expect(assemblyFile.existsSync(), true);
       expect(assemblyBitcodeFile.existsSync(), true);
       expect(assemblyFile.readAsStringSync().contains('.section __DWARF'), true);
@@ -417,12 +418,12 @@
     }, overrides: contextOverrides);
 
     testUsingContext('builds iOS armv7 profile AOT snapshot', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
-      final String assembly = fs.path.join(outputPath, 'snapshot_assembly.S');
+      final String assembly = globals.fs.path.join(outputPath, 'snapshot_assembly.S');
       genSnapshot.outputs = <String, String>{
         assembly: 'blah blah\n.section __DWARF\nblah blah\n',
       };
@@ -459,19 +460,19 @@
       verify(xcode.cc(argThat(contains('-isysroot')))).called(1);
       verify(xcode.clang(argThat(contains('-isysroot')))).called(1);
 
-      final File assemblyFile = fs.file(assembly);
+      final File assemblyFile = globals.fs.file(assembly);
       expect(assemblyFile.existsSync(), true);
       expect(assemblyFile.readAsStringSync().contains('.section __DWARF'), true);
     }, overrides: contextOverrides);
 
     testUsingContext('builds iOS arm64 profile AOT snapshot', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
       genSnapshot.outputs = <String, String>{
-        fs.path.join(outputPath, 'snapshot_assembly.S'): '',
+        globals.fs.path.join(outputPath, 'snapshot_assembly.S'): '',
       };
 
       final RunResult successResult = RunResult(ProcessResult(1, 0, '', ''), <String>['command name', 'arguments...']);
@@ -495,19 +496,19 @@
       expect(genSnapshot.additionalArgs, <String>[
         '--deterministic',
         '--snapshot_kind=app-aot-assembly',
-        '--assembly=${fs.path.join(outputPath, 'snapshot_assembly.S')}',
+        '--assembly=${globals.fs.path.join(outputPath, 'snapshot_assembly.S')}',
         'main.dill',
       ]);
     }, overrides: contextOverrides);
 
     testUsingContext('builds iOS release armv7 AOT snapshot', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
       genSnapshot.outputs = <String, String>{
-        fs.path.join(outputPath, 'snapshot_assembly.S'): '',
+        globals.fs.path.join(outputPath, 'snapshot_assembly.S'): '',
       };
 
       final RunResult successResult = RunResult(ProcessResult(1, 0, '', ''), <String>['command name', 'arguments...']);
@@ -531,7 +532,7 @@
       expect(genSnapshot.additionalArgs, <String>[
         '--deterministic',
         '--snapshot_kind=app-aot-assembly',
-        '--assembly=${fs.path.join(outputPath, 'snapshot_assembly.S')}',
+        '--assembly=${globals.fs.path.join(outputPath, 'snapshot_assembly.S')}',
         '--no-sim-use-hardfp',
         '--no-use-integer-division',
         'main.dill',
@@ -539,13 +540,13 @@
     }, overrides: contextOverrides);
 
     testUsingContext('builds iOS release arm64 AOT snapshot', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
       genSnapshot.outputs = <String, String>{
-        fs.path.join(outputPath, 'snapshot_assembly.S'): '',
+        globals.fs.path.join(outputPath, 'snapshot_assembly.S'): '',
       };
 
       final RunResult successResult = RunResult(ProcessResult(1, 0, '', ''), <String>['command name', 'arguments...']);
@@ -569,16 +570,16 @@
       expect(genSnapshot.additionalArgs, <String>[
         '--deterministic',
         '--snapshot_kind=app-aot-assembly',
-        '--assembly=${fs.path.join(outputPath, 'snapshot_assembly.S')}',
+        '--assembly=${globals.fs.path.join(outputPath, 'snapshot_assembly.S')}',
         'main.dill',
       ]);
     }, overrides: contextOverrides);
 
     testUsingContext('builds shared library for android-arm', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
       final int genSnapshotExitCode = await snapshotter.build(
         platform: TargetPlatform.android_arm,
@@ -605,10 +606,10 @@
     }, overrides: contextOverrides);
 
     testUsingContext('builds shared library for android-arm64', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
       final int genSnapshotExitCode = await snapshotter.build(
         platform: TargetPlatform.android_arm64,
@@ -633,13 +634,13 @@
     }, overrides: contextOverrides);
 
     testUsingContext('reports timing', () async {
-      fs.file('main.dill').writeAsStringSync('binary magic');
+      globals.fs.file('main.dill').writeAsStringSync('binary magic');
 
-      final String outputPath = fs.path.join('build', 'foo');
-      fs.directory(outputPath).createSync(recursive: true);
+      final String outputPath = globals.fs.path.join('build', 'foo');
+      globals.fs.directory(outputPath).createSync(recursive: true);
 
       genSnapshot.outputs = <String, String>{
-        fs.path.join(outputPath, 'app.so'): '',
+        globals.fs.path.join(outputPath, 'app.so'): '',
       };
 
       final RunResult successResult = RunResult(ProcessResult(1, 0, '', ''), <String>['command name', 'arguments...']);
diff --git a/packages/flutter_tools/test/general.shard/base/file_system_test.dart b/packages/flutter_tools/test/general.shard/base/file_system_test.dart
index 96bd310..2cb94fd 100644
--- a/packages/flutter_tools/test/general.shard/base/file_system_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/file_system_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
@@ -66,14 +67,14 @@
     });
 
     testUsingContext('Skip files if shouldCopyFile returns false', () {
-      final Directory origin = fs.directory('/origin');
+      final Directory origin = globals.fs.directory('/origin');
       origin.createSync();
-      fs.file(fs.path.join('origin', 'a.txt')).writeAsStringSync('irrelevant');
-      fs.directory('/origin/nested').createSync();
-      fs.file(fs.path.join('origin', 'nested', 'a.txt')).writeAsStringSync('irrelevant');
-      fs.file(fs.path.join('origin', 'nested', 'b.txt')).writeAsStringSync('irrelevant');
+      globals.fs.file(globals.fs.path.join('origin', 'a.txt')).writeAsStringSync('irrelevant');
+      globals.fs.directory('/origin/nested').createSync();
+      globals.fs.file(globals.fs.path.join('origin', 'nested', 'a.txt')).writeAsStringSync('irrelevant');
+      globals.fs.file(globals.fs.path.join('origin', 'nested', 'b.txt')).writeAsStringSync('irrelevant');
 
-      final Directory destination = fs.directory('/destination');
+      final Directory destination = globals.fs.directory('/destination');
       copyDirectorySync(origin, destination, shouldCopyFile: (File origin, File dest) {
         return origin.basename == 'b.txt';
       });
@@ -94,24 +95,24 @@
     test('does not lowercase on Windows', () {
       String path = 'C:\\Foo\\bAr\\cOOL.dart';
       expect(canonicalizePath(path), path);
-      // fs.path.canonicalize does lowercase on Windows
-      expect(fs.path.canonicalize(path), isNot(path));
+      // globals.fs.path.canonicalize does lowercase on Windows
+      expect(globals.fs.path.canonicalize(path), isNot(path));
 
       path = '..\\bar\\.\\\\Foo';
-      final String expected = fs.path.join(fs.currentDirectory.parent.absolute.path, 'bar', 'Foo');
+      final String expected = globals.fs.path.join(globals.fs.currentDirectory.parent.absolute.path, 'bar', 'Foo');
       expect(canonicalizePath(path), expected);
-      // fs.path.canonicalize should return the same result (modulo casing)
-      expect(fs.path.canonicalize(path), expected.toLowerCase());
+      // globals.fs.path.canonicalize should return the same result (modulo casing)
+      expect(globals.fs.path.canonicalize(path), expected.toLowerCase());
     }, testOn: 'windows');
 
     test('does not lowercase on posix', () {
       String path = '/Foo/bAr/cOOL.dart';
       expect(canonicalizePath(path), path);
-      // fs.path.canonicalize and canonicalizePath should be the same on Posix
-      expect(fs.path.canonicalize(path), path);
+      // globals.fs.path.canonicalize and canonicalizePath should be the same on Posix
+      expect(globals.fs.path.canonicalize(path), path);
 
       path = '../bar/.//Foo';
-      final String expected = fs.path.join(fs.currentDirectory.parent.absolute.path, 'bar', 'Foo');
+      final String expected = globals.fs.path.join(globals.fs.currentDirectory.parent.absolute.path, 'bar', 'Foo');
       expect(canonicalizePath(path), expected);
     }, testOn: 'posix');
   });
diff --git a/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart b/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart
index c83e5ca..f57c970 100644
--- a/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart
@@ -5,12 +5,13 @@
 import 'dart:convert' show json;
 
 import 'package:file/memory.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/base/utils.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/fingerprint.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../../src/common.dart';
@@ -35,9 +36,9 @@
     };
 
     testUsingContext('throws when depfile is malformed', () {
-      fs.file('a.dart').createSync();
-      fs.file('b.dart').createSync();
-      fs.file('depfile').createSync();
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('b.dart').createSync();
+      globals.fs.file('depfile').createSync();
 
       final Fingerprinter fingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -52,7 +53,7 @@
     }, overrides: contextOverrides);
 
     testUsingContext('creates fingerprint with specified properties and files', () {
-      fs.file('a.dart').createSync();
+      globals.fs.file('a.dart').createSync();
 
       final Fingerprinter fingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -70,9 +71,9 @@
     }, overrides: contextOverrides);
 
     testUsingContext('creates fingerprint with file checksums', () {
-      fs.file('a.dart').createSync();
-      fs.file('b.dart').createSync();
-      fs.file('depfile').writeAsStringSync('depfile : b.dart');
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('b.dart').createSync();
+      globals.fs.file('depfile').writeAsStringSync('depfile : b.dart');
 
       final Fingerprinter fingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -91,8 +92,8 @@
     }, overrides: contextOverrides);
 
     testUsingContext('fingerprint does not match if not present', () {
-      fs.file('a.dart').createSync();
-      fs.file('b.dart').createSync();
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('b.dart').createSync();
 
       final Fingerprinter fingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -106,8 +107,8 @@
     }, overrides: contextOverrides);
 
     testUsingContext('fingerprint does match if different', () {
-      fs.file('a.dart').createSync();
-      fs.file('b.dart').createSync();
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('b.dart').createSync();
 
       final Fingerprinter fingerprinter1 = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -131,9 +132,9 @@
     }, overrides: contextOverrides);
 
     testUsingContext('fingerprint does not match if depfile is malformed', () {
-      fs.file('a.dart').createSync();
-      fs.file('b.dart').createSync();
-      fs.file('depfile').writeAsStringSync('depfile : b.dart');
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('b.dart').createSync();
+      globals.fs.file('depfile').writeAsStringSync('depfile : b.dart');
 
       // Write a valid fingerprint
       final Fingerprinter fingerprinter = Fingerprinter(
@@ -148,7 +149,7 @@
       fingerprinter.writeFingerprint();
 
       // Write a corrupt depfile.
-      fs.file('depfile').writeAsStringSync('');
+      globals.fs.file('depfile').writeAsStringSync('');
       final Fingerprinter badFingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
         paths: <String>['a.dart', 'b.dart'],
@@ -163,9 +164,9 @@
     }, overrides: contextOverrides);
 
     testUsingContext('fingerprint does not match if previous fingerprint is malformed', () {
-      fs.file('a.dart').createSync();
-      fs.file('b.dart').createSync();
-      fs.file('out.fingerprint').writeAsStringSync('** not JSON **');
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('b.dart').createSync();
+      globals.fs.file('out.fingerprint').writeAsStringSync('** not JSON **');
 
       final Fingerprinter fingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -180,8 +181,8 @@
     }, overrides: contextOverrides);
 
     testUsingContext('fingerprint does match if identical', () {
-      fs.file('a.dart').createSync();
-      fs.file('b.dart').createSync();
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('b.dart').createSync();
 
       final Fingerprinter fingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -205,13 +206,13 @@
         },
       );
       fingerprinter.writeFingerprint();
-      expect(fs.file('out.fingerprint').existsSync(), isFalse);
+      expect(globals.fs.file('out.fingerprint').existsSync(), isFalse);
     }, overrides: contextOverrides);
 
     testUsingContext('applies path filter to inputs paths', () {
-      fs.file('a.dart').createSync();
-      fs.file('ab.dart').createSync();
-      fs.file('depfile').writeAsStringSync('depfile : ab.dart c.dart');
+      globals.fs.file('a.dart').createSync();
+      globals.fs.file('ab.dart').createSync();
+      globals.fs.file('depfile').writeAsStringSync('depfile : ab.dart c.dart');
 
       final Fingerprinter fingerprinter = Fingerprinter(
         fingerprintPath: 'out.fingerprint',
@@ -224,7 +225,7 @@
         pathFilter: (String path) => path.startsWith('a'),
       );
       fingerprinter.writeFingerprint();
-      expect(fs.file('out.fingerprint').existsSync(), isTrue);
+      expect(globals.fs.file('out.fingerprint').existsSync(), isTrue);
     }, overrides: contextOverrides);
   });
 
@@ -245,7 +246,7 @@
       });
 
       testUsingContext('throws if any input file does not exist', () {
-        fs.file('a.dart').createSync();
+        globals.fs.file('a.dart').createSync();
         expect(
           () => Fingerprint.fromBuildInputs(<String, String>{}, <String>['a.dart', 'b.dart']),
           throwsArgumentError,
@@ -256,8 +257,8 @@
       });
 
       testUsingContext('populates checksums for valid files', () {
-        fs.file('a.dart').writeAsStringSync('This is a');
-        fs.file('b.dart').writeAsStringSync('This is b');
+        globals.fs.file('a.dart').writeAsStringSync('This is a');
+        globals.fs.file('b.dart').writeAsStringSync('This is b');
         final Fingerprint fingerprint = Fingerprint.fromBuildInputs(<String, String>{}, <String>['a.dart', 'b.dart']);
 
         final Map<String, dynamic> jsonObject = castStringKeyedMap(json.decode(fingerprint.toJson()));
@@ -452,12 +453,12 @@
     };
 
     testUsingContext('returns one file if only one is listed', () {
-      fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart');
+      globals.fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart');
       expect(readDepfile('a.d'), unorderedEquals(<String>['/foo/a.dart']));
     }, overrides: contextOverrides);
 
     testUsingContext('returns multiple files', () {
-      fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart /foo/b.dart');
+      globals.fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart /foo/b.dart');
       expect(readDepfile('a.d'), unorderedEquals(<String>[
         '/foo/a.dart',
         '/foo/b.dart',
@@ -465,7 +466,7 @@
     }, overrides: contextOverrides);
 
     testUsingContext('trims extra spaces between files', () {
-      fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart    /foo/b.dart  /foo/c.dart');
+      globals.fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart    /foo/b.dart  /foo/c.dart');
       expect(readDepfile('a.d'), unorderedEquals(<String>[
         '/foo/a.dart',
         '/foo/b.dart',
@@ -474,7 +475,7 @@
     }, overrides: contextOverrides);
 
     testUsingContext('returns files with spaces and backslashes', () {
-      fs.file('a.d').writeAsStringSync(r'snapshot.d: /foo/a\ a.dart /foo/b\\b.dart /foo/c\\ c.dart');
+      globals.fs.file('a.d').writeAsStringSync(r'snapshot.d: /foo/a\ a.dart /foo/b\\b.dart /foo/c\\ c.dart');
       expect(readDepfile('a.d'), unorderedEquals(<String>[
         r'/foo/a a.dart',
         r'/foo/b\b.dart',
diff --git a/packages/flutter_tools/test/general.shard/base/logger_test.dart b/packages/flutter_tools/test/general.shard/base/logger_test.dart
index e9caf38..b30772b 100644
--- a/packages/flutter_tools/test/general.shard/base/logger_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/logger_test.dart
@@ -4,11 +4,12 @@
 
 import 'dart:convert' show jsonEncode;
 
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:quiver/testing/async.dart';
 
 import '../../src/common.dart';
@@ -113,7 +114,7 @@
           doWhileAsync(time, () => ansiSpinner.ticks < 10);
           List<String> lines = outputStdout();
           expect(lines[0], startsWith(
-            platform.isWindows
+            globals.platform.isWindows
               ? ' \b\\\b|\b/\b-\b\\\b|\b/\b-'
               : ' \b⣽\b⣻\b⢿\b⡿\b⣟\b⣯\b⣷\b⣾\b⣽\b⣻'
             ),
@@ -181,10 +182,10 @@
           expect(outputStderr().length, equals(1));
           expect(outputStderr().first, isEmpty);
           // the 5 below is the margin that is always included between the message and the time.
-          expect(outputStdout().join('\n'), matches(platform.isWindows ? r'^Hello {15} {5} {8}[\b]{8} {7}\\$' :
+          expect(outputStdout().join('\n'), matches(globals.platform.isWindows ? r'^Hello {15} {5} {8}[\b]{8} {7}\\$' :
                                                                          r'^Hello {15} {5} {8}[\b]{8} {7}⣽$'));
           status.stop();
-          expect(outputStdout().join('\n'), matches(platform.isWindows ? r'^Hello {15} {5} {8}[\b]{8} {7}\\[\b]{8} {8}[\b]{8}[\d, ]{4}[\d]\.[\d]s[\n]$' :
+          expect(outputStdout().join('\n'), matches(globals.platform.isWindows ? r'^Hello {15} {5} {8}[\b]{8} {7}\\[\b]{8} {8}[\b]{8}[\d, ]{4}[\d]\.[\d]s[\n]$' :
                                                                          r'^Hello {15} {5} {8}[\b]{8} {7}⣽[\b]{8} {8}[\b]{8}[\d, ]{4}[\d]\.[\d]s[\n]$'));
           done = true;
         });
@@ -208,8 +209,8 @@
           );
           logger.printStatus('Rude Interrupting Cow');
           status.stop();
-          final String a = platform.isWindows ? '\\' : '⣽';
-          final String b = platform.isWindows ? '|' : '⣻';
+          final String a = globals.platform.isWindows ? '\\' : '⣽';
+          final String b = globals.platform.isWindows ? '|' : '⣻';
           expect(
             outputStdout().join('\n'),
             'Knock Knock, Who\'s There     ' // initial message
@@ -281,7 +282,7 @@
           mockStopwatch.elapsed = const Duration(seconds: 1);
           doWhileAsync(time, () => ansiStatus.ticks < 10);
           List<String> lines = outputStdout();
-          expect(lines[0], startsWith(platform.isWindows
+          expect(lines[0], startsWith(globals.platform.isWindows
               ? 'Hello world                      \b\b\b\b\b\b\b\b       \\\b\b\b\b\b\b\b\b       |\b\b\b\b\b\b\b\b       /\b\b\b\b\b\b\b\b       -\b\b\b\b\b\b\b\b       \\\b\b\b\b\b\b\b\b       |\b\b\b\b\b\b\b\b       /\b\b\b\b\b\b\b\b       -\b\b\b\b\b\b\b\b       \\\b\b\b\b\b\b\b\b       |'
               : 'Hello world                      \b\b\b\b\b\b\b\b       ⣽\b\b\b\b\b\b\b\b       ⣻\b\b\b\b\b\b\b\b       ⢿\b\b\b\b\b\b\b\b       ⡿\b\b\b\b\b\b\b\b       ⣟\b\b\b\b\b\b\b\b       ⣯\b\b\b\b\b\b\b\b       ⣷\b\b\b\b\b\b\b\b       ⣾\b\b\b\b\b\b\b\b       ⣽\b\b\b\b\b\b\b\b       ⣻'));
           expect(lines.length, equals(1));
@@ -292,7 +293,7 @@
           lines = outputStdout();
           final List<Match> matches = secondDigits.allMatches(lines[0]).toList();
           expect(matches, isEmpty);
-          final String x = platform.isWindows ? '|' : '⣻';
+          final String x = globals.platform.isWindows ? '|' : '⣻';
           expect(lines[0], endsWith('$x\b\b\b\b\b\b\b\b        \b\b\b\b\b\b\b\b'));
           expect(called, equals(1));
           expect(lines.length, equals(2));
@@ -320,7 +321,7 @@
           List<String> lines = outputStdout();
           expect(lines, hasLength(1));
           expect(lines[0],
-            platform.isWindows
+            globals.platform.isWindows
               ? 'Hello world                      \b\b\b\b\b\b\b\b       \\\b\b\b\b\b\b\b\b       |\b\b\b\b\b\b\b\b       /\b\b\b\b\b\b\b\b       -\b\b\b\b\b\b\b\b       \\\b\b\b\b\b\b\b\b       |\b\b\b\b\b\b\b\b       /\b\b\b\b\b\b\b\b       -\b\b\b\b\b\b\b\b       \\\b\b\b\b\b\b\b\b       |'
               : 'Hello world                      \b\b\b\b\b\b\b\b       ⣽\b\b\b\b\b\b\b\b       ⣻\b\b\b\b\b\b\b\b       ⢿\b\b\b\b\b\b\b\b       ⡿\b\b\b\b\b\b\b\b       ⣟\b\b\b\b\b\b\b\b       ⣯\b\b\b\b\b\b\b\b       ⣷\b\b\b\b\b\b\b\b       ⣾\b\b\b\b\b\b\b\b       ⣽\b\b\b\b\b\b\b\b       ⣻',
           );
@@ -330,7 +331,7 @@
           lines = outputStdout();
           expect(lines, hasLength(2));
           expect(lines[0], matches(
-            platform.isWindows
+            globals.platform.isWindows
               ? r'Hello world               {8}[\b]{8} {7}\\[\b]{8} {7}|[\b]{8} {7}/[\b]{8} {7}-[\b]{8} {7}\\[\b]{8} {7}|[\b]{8} {7}/[\b]{8} {7}-[\b]{8} {7}\\[\b]{8} {7}|[\b]{8} {7} [\b]{8}[\d., ]{6}[\d]ms$'
               : r'Hello world               {8}[\b]{8} {7}⣽[\b]{8} {7}⣻[\b]{8} {7}⢿[\b]{8} {7}⡿[\b]{8} {7}⣟[\b]{8} {7}⣯[\b]{8} {7}⣷[\b]{8} {7}⣾[\b]{8} {7}⣽[\b]{8} {7}⣻[\b]{8} {7} [\b]{8}[\d., ]{5}[\d]ms$'
           ));
@@ -610,10 +611,10 @@
         expect(outputStderr().length, equals(1));
         expect(outputStderr().first, isEmpty);
         // the 5 below is the margin that is always included between the message and the time.
-        expect(outputStdout().join('\n'), matches(platform.isWindows ? r'^Hello {15} {5}$' :
+        expect(outputStdout().join('\n'), matches(globals.platform.isWindows ? r'^Hello {15} {5}$' :
                                                                        r'^Hello {15} {5}$'));
         status.stop();
-        expect(outputStdout().join('\n'), matches(platform.isWindows ? r'^Hello {15} {5}[\d, ]{4}[\d]\.[\d]s[\n]$' :
+        expect(outputStdout().join('\n'), matches(globals.platform.isWindows ? r'^Hello {15} {5}[\d, ]{4}[\d]\.[\d]s[\n]$' :
                                                                        r'^Hello {15} {5}[\d, ]{4}[\d]\.[\d]s[\n]$'));
         done = true;
       });
diff --git a/packages/flutter_tools/test/general.shard/base/net_test.dart b/packages/flutter_tools/test/general.shard/base/net_test.dart
index 8a20822..7f4e78f 100644
--- a/packages/flutter_tools/test/general.shard/base/net_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/net_test.dart
@@ -7,10 +7,12 @@
 
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart' as io;
 import 'package:flutter_tools/src/base/net.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:quiver/testing/async.dart';
 
 import '../../src/common.dart';
@@ -33,7 +35,7 @@
     });
 
     testUsingContext('fetchUrl(destFile) writes the data to a file', () async {
-      final File destFile = fs.file('dest_file')..createSync();
+      final File destFile = globals.fs.file('dest_file')..createSync();
       final List<int> data = await fetchUrl(
         Uri.parse('http://example.invalid/'),
         destFile: destFile,
diff --git a/packages/flutter_tools/test/general.shard/base/os_utils_test.dart b/packages/flutter_tools/test/general.shard/base/os_utils_test.dart
index 8a6d983..9c407d5 100644
--- a/packages/flutter_tools/test/general.shard/base/os_utils_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/os_utils_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/os.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -14,7 +14,7 @@
     Directory tempDir;
 
     setUp(() {
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_os_utils_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_os_utils_test.');
     });
 
     tearDown(() {
@@ -22,12 +22,12 @@
     });
 
     testUsingContext('makeExecutable', () async {
-      final File file = fs.file(fs.path.join(tempDir.path, 'foo.script'));
+      final File file = globals.fs.file(globals.fs.path.join(tempDir.path, 'foo.script'));
       file.writeAsStringSync('hello world');
       os.makeExecutable(file);
 
       // Skip this test on windows.
-      if (!platform.isWindows) {
+      if (!globals.platform.isWindows) {
         final String mode = file.statSync().modeString();
         // rwxr--r--
         expect(mode.substring(0, 3), endsWith('x'));
diff --git a/packages/flutter_tools/test/general.shard/base/process_test.dart b/packages/flutter_tools/test/general.shard/base/process_test.dart
index f415ffe..bc4383c 100644
--- a/packages/flutter_tools/test/general.shard/base/process_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/process_test.dart
@@ -4,9 +4,9 @@
 
 import 'dart:async';
 
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/process.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:mockito/mockito.dart';
diff --git a/packages/flutter_tools/test/general.shard/base/terminal_test.dart b/packages/flutter_tools/test/general.shard/base/terminal_test.dart
index 99af7fa..f6bc675 100644
--- a/packages/flutter_tools/test/general.shard/base/terminal_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/terminal_test.dart
@@ -4,10 +4,10 @@
 
 import 'dart:async';
 
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../../src/common.dart';
@@ -16,7 +16,7 @@
 void main() {
   group('output preferences', () {
     testUsingContext('can wrap output', () async {
-      printStatus('0123456789' * 8);
+      globals.printStatus('0123456789' * 8);
       expect(testLogger.statusText, equals(('0123456789' * 4 + '\n') * 2));
     }, overrides: <Type, Generator>{
       OutputPreferences: () => OutputPreferences(wrapText: true, wrapColumn: 40),
@@ -24,7 +24,7 @@
 
     testUsingContext('can turn off wrapping', () async {
       final String testString = '0123456789' * 20;
-      printStatus(testString);
+      globals.printStatus(testString);
       expect(testLogger.statusText, equals('$testString\n'));
     }, overrides: <Type, Generator>{
       Platform: () => FakePlatform()..stdoutSupportsAnsi = true,
@@ -174,7 +174,7 @@
       when(stdio.stdin).thenThrow(StateError('This should not be called'));
       when(stdio.stdinHasTerminal).thenReturn(false);
 
-      terminal.singleCharMode = true;
+      globals.terminal.singleCharMode = true;
     }, overrides: <Type, Generator>{
       Stdio: () => MockStdio(),
     });
diff --git a/packages/flutter_tools/test/general.shard/base/utils_test.dart b/packages/flutter_tools/test/general.shard/base/utils_test.dart
index d5287a2..c4e5f1d 100644
--- a/packages/flutter_tools/test/general.shard/base/utils_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/utils_test.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/base/utils.dart';
 import 'package:platform/platform.dart';
 
diff --git a/packages/flutter_tools/test/general.shard/build_runner/multiroot_asset_reader_test.dart b/packages/flutter_tools/test/general.shard/build_runner/multiroot_asset_reader_test.dart
index 8bbf230..adeba5c 100644
--- a/packages/flutter_tools/test/general.shard/build_runner/multiroot_asset_reader_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_runner/multiroot_asset_reader_test.dart
@@ -7,8 +7,8 @@
 
 import 'package:build/build.dart';
 import 'package:build_runner_core/build_runner_core.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_runner/web_compilation_delegate.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:glob/glob.dart';
 
 import '../../src/common.dart';
@@ -22,15 +22,15 @@
 
     setUp(() {
       testbed = Testbed(setup: () {
-        final PackageNode root = PackageNode('foobar', fs.currentDirectory.path, DependencyType.path);
+        final PackageNode root = PackageNode('foobar', globals.fs.currentDirectory.path, DependencyType.path);
         packageGraph = FakePackageGraph(root, <String, PackageNode>{'foobar': root});
-        fs.file(fs.path.join('lib', 'main.dart'))
+        globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
           ..createSync(recursive: true)
           ..writeAsStringSync('main');
-        fs.file(fs.path.join('.dart_tool', 'build', 'generated', 'foobar', 'lib', 'bar.dart'))
+        globals.fs.file(globals.fs.path.join('.dart_tool', 'build', 'generated', 'foobar', 'lib', 'bar.dart'))
           ..createSync(recursive: true)
           ..writeAsStringSync('bar');
-        fs.file('pubspec.yaml')
+        globals.fs.file('pubspec.yaml')
           ..createSync()
           ..writeAsStringSync('name: foobar');
       });
@@ -40,7 +40,7 @@
       await IOOverrides.runWithIOOverrides(() async {
         final MultirootFileBasedAssetReader reader = MultirootFileBasedAssetReader(
           packageGraph,
-          fs.directory(fs.path.join('.dart_tool', 'build', 'generated')),
+          globals.fs.directory(globals.fs.path.join('.dart_tool', 'build', 'generated')),
         );
         expect(await reader.canRead(AssetId('foobar', 'lib/bar.dart')), true);
         expect(await reader.canRead(AssetId('foobar', 'lib/main.dart')), true);
@@ -56,7 +56,7 @@
           AssetId('foobar', 'lib/bar.dart'),
           AssetId('foobar', 'lib/main.dart'),
         ]));
-      }, FlutterIOOverrides(fileSystem: fs));
+      }, FlutterIOOverrides(fileSystem: globals.fs));
      // Some component of either dart:io or build_runner normalizes file uris
      // into file paths for windows. This doesn't seem to work with IOOverrides
      // leaving all filepaths on windows with forward slashes.
diff --git a/packages/flutter_tools/test/general.shard/build_system/build_system_test.dart b/packages/flutter_tools/test/general.shard/build_system/build_system_test.dart
index f1535a3..a3277a7 100644
--- a/packages/flutter_tools/test/general.shard/build_system/build_system_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/build_system_test.dart
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/utils.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/exceptions.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/convert.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../../src/common.dart';
@@ -93,13 +94,13 @@
     testbed = Testbed(
       setup: () {
         environment = Environment(
-          outputDir: fs.currentDirectory,
-          projectDir: fs.currentDirectory,
+          outputDir: globals.fs.currentDirectory,
+          projectDir: globals.fs.currentDirectory,
         );
-        fs.file('foo.dart')
+        globals.fs.file('foo.dart')
           ..createSync(recursive: true)
           ..writeAsStringSync('');
-        fs.file('pubspec.yaml').createSync();
+        globals.fs.file('pubspec.yaml').createSync();
       },
       overrides: <Type, Generator>{
         Platform: () => mockPlatform,
@@ -109,7 +110,7 @@
 
   test('Does not throw exception if asked to build with missing inputs', () => testbed.run(() async {
     // Delete required input file.
-    fs.file('foo.dart').deleteSync();
+    globals.fs.file('foo.dart').deleteSync();
     final BuildResult buildResult = await buildSystem.build(fooTarget, environment);
 
     expect(buildResult.hasException, false);
@@ -131,7 +132,7 @@
   test('Saves a stamp file with inputs and outputs', () => testbed.run(() async {
     await buildSystem.build(fooTarget, environment);
 
-    final File stampFile = fs.file(fs.path.join(environment.buildDir.path, 'foo.stamp'));
+    final File stampFile = globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'foo.stamp'));
     expect(stampFile.existsSync(), true);
 
     final Map<String, dynamic> stampContents = castStringKeyedMap(json.decode(stampFile.readAsStringSync()));
@@ -141,9 +142,9 @@
   test('Creates a BuildResult with inputs and outputs', () => testbed.run(() async {
     final BuildResult result = await buildSystem.build(fooTarget, environment);
 
-    expect(result.inputFiles.single.path, fs.path.absolute('foo.dart'));
+    expect(result.inputFiles.single.path, globals.fs.path.absolute('foo.dart'));
     expect(result.outputFiles.single.path,
-        fs.path.absolute(fs.path.join(environment.buildDir.path, 'out')));
+        globals.fs.path.absolute(globals.fs.path.join(environment.buildDir.path, 'out')));
   }));
 
   test('Does not re-invoke build if stamp is valid', () => testbed.run(() async {
@@ -156,7 +157,7 @@
   test('Re-invoke build if input is modified', () => testbed.run(() async {
     await buildSystem.build(fooTarget, environment);
 
-    fs.file('foo.dart').writeAsStringSync('new contents');
+    globals.fs.file('foo.dart').writeAsStringSync('new contents');
 
     await buildSystem.build(fooTarget, environment);
     expect(fooInvocations, 2);
@@ -165,7 +166,7 @@
   test('does not re-invoke build if input timestamp changes', () => testbed.run(() async {
     await buildSystem.build(fooTarget, environment);
 
-    fs.file('foo.dart').writeAsStringSync('');
+    globals.fs.file('foo.dart').writeAsStringSync('');
 
     await buildSystem.build(fooTarget, environment);
     expect(fooInvocations, 1);
@@ -195,7 +196,7 @@
 
     await buildSystem.build(barTarget, environment);
 
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'bar')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'bar')).existsSync(), true);
     expect(fooInvocations, 1);
     expect(barInvocations, 1);
   }));
@@ -216,7 +217,7 @@
     })
       ..inputs = const <Source>[Source.pattern('{PROJECT_DIR}/foo.dart')]
       ..outputs = const <Source>[Source.pattern('{BUILD_DIR}/foo.out')];
-    fs.file('foo.dart').createSync();
+    globals.fs.file('foo.dart').createSync();
 
     await buildSystem.build(testTarget, environment);
 
@@ -240,7 +241,7 @@
     })
       ..inputs = const <Source>[Source.pattern('{PROJECT_DIR}/foo.dart')]
       ..outputs = const <Source>[Source.pattern('{BUILD_DIR}/foo.out')];
-    fs.file('foo.dart').createSync();
+    globals.fs.file('foo.dart').createSync();
 
     await buildSystem.build(testTarget, environment);
 
@@ -265,7 +266,7 @@
     })
       ..inputs = const <Source>[Source.pattern('{PROJECT_DIR}/foo.dart')]
       ..outputs = const <Source>[Source.pattern('{BUILD_DIR}/foo.out')];
-    fs.file('foo.dart').createSync();
+    globals.fs.file('foo.dart').createSync();
     await buildSystem.build(testTarget, environment);
 
     // invalid JSON
@@ -295,11 +296,11 @@
         '/foo.dart',
       ],
       'outputs': <Object>[
-        fs.path.join(environment.buildDir.path, 'out'),
+        globals.fs.path.join(environment.buildDir.path, 'out'),
       ],
       'dependencies': <Object>[],
       'name':  'foo',
-      'stamp': fs.path.join(environment.buildDir.path, 'foo.stamp'),
+      'stamp': globals.fs.path.join(environment.buildDir.path, 'foo.stamp'),
     });
   }));
 
@@ -317,15 +318,15 @@
     final TestTarget target = TestTarget((Environment environment) async {
       environment.buildDir.childFile('example.d')
         .writeAsStringSync('a.txt: b.txt');
-      fs.file('a.txt').writeAsStringSync('a');
+      globals.fs.file('a.txt').writeAsStringSync('a');
       called += 1;
     })
       ..depfiles = <String>['example.d'];
-    fs.file('b.txt').writeAsStringSync('b');
+    globals.fs.file('b.txt').writeAsStringSync('b');
 
     await buildSystem.build(target, environment);
 
-    expect(fs.file('a.txt').existsSync(), true);
+    expect(globals.fs.file('a.txt').existsSync(), true);
     expect(called, 1);
 
     // Second build is up to date due to depfil parse.
@@ -334,8 +335,8 @@
   }));
 
   test('output directory is an input to the build',  () => testbed.run(() async {
-    final Environment environmentA = Environment(projectDir: fs.currentDirectory, outputDir: fs.directory('a'));
-    final Environment environmentB = Environment(projectDir: fs.currentDirectory, outputDir: fs.directory('b'));
+    final Environment environmentA = Environment(projectDir: globals.fs.currentDirectory, outputDir: globals.fs.directory('a'));
+    final Environment environmentB = Environment(projectDir: globals.fs.currentDirectory, outputDir: globals.fs.directory('b'));
 
     expect(environmentA.buildDir.path, isNot(environmentB.buildDir.path));
   }));
@@ -346,31 +347,31 @@
       if (called == 0) {
         environment.buildDir.childFile('example.d')
           .writeAsStringSync('a.txt c.txt: b.txt');
-        fs.file('a.txt').writeAsStringSync('a');
-        fs.file('c.txt').writeAsStringSync('a');
+        globals.fs.file('a.txt').writeAsStringSync('a');
+        globals.fs.file('c.txt').writeAsStringSync('a');
       } else {
         // On second run, we no longer claim c.txt as an output.
         environment.buildDir.childFile('example.d')
           .writeAsStringSync('a.txt: b.txt');
-        fs.file('a.txt').writeAsStringSync('a');
+        globals.fs.file('a.txt').writeAsStringSync('a');
       }
       called += 1;
     })
       ..depfiles = const <String>['example.d'];
-    fs.file('b.txt').writeAsStringSync('b');
+    globals.fs.file('b.txt').writeAsStringSync('b');
 
     await buildSystem.build(target, environment);
 
-    expect(fs.file('a.txt').existsSync(), true);
-    expect(fs.file('c.txt').existsSync(), true);
+    expect(globals.fs.file('a.txt').existsSync(), true);
+    expect(globals.fs.file('c.txt').existsSync(), true);
     expect(called, 1);
 
     // rewrite an input to force a rerun, espect that the old c.txt is deleted.
-    fs.file('b.txt').writeAsStringSync('ba');
+    globals.fs.file('b.txt').writeAsStringSync('ba');
     await buildSystem.build(target, environment);
 
-    expect(fs.file('a.txt').existsSync(), true);
-    expect(fs.file('c.txt').existsSync(), false);
+    expect(globals.fs.file('a.txt').existsSync(), true);
+    expect(globals.fs.file('c.txt').existsSync(), false);
     expect(called, 2);
   }));
 }
diff --git a/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart b/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart
index b7b4cf6..60331fa 100644
--- a/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart
@@ -5,6 +5,7 @@
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_system/depfile.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/testbed.dart';
@@ -16,7 +17,7 @@
     testbed = Testbed();
   });
   test('Can parse depfile from file', () => testbed.run(() {
-    final File depfileSource = fs.file('example.d')..writeAsStringSync('''
+    final File depfileSource = globals.fs.file('example.d')..writeAsStringSync('''
 a.txt: b.txt
 ''');
     final Depfile depfile = Depfile.parse(depfileSource);
@@ -26,7 +27,7 @@
   }));
 
   test('Can parse depfile with multiple inputs', () => testbed.run(() {
-    final File depfileSource = fs.file('example.d')..writeAsStringSync('''
+    final File depfileSource = globals.fs.file('example.d')..writeAsStringSync('''
 a.txt: b.txt c.txt d.txt
 ''');
     final Depfile depfile = Depfile.parse(depfileSource);
@@ -40,7 +41,7 @@
   }));
 
   test('Can parse depfile with multiple outputs', () => testbed.run(() {
-    final File depfileSource = fs.file('example.d')..writeAsStringSync('''
+    final File depfileSource = globals.fs.file('example.d')..writeAsStringSync('''
 a.txt c.txt d.txt: b.txt
 ''');
     final Depfile depfile = Depfile.parse(depfileSource);
@@ -54,7 +55,7 @@
   }));
 
   test('Can parse depfile with windows file paths', () => testbed.run(() {
-    final File depfileSource = fs.file('example.d')..writeAsStringSync(r'''
+    final File depfileSource = globals.fs.file('example.d')..writeAsStringSync(r'''
 C:\\a.txt: C:\\b.txt
 ''');
     final Depfile depfile = Depfile.parse(depfileSource);
@@ -66,7 +67,7 @@
   }));
 
   test('Resillient to weird whitespace', () => testbed.run(() {
-    final File depfileSource = fs.file('example.d')..writeAsStringSync(r'''
+    final File depfileSource = globals.fs.file('example.d')..writeAsStringSync(r'''
 a.txt
   : b.txt    c.txt
 
@@ -79,7 +80,7 @@
   }));
 
   test('Resillient to duplicate files', () => testbed.run(() {
-    final File depfileSource = fs.file('example.d')..writeAsStringSync(r'''
+    final File depfileSource = globals.fs.file('example.d')..writeAsStringSync(r'''
 a.txt: b.txt b.txt
 ''');
     final Depfile depfile = Depfile.parse(depfileSource);
@@ -89,7 +90,7 @@
   }));
 
   test('Resillient to malformed file, missing :', () => testbed.run(() {
-    final File depfileSource = fs.file('example.d')..writeAsStringSync(r'''
+    final File depfileSource = globals.fs.file('example.d')..writeAsStringSync(r'''
 a.text b.txt
 ''');
     final Depfile depfile = Depfile.parse(depfileSource);
@@ -99,18 +100,18 @@
   }));
 
   test('Can parse dart2js output format', () => testbed.run(() {
-    final File dart2jsDependencyFile = fs.file('main.dart.js.deps')..writeAsStringSync(r'''
+    final File dart2jsDependencyFile = globals.fs.file('main.dart.js.deps')..writeAsStringSync(r'''
 file:///Users/foo/collection.dart
 file:///Users/foo/algorithms.dart
 file:///Users/foo/canonicalized_map.dart
 ''');
 
-    final Depfile depfile = Depfile.parseDart2js(dart2jsDependencyFile, fs.file('foo.dart.js'));
+    final Depfile depfile = Depfile.parseDart2js(dart2jsDependencyFile, globals.fs.file('foo.dart.js'));
 
     expect(depfile.inputs.map((File file) => file.path), <String>[
-      fs.path.absolute(fs.path.join('Users', 'foo', 'collection.dart')),
-      fs.path.absolute(fs.path.join('Users', 'foo', 'algorithms.dart')),
-      fs.path.absolute(fs.path.join('Users', 'foo', 'canonicalized_map.dart')),
+      globals.fs.path.absolute(globals.fs.path.join('Users', 'foo', 'collection.dart')),
+      globals.fs.path.absolute(globals.fs.path.join('Users', 'foo', 'algorithms.dart')),
+      globals.fs.path.absolute(globals.fs.path.join('Users', 'foo', 'canonicalized_map.dart')),
     ]);
     expect(depfile.outputs.single.path, 'foo.dart.js');
   }, overrides: <Type, Generator>{
@@ -118,17 +119,17 @@
   }));
 
   test('Can parse handle invalid uri', () => testbed.run(() {
-    final File dart2jsDependencyFile = fs.file('main.dart.js.deps')..writeAsStringSync('''
+    final File dart2jsDependencyFile = globals.fs.file('main.dart.js.deps')..writeAsStringSync('''
 file:///Users/foo/collection.dart
 abcdevf
 file:///Users/foo/canonicalized_map.dart
 ''');
 
-    final Depfile depfile = Depfile.parseDart2js(dart2jsDependencyFile, fs.file('foo.dart.js'));
+    final Depfile depfile = Depfile.parseDart2js(dart2jsDependencyFile, globals.fs.file('foo.dart.js'));
 
     expect(depfile.inputs.map((File file) => file.path), <String>[
-      fs.path.absolute(fs.path.join('Users', 'foo', 'collection.dart')),
-      fs.path.absolute(fs.path.join('Users', 'foo', 'canonicalized_map.dart')),
+      globals.fs.path.absolute(globals.fs.path.join('Users', 'foo', 'collection.dart')),
+      globals.fs.path.absolute(globals.fs.path.join('Users', 'foo', 'canonicalized_map.dart')),
     ]);
     expect(depfile.outputs.single.path, 'foo.dart.js');
   }, overrides: <Type, Generator>{
diff --git a/packages/flutter_tools/test/general.shard/build_system/exceptions_test.dart b/packages/flutter_tools/test/general.shard/build_system/exceptions_test.dart
index 6675ab3..66e0405 100644
--- a/packages/flutter_tools/test/general.shard/build_system/exceptions_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/exceptions_test.dart
@@ -5,13 +5,14 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/exceptions.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 
 void main() {
   test('Exceptions', () {
     final MissingInputException missingInputException = MissingInputException(
-        <File>[fs.file('foo'), fs.file('bar')], 'example');
+        <File>[globals.fs.file('foo'), globals.fs.file('bar')], 'example');
     final CycleException cycleException = CycleException(<Target>{
       TestTarget()..name = 'foo',
       TestTarget()..name = 'bar',
@@ -20,7 +21,7 @@
       'ABC'
     );
     final MissingOutputException missingOutputException = MissingOutputException(
-      <File>[ fs.file('foo'), fs.file('bar') ],
+      <File>[ globals.fs.file('foo'), globals.fs.file('bar') ],
       'example',
     );
     final MisplacedOutputException misplacedOutputException = MisplacedOutputException(
diff --git a/packages/flutter_tools/test/general.shard/build_system/filecache_test.dart b/packages/flutter_tools/test/general.shard/build_system/filecache_test.dart
index 02c225d..c51d0f4 100644
--- a/packages/flutter_tools/test/general.shard/build_system/filecache_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/filecache_test.dart
@@ -7,6 +7,7 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/file_hash_store.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../../src/common.dart';
@@ -19,23 +20,23 @@
 
   setUp(() {
     testbed = Testbed(setup: () {
-      fs.directory('build').createSync();
+      globals.fs.directory('build').createSync();
       environment = Environment(
-        outputDir: fs.currentDirectory,
-        projectDir: fs.currentDirectory,
+        outputDir: globals.fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory,
       );
       environment.buildDir.createSync(recursive: true);
     });
   });
 
   test('Initializes file cache', () => testbed.run(() {
-    final FileHashStore fileCache = FileHashStore(environment, fs);
+    final FileHashStore fileCache = FileHashStore(environment, globals.fs);
     fileCache.initialize();
     fileCache.persist();
 
-    expect(fs.file(fs.path.join(environment.buildDir.path, '.filecache')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, '.filecache')).existsSync(), true);
 
-    final Uint8List buffer = fs.file(fs.path.join(environment.buildDir.path, '.filecache'))
+    final Uint8List buffer = globals.fs.file(globals.fs.path.join(environment.buildDir.path, '.filecache'))
         .readAsBytesSync();
     final FileStorage fileStorage = FileStorage.fromBuffer(buffer);
 
@@ -44,15 +45,15 @@
   }));
 
   test('saves and restores to file cache', () => testbed.run(() async {
-    final File file = fs.file('foo.dart')
+    final File file = globals.fs.file('foo.dart')
       ..createSync()
       ..writeAsStringSync('hello');
-    final FileHashStore fileCache = FileHashStore(environment, fs);
+    final FileHashStore fileCache = FileHashStore(environment, globals.fs);
     fileCache.initialize();
     await fileCache.hashFiles(<File>[file]);
     fileCache.persist();
     final String currentHash =  fileCache.currentHashes[file.path];
-    final Uint8List buffer = fs.file(fs.path.join(environment.buildDir.path, '.filecache'))
+    final Uint8List buffer = globals.fs.file(globals.fs.path.join(environment.buildDir.path, '.filecache'))
         .readAsBytesSync();
     FileStorage fileStorage = FileStorage.fromBuffer(buffer);
 
@@ -60,7 +61,7 @@
     expect(fileStorage.files.single.path, file.path);
 
 
-    final FileHashStore newFileCache = FileHashStore(environment, fs);
+    final FileHashStore newFileCache = FileHashStore(environment, globals.fs);
     newFileCache.initialize();
     expect(newFileCache.currentHashes, isEmpty);
     expect(newFileCache.previousHashes['foo.dart'],  currentHash);
@@ -74,10 +75,10 @@
   }));
 
   test('handles persisting with a missing build directory', () => testbed.run(() async {
-    final File file = fs.file('foo.dart')
+    final File file = globals.fs.file('foo.dart')
       ..createSync()
       ..writeAsStringSync('hello');
-    final FileHashStore fileCache = FileHashStore(environment, fs);
+    final FileHashStore fileCache = FileHashStore(environment, globals.fs);
     fileCache.initialize();
     environment.buildDir.deleteSync(recursive: true);
 
@@ -87,18 +88,18 @@
   }));
 
   test('handles hashing missing files', () => testbed.run(() async {
-    final FileHashStore fileCache = FileHashStore(environment, fs);
+    final FileHashStore fileCache = FileHashStore(environment, globals.fs);
     fileCache.initialize();
 
-    final List<File> results = await fileCache.hashFiles(<File>[fs.file('hello.dart')]);
+    final List<File> results = await fileCache.hashFiles(<File>[globals.fs.file('hello.dart')]);
 
     expect(results, hasLength(1));
     expect(results.single.path, 'hello.dart');
-    expect(fileCache.currentHashes, isNot(contains(fs.path.absolute('hello.dart'))));
+    expect(fileCache.currentHashes, isNot(contains(globals.fs.path.absolute('hello.dart'))));
   }));
 
   test('handles failure to persist file cache', () => testbed.run(() async {
-    final FakeForwardingFileSystem fakeForwardingFileSystem = FakeForwardingFileSystem(fs);
+    final FakeForwardingFileSystem fakeForwardingFileSystem = FakeForwardingFileSystem(globals.fs);
     final FileHashStore fileCache = FileHashStore(environment, fakeForwardingFileSystem);
     final String cacheFile = environment.buildDir.childFile('.filecache').path;
     final MockFile mockFile = MockFile();
@@ -113,7 +114,7 @@
   }));
 
   test('handles failure to restore file cache', () => testbed.run(() async {
-    final FakeForwardingFileSystem fakeForwardingFileSystem = FakeForwardingFileSystem(fs);
+    final FakeForwardingFileSystem fakeForwardingFileSystem = FakeForwardingFileSystem(globals.fs);
     final FileHashStore fileCache = FileHashStore(environment, fakeForwardingFileSystem);
     final String cacheFile = environment.buildDir.childFile('.filecache').path;
     final MockFile mockFile = MockFile();
diff --git a/packages/flutter_tools/test/general.shard/build_system/source_test.dart b/packages/flutter_tools/test/general.shard/build_system/source_test.dart
index afc0506..18f6b32 100644
--- a/packages/flutter_tools/test/general.shard/build_system/source_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/source_test.dart
@@ -4,13 +4,14 @@
 
 import 'package:flutter_tools/src/artifacts.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/exceptions.dart';
 import 'package:flutter_tools/src/build_system/source.dart';
-import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/testbed.dart';
@@ -25,13 +26,13 @@
     mockPlatform = MockPlatform();
     when(mockPlatform.isWindows).thenReturn(true);
     testbed = Testbed(setup: () {
-      fs.directory('cache').createSync();
-      final Directory outputs = fs.directory('outputs')
+      globals.fs.directory('cache').createSync();
+      final Directory outputs = globals.fs.directory('outputs')
           ..createSync();
       environment = Environment(
         outputDir: outputs,
-        projectDir: fs.currentDirectory,
-        buildDir: fs.directory('build'),
+        projectDir: globals.fs.currentDirectory,
+        buildDir: globals.fs.directory('build'),
       );
       visitor = SourceVisitor(environment);
       environment.buildDir.createSync(recursive: true);
@@ -44,51 +45,51 @@
   }));
 
   test('can substitute {PROJECT_DIR}/foo', () => testbed.run(() {
-    fs.file('foo').createSync();
+    globals.fs.file('foo').createSync();
     const Source fooSource = Source.pattern('{PROJECT_DIR}/foo');
     fooSource.accept(visitor);
 
-    expect(visitor.sources.single.path, fs.path.absolute('foo'));
+    expect(visitor.sources.single.path, globals.fs.path.absolute('foo'));
   }));
 
   test('can substitute {OUTPUT_DIR}/foo', () => testbed.run(() {
-    fs.file('foo').createSync();
+    globals.fs.file('foo').createSync();
     const Source fooSource = Source.pattern('{OUTPUT_DIR}/foo');
     fooSource.accept(visitor);
 
-    expect(visitor.sources.single.path, fs.path.absolute(fs.path.join('outputs', 'foo')));
+    expect(visitor.sources.single.path, globals.fs.path.absolute(globals.fs.path.join('outputs', 'foo')));
   }));
 
 
   test('can substitute {BUILD_DIR}/bar', () => testbed.run(() {
-    final String path = fs.path.join(environment.buildDir.path, 'bar');
-    fs.file(path).createSync();
+    final String path = globals.fs.path.join(environment.buildDir.path, 'bar');
+    globals.fs.file(path).createSync();
     const Source barSource = Source.pattern('{BUILD_DIR}/bar');
     barSource.accept(visitor);
 
-    expect(visitor.sources.single.path, fs.path.absolute(path));
+    expect(visitor.sources.single.path, globals.fs.path.absolute(path));
   }));
 
   test('can substitute {FLUTTER_ROOT}/foo', () => testbed.run(() {
-    final String path = fs.path.join(environment.flutterRootDir.path, 'foo');
-    fs.file(path).createSync();
+    final String path = globals.fs.path.join(environment.flutterRootDir.path, 'foo');
+    globals.fs.file(path).createSync();
     const Source barSource = Source.pattern('{FLUTTER_ROOT}/foo');
     barSource.accept(visitor);
 
-    expect(visitor.sources.single.path, fs.path.absolute(path));
+    expect(visitor.sources.single.path, globals.fs.path.absolute(path));
   }));
 
   test('can substitute Artifact', () => testbed.run(() {
-    final String path = fs.path.join(
-      Cache.instance.getArtifactDirectory('engine').path,
+    final String path = globals.fs.path.join(
+      globals.cache.getArtifactDirectory('engine').path,
       'windows-x64',
       'foo',
     );
-    fs.file(path).createSync(recursive: true);
+    globals.fs.file(path).createSync(recursive: true);
     const Source fizzSource = Source.artifact(Artifact.windowsDesktopPath, platform: TargetPlatform.windows_x64);
     fizzSource.accept(visitor);
 
-    expect(visitor.sources.single.resolveSymbolicLinksSync(), fs.path.absolute(path));
+    expect(visitor.sources.single.resolveSymbolicLinksSync(), globals.fs.path.absolute(path));
   }));
 
   test('can substitute {PROJECT_DIR}/*.fizz', () => testbed.run(() {
@@ -97,13 +98,13 @@
 
     expect(visitor.sources, isEmpty);
 
-    fs.file('foo.fizz').createSync();
-    fs.file('foofizz').createSync();
+    globals.fs.file('foo.fizz').createSync();
+    globals.fs.file('foofizz').createSync();
 
 
     fizzSource.accept(visitor);
 
-    expect(visitor.sources.single.path, fs.path.absolute('foo.fizz'));
+    expect(visitor.sources.single.path, globals.fs.path.absolute('foo.fizz'));
   }));
 
   test('can substitute {PROJECT_DIR}/fizz.*', () => testbed.run(() {
@@ -112,12 +113,12 @@
 
     expect(visitor.sources, isEmpty);
 
-    fs.file('fizz.foo').createSync();
-    fs.file('fizz').createSync();
+    globals.fs.file('fizz.foo').createSync();
+    globals.fs.file('fizz').createSync();
 
     fizzSource.accept(visitor);
 
-    expect(visitor.sources.single.path, fs.path.absolute('fizz.foo'));
+    expect(visitor.sources.single.path, globals.fs.path.absolute('fizz.foo'));
   }));
 
 
@@ -127,19 +128,19 @@
 
     expect(visitor.sources, isEmpty);
 
-    fs.file('bcbc').createSync();
-    fs.file('bc').createSync();
+    globals.fs.file('bcbc').createSync();
+    globals.fs.file('bc').createSync();
 
     fizzSource.accept(visitor);
 
-    expect(visitor.sources.single.path, fs.path.absolute('bcbc'));
+    expect(visitor.sources.single.path, globals.fs.path.absolute('bcbc'));
   }));
 
 
   test('crashes on bad substitute of two **', () => testbed.run(() {
     const Source fizzSource = Source.pattern('{PROJECT_DIR}/*.*bar');
 
-    fs.file('abcd.bar').createSync();
+    globals.fs.file('abcd.bar').createSync();
 
     expect(() => fizzSource.accept(visitor), throwsA(isInstanceOf<InvalidPatternException>()));
   }));
@@ -154,7 +155,7 @@
   test('can substitute optional files', () => testbed.run(() {
     const Source missingSource = Source.pattern('{PROJECT_DIR}/foo', optional: true);
 
-    expect(fs.file('foo').existsSync(), false);
+    expect(globals.fs.file('foo').existsSync(), false);
     missingSource.accept(visitor);
     expect(visitor.sources, isEmpty);
   }));
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart
index e690ead..d67e6e9 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart
@@ -8,7 +8,9 @@
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/targets/android.dart';
 import 'package:flutter_tools/src/build_system/targets/dart.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/cache.dart';
+
 import 'package:mockito/mockito.dart';
 
 import '../../../src/common.dart';
@@ -21,9 +23,9 @@
 
   testbed.test('debug bundle contains expected resources', () async {
     final Environment environment = Environment(
-      outputDir: fs.directory('out')..createSync(),
-      projectDir: fs.currentDirectory,
-      buildDir: fs.currentDirectory,
+      outputDir: globals.fs.directory('out')..createSync(),
+      projectDir: globals.fs.currentDirectory,
+      buildDir: globals.fs.currentDirectory,
       defines: <String, String>{
         kBuildMode: 'debug',
       }
@@ -33,7 +35,7 @@
     // create pre-requisites.
     environment.buildDir.childFile('app.dill')
       ..writeAsStringSync('abcd');
-    final Directory hostDirectory = fs.currentDirectory
+    final Directory hostDirectory = globals.fs.currentDirectory
       .childDirectory(getNameForHostPlatform(getCurrentHostPlatform()))
       ..createSync(recursive: true);
     hostDirectory.childFile('vm_isolate_snapshot.bin').createSync();
@@ -42,16 +44,16 @@
 
     await const DebugAndroidApplication().build(environment);
 
-    expect(fs.file(fs.path.join('out', 'flutter_assets', 'isolate_snapshot_data')).existsSync(), true);
-    expect(fs.file(fs.path.join('out', 'flutter_assets', 'vm_snapshot_data')).existsSync(), true);
-    expect(fs.file(fs.path.join('out', 'flutter_assets', 'kernel_blob.bin')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('out', 'flutter_assets', 'isolate_snapshot_data')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('out', 'flutter_assets', 'vm_snapshot_data')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('out', 'flutter_assets', 'kernel_blob.bin')).existsSync(), true);
   });
 
   testbed.test('profile bundle contains expected resources', () async {
     final Environment environment = Environment(
-      outputDir: fs.directory('out')..createSync(),
-      projectDir: fs.currentDirectory,
-      buildDir: fs.currentDirectory,
+      outputDir: globals.fs.directory('out')..createSync(),
+      projectDir: globals.fs.currentDirectory,
+      buildDir: globals.fs.currentDirectory,
       defines: <String, String>{
         kBuildMode: 'profile',
       }
@@ -64,14 +66,14 @@
 
     await const ProfileAndroidApplication().build(environment);
 
-    expect(fs.file(fs.path.join('out', 'app.so')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('out', 'app.so')).existsSync(), true);
   });
 
   testbed.test('release bundle contains expected resources', () async {
     final Environment environment = Environment(
-      outputDir: fs.directory('out')..createSync(),
-      projectDir: fs.currentDirectory,
-      buildDir: fs.currentDirectory,
+      outputDir: globals.fs.directory('out')..createSync(),
+      projectDir: globals.fs.currentDirectory,
+      buildDir: globals.fs.currentDirectory,
       defines: <String, String>{
         kBuildMode: 'release',
       }
@@ -84,14 +86,14 @@
 
     await const ReleaseAndroidApplication().build(environment);
 
-    expect(fs.file(fs.path.join('out', 'app.so')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('out', 'app.so')).existsSync(), true);
   });
 
   testbed.test('AndroidAot can build provided target platform', () async {
     final Environment environment = Environment(
-      outputDir: fs.directory('out')..createSync(),
-      projectDir: fs.currentDirectory,
-      buildDir: fs.currentDirectory,
+      outputDir: globals.fs.directory('out')..createSync(),
+      projectDir: globals.fs.currentDirectory,
+      buildDir: globals.fs.currentDirectory,
       defines: <String, String>{
         kBuildMode: 'release',
       }
@@ -125,9 +127,9 @@
 
   testbed.test('kExtraGenSnapshotOptions passes values to gen_snapshot', () async {
     final Environment environment = Environment(
-      outputDir: fs.directory('out')..createSync(),
-      projectDir: fs.currentDirectory,
-      buildDir: fs.currentDirectory,
+      outputDir: globals.fs.directory('out')..createSync(),
+      projectDir: globals.fs.currentDirectory,
+      buildDir: globals.fs.currentDirectory,
       defines: <String, String>{
         kBuildMode: 'release',
         kExtraGenSnapshotOptions: 'foo,bar,baz=2',
@@ -160,9 +162,9 @@
 
   testbed.test('android aot bundle copies so from abi directory', () async {
     final Environment environment = Environment(
-      outputDir: fs.directory('out')..createSync(),
-      projectDir: fs.currentDirectory,
-      buildDir: fs.currentDirectory,
+      outputDir: globals.fs.directory('out')..createSync(),
+      projectDir: globals.fs.currentDirectory,
+      buildDir: globals.fs.currentDirectory,
       defines: <String, String>{
         kBuildMode: 'release',
       }
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart
index 7b3b091..659709c 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart
@@ -4,9 +4,9 @@
 
 import 'dart:io';
 
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/targets/assets.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../../src/common.dart';
 import '../../../src/testbed.dart';
@@ -19,19 +19,19 @@
   setUp(() {
     testbed = Testbed(setup: () {
       environment = Environment(
-        outputDir: fs.currentDirectory,
-        projectDir: fs.currentDirectory,
+        outputDir: globals.fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory,
       );
-      fs.file(fs.path.join('packages', 'flutter_tools', 'lib', 'src',
+      globals.fs.file(globals.fs.path.join('packages', 'flutter_tools', 'lib', 'src',
           'build_system', 'targets', 'assets.dart'))
         ..createSync(recursive: true);
-      fs.file(fs.path.join('assets', 'foo', 'bar.png'))
+      globals.fs.file(globals.fs.path.join('assets', 'foo', 'bar.png'))
         ..createSync(recursive: true);
-      fs.file(fs.path.join('assets', 'wildcard', '#bar.png'))
+      globals.fs.file(globals.fs.path.join('assets', 'wildcard', '#bar.png'))
         ..createSync(recursive: true);
-      fs.file('.packages')
+      globals.fs.file('.packages')
         ..createSync();
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync('''
 name: example
@@ -47,21 +47,21 @@
   test('Copies files to correct asset directory', () => testbed.run(() async {
     await buildSystem.build(const CopyAssets(), environment);
 
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'AssetManifest.json')).existsSync(), true);
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'FontManifest.json')).existsSync(), true);
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'LICENSE')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'flutter_assets', 'AssetManifest.json')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'flutter_assets', 'FontManifest.json')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'flutter_assets', 'LICENSE')).existsSync(), true);
     // See https://github.com/flutter/flutter/issues/35293
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), true);
     // See https://github.com/flutter/flutter/issues/46163
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/wildcard/%23bar.png')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/wildcard/%23bar.png')).existsSync(), true);
   }));
 
   test('Does not leave stale files in build directory', () => testbed.run(() async {
     await buildSystem.build(const CopyAssets(), environment);
 
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), true);
     // Modify manifest to remove asset.
-    fs.file('pubspec.yaml')
+    globals.fs.file('pubspec.yaml')
       ..createSync()
       ..writeAsStringSync('''
 name: example
@@ -71,18 +71,18 @@
     await buildSystem.build(const CopyAssets(), environment);
 
     // See https://github.com/flutter/flutter/issues/35293
-    expect(fs.file(fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), false);
+    expect(globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'flutter_assets', 'assets/foo/bar.png')).existsSync(), false);
   }), skip: Platform.isWindows); // See https://github.com/google/file.dart/issues/131
 
   test('FlutterPlugins updates required files as needed', () => testbed.run(() async {
-    fs.file('pubspec.yaml')
+    globals.fs.file('pubspec.yaml')
       ..writeAsStringSync('name: foo\ndependencies:\n  foo: any\n');
 
     await const FlutterPlugins().build(Environment(
-      outputDir: fs.currentDirectory,
-      projectDir: fs.currentDirectory,
+      outputDir: globals.fs.currentDirectory,
+      projectDir: globals.fs.currentDirectory,
     ));
 
-    expect(fs.file('.flutter-plugins').existsSync(), true);
+    expect(globals.fs.file('.flutter-plugins').existsSync(), true);
   }));
 }
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart
index 82e56be..b83b51b 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/dart_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:flutter_tools/src/base/build.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/process.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
@@ -15,6 +14,8 @@
 import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/macos/xcode.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -39,64 +40,64 @@
     mockProcessManager = MockProcessManager();
     testbed = Testbed(setup: () {
       androidEnvironment = Environment(
-        outputDir: fs.currentDirectory,
-        projectDir: fs.currentDirectory,
+        outputDir: globals.fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory,
         defines: <String, String>{
           kBuildMode: getNameForBuildMode(BuildMode.profile),
           kTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
         },
       );
       iosEnvironment = Environment(
-        outputDir: fs.currentDirectory,
-        projectDir: fs.currentDirectory,
+        outputDir: globals.fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory,
         defines: <String, String>{
           kBuildMode: getNameForBuildMode(BuildMode.profile),
           kTargetPlatform: getNameForTargetPlatform(TargetPlatform.ios),
         },
       );
       HostPlatform hostPlatform;
-      if (platform.isWindows) {
+      if (globals.platform.isWindows) {
         hostPlatform = HostPlatform.windows_x64;
-      } else if (platform.isLinux) {
+      } else if (globals.platform.isLinux) {
         hostPlatform = HostPlatform.linux_x64;
-      } else if (platform.isMacOS) {
+      } else if (globals.platform.isMacOS) {
         hostPlatform = HostPlatform.darwin_x64;
       } else {
         assert(false);
       }
-      final String skyEngineLine = platform.isWindows
+      final String skyEngineLine = globals.platform.isWindows
         ? r'sky_engine:file:///C:/bin/cache/pkg/sky_engine/lib/'
         : 'sky_engine:file:///bin/cache/pkg/sky_engine/lib/';
-      fs.file('.packages')
+      globals.fs.file('.packages')
         ..createSync()
         ..writeAsStringSync('''
 # Generated
 $skyEngineLine
 flutter_tools:lib/''');
-      final String engineArtifacts = fs.path.join('bin', 'cache',
+      final String engineArtifacts = globals.fs.path.join('bin', 'cache',
           'artifacts', 'engine');
       final List<String> paths = <String>[
-        fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'lib', 'ui',
+        globals.fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'lib', 'ui',
           'ui.dart'),
-        fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'sdk_ext',
+        globals.fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'sdk_ext',
             'vmservice_io.dart'),
-        fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
-        fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart.exe'),
-        fs.path.join(engineArtifacts, getNameForHostPlatform(hostPlatform),
+        globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
+        globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart.exe'),
+        globals.fs.path.join(engineArtifacts, getNameForHostPlatform(hostPlatform),
             'frontend_server.dart.snapshot'),
-        fs.path.join(engineArtifacts, 'android-arm-profile',
+        globals.fs.path.join(engineArtifacts, 'android-arm-profile',
             getNameForHostPlatform(hostPlatform), 'gen_snapshot'),
-        fs.path.join(engineArtifacts, 'ios-profile', 'gen_snapshot'),
-        fs.path.join(engineArtifacts, 'common', 'flutter_patched_sdk',
+        globals.fs.path.join(engineArtifacts, 'ios-profile', 'gen_snapshot'),
+        globals.fs.path.join(engineArtifacts, 'common', 'flutter_patched_sdk',
             'platform_strong.dill'),
-        fs.path.join('lib', 'foo.dart'),
-        fs.path.join('lib', 'bar.dart'),
-        fs.path.join('lib', 'fizz'),
-        fs.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'dart.dart'),
-        fs.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'ios.dart'),
+        globals.fs.path.join('lib', 'foo.dart'),
+        globals.fs.path.join('lib', 'bar.dart'),
+        globals.fs.path.join('lib', 'fizz'),
+        globals.fs.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'dart.dart'),
+        globals.fs.path.join('packages', 'flutter_tools', 'lib', 'src', 'build_system', 'targets', 'ios.dart'),
       ];
       for (String path in paths) {
-        fs.file(path).createSync(recursive: true);
+        globals.fs.file(path).createSync(recursive: true);
       }
     }, overrides: <Type, Generator>{
       KernelCompilerFactory: () => FakeKernelCompilerFactory(),
@@ -107,7 +108,7 @@
   test('kernel_snapshot Produces correct output directory', () => testbed.run(() async {
     await buildSystem.build(const KernelSnapshot(), androidEnvironment);
 
-    expect(fs.file(fs.path.join(androidEnvironment.buildDir.path,'app.dill')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(androidEnvironment.buildDir.path,'app.dill')).existsSync(), true);
   }));
 
   test('kernel_snapshot throws error if missing build mode', () => testbed.run(() async {
@@ -264,8 +265,8 @@
     });
 
     await const KernelSnapshot().build(Environment(
-      outputDir: fs.currentDirectory,
-      projectDir: fs.currentDirectory,
+      outputDir: globals.fs.currentDirectory,
+      projectDir: globals.fs.currentDirectory,
       defines: <String, String>{
         kBuildMode: 'debug',
         kTargetPlatform: getNameForTargetPlatform(TargetPlatform.android_arm),
@@ -277,8 +278,8 @@
   test('aot_elf_profile Produces correct output directory', () => testbed.run(() async {
     await buildSystem.build(const AotElfProfile(), androidEnvironment);
 
-    expect(fs.file(fs.path.join(androidEnvironment.buildDir.path, 'app.dill')).existsSync(), true);
-    expect(fs.file(fs.path.join(androidEnvironment.buildDir.path, 'app.so')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(androidEnvironment.buildDir.path, 'app.dill')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join(androidEnvironment.buildDir.path, 'app.so')).existsSync(), true);
   }));
 
   test('aot_elf_profile throws error if missing build mode', () => testbed.run(() async {
@@ -319,7 +320,7 @@
   test('aot_assembly_profile will lipo binaries together when multiple archs are requested', () => testbed.run(() async {
     iosEnvironment.defines[kIosArchs] ='armv7,arm64';
     when(mockProcessManager.run(any)).thenAnswer((Invocation invocation) async {
-      fs.file(fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
+      globals.fs.file(globals.fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
           .createSync(recursive: true);
       return FakeProcessResult(
         stdout: '',
@@ -343,7 +344,7 @@
     );
     final RunResult fakeRunResult = RunResult(fakeProcessResult, const <String>['foo']);
     when(mockProcessManager.run(any)).thenAnswer((Invocation invocation) async {
-      fs.file(fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
+      globals.fs.file(globals.fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
           .createSync(recursive: true);
       return fakeProcessResult;
     });
@@ -371,7 +372,7 @@
     );
     final RunResult fakeRunResult = RunResult(fakeProcessResult, const <String>['foo']);
     when(mockProcessManager.run(any)).thenAnswer((Invocation invocation) async {
-      fs.file(fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
+      globals.fs.file(globals.fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
           .createSync(recursive: true);
       return fakeProcessResult;
     });
@@ -392,7 +393,7 @@
   test('aot_assembly_profile will lipo binaries together when multiple archs are requested', () => testbed.run(() async {
     iosEnvironment.defines[kIosArchs] = 'armv7,arm64';
     when(mockProcessManager.run(any)).thenAnswer((Invocation invocation) async {
-      fs.file(fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
+      globals.fs.file(globals.fs.path.join(iosEnvironment.buildDir.path, 'App.framework', 'App'))
           .createSync(recursive: true);
       return FakeProcessResult(
         stdout: '',
@@ -446,7 +447,7 @@
   @override
   Future<int> run({SnapshotType snapshotType, DarwinArch darwinArch, Iterable<String> additionalArgs = const <String>[]}) async {
     lastCallAdditionalArgs = additionalArgs.toList();
-    final Directory out = fs.file(lastCallAdditionalArgs.last).parent;
+    final Directory out = globals.fs.file(lastCallAdditionalArgs.last).parent;
     if (darwinArch == null) {
       out.childFile('app.so').createSync();
       out.childFile('gen_snapshot.d').createSync();
@@ -457,8 +458,8 @@
     final String assembly = lastCallAdditionalArgs
         .firstWhere((String arg) => arg.startsWith('--assembly'))
         .substring('--assembly='.length);
-    fs.file(assembly).createSync();
-    fs.file(assembly.replaceAll('.S', '.o')).createSync();
+    globals.fs.file(assembly).createSync();
+    globals.fs.file(assembly.replaceAll('.S', '.o')).createSync();
     return 0;
   }
 }
@@ -493,7 +494,7 @@
     String initializeFromDill,
     List<String> dartDefines,
   }) async {
-    fs.file(outputFilePath).createSync(recursive: true);
+    globals.fs.file(outputFilePath).createSync(recursive: true);
     return CompilerOutput(outputFilePath, 0, null);
   }
 }
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart
index 045a284..6eb658e 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/targets/dart.dart';
 import 'package:flutter_tools/src/build_system/targets/linux.dart';
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../../../src/common.dart';
@@ -33,22 +34,22 @@
     testbed = Testbed(setup: () {
       Cache.flutterRoot = '';
       environment = Environment(
-        outputDir: fs.currentDirectory,
-        projectDir: fs.currentDirectory,
+        outputDir: globals.fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory,
         defines: <String, String>{
           kBuildMode: 'debug',
         }
       );
-      fs.file('bin/cache/artifacts/engine/linux-x64/unrelated-stuff').createSync(recursive: true);
-      fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux_glfw.so').createSync(recursive: true);
-      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_export.h').createSync();
-      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_messenger.h').createSync();
-      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_plugin_registrar.h').createSync();
-      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_glfw.h').createSync();
-      fs.file('bin/cache/artifacts/engine/linux-x64/icudtl.dat').createSync();
-      fs.file('bin/cache/artifacts/engine/linux-x64/cpp_client_wrapper_glfw/foo').createSync(recursive: true);
-      fs.file('packages/flutter_tools/lib/src/build_system/targets/linux.dart').createSync(recursive: true);
-      fs.directory('linux').createSync();
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/unrelated-stuff').createSync(recursive: true);
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux_glfw.so').createSync(recursive: true);
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/flutter_export.h').createSync();
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/flutter_messenger.h').createSync();
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/flutter_plugin_registrar.h').createSync();
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/flutter_glfw.h').createSync();
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/icudtl.dat').createSync();
+      globals.fs.file('bin/cache/artifacts/engine/linux-x64/cpp_client_wrapper_glfw/foo').createSync(recursive: true);
+      globals.fs.file('packages/flutter_tools/lib/src/build_system/targets/linux.dart').createSync(recursive: true);
+      globals.fs.directory('linux').createSync();
     }, overrides: <Type, Generator>{
       Platform: () => mockPlatform,
     });
@@ -58,14 +59,14 @@
     final BuildResult result = await buildSystem.build(const UnpackLinuxDebug(), environment);
 
     expect(result.hasException, false);
-    expect(fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').existsSync(), true);
-    expect(fs.file('linux/flutter/ephemeral/flutter_export.h').existsSync(), true);
-    expect(fs.file('linux/flutter/ephemeral/flutter_messenger.h').existsSync(), true);
-    expect(fs.file('linux/flutter/ephemeral/flutter_plugin_registrar.h').existsSync(), true);
-    expect(fs.file('linux/flutter/ephemeral/flutter_glfw.h').existsSync(), true);
-    expect(fs.file('linux/flutter/ephemeral/icudtl.dat').existsSync(), true);
-    expect(fs.file('linux/flutter/ephemeral/cpp_client_wrapper_glfw/foo').existsSync(), true);
-    expect(fs.file('linux/flutter/ephemeral/unrelated-stuff').existsSync(), false);
+    expect(globals.fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/flutter_export.h').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/flutter_messenger.h').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/flutter_plugin_registrar.h').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/flutter_glfw.h').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/icudtl.dat').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/cpp_client_wrapper_glfw/foo').existsSync(), true);
+    expect(globals.fs.file('linux/flutter/ephemeral/unrelated-stuff').existsSync(), false);
   }));
 
   test('Does not re-copy files unecessarily', () => testbed.run(() async {
@@ -73,19 +74,19 @@
     // Set a date in the far distant past to deal with the limited resolution
     // of the windows filesystem.
     final DateTime theDistantPast = DateTime(1991, 8, 23);
-    fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').setLastModifiedSync(theDistantPast);
+    globals.fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').setLastModifiedSync(theDistantPast);
     await buildSystem.build(const UnpackLinuxDebug(), environment);
 
-    expect(fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').statSync().modified, equals(theDistantPast));
+    expect(globals.fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').statSync().modified, equals(theDistantPast));
   }));
 
   test('Detects changes in input cache files', () => testbed.run(() async {
     await buildSystem.build(const UnpackLinuxDebug(), environment);
-    fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux_glfw.so').writeAsStringSync('asd'); // modify cache.
+    globals.fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux_glfw.so').writeAsStringSync('asd'); // modify cache.
 
     await buildSystem.build(const UnpackLinuxDebug(), environment);
 
-    expect(fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').readAsStringSync(), 'asd');
+    expect(globals.fs.file('linux/flutter/ephemeral/libflutter_linux_glfw.so').readAsStringSync(), 'asd');
   }));
 
   test('Copies artifacts to out directory', () => testbed.run(() async {
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart
index b5ef7dd..cd09381 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart
@@ -5,17 +5,17 @@
 import 'package:flutter_tools/src/base/build.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/process.dart';
-import 'package:flutter_tools/src/base/process_manager.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/targets/dart.dart';
 import 'package:flutter_tools/src/build_system/targets/macos.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/macos/cocoapods.dart';
 import 'package:flutter_tools/src/macos/xcode.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../../src/common.dart';
 import '../../../src/testbed.dart';
@@ -24,25 +24,25 @@
 const String _kOutputPrefix = 'FlutterMacOS.framework';
 
 final List<File> inputs = <File>[
-  fs.file('$_kInputPrefix/FlutterMacOS'),
+  globals.fs.file('$_kInputPrefix/FlutterMacOS'),
   // Headers
-  fs.file('$_kInputPrefix/Headers/FlutterDartProject.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterEngine.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterViewController.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterBinaryMessenger.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterChannels.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterCodecs.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterMacros.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterPluginMacOS.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterPluginRegistrarMacOS.h'),
-  fs.file('$_kInputPrefix/Headers/FlutterMacOS.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterDartProject.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterEngine.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterViewController.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterBinaryMessenger.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterChannels.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterCodecs.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterMacros.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterPluginMacOS.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterPluginRegistrarMacOS.h'),
+  globals.fs.file('$_kInputPrefix/Headers/FlutterMacOS.h'),
   // Modules
-  fs.file('$_kInputPrefix/Modules/module.modulemap'),
+  globals.fs.file('$_kInputPrefix/Modules/module.modulemap'),
   // Resources
-  fs.file('$_kInputPrefix/Resources/icudtl.dat'),
-  fs.file('$_kInputPrefix/Resources/Info.plist'),
+  globals.fs.file('$_kInputPrefix/Resources/icudtl.dat'),
+  globals.fs.file('$_kInputPrefix/Resources/Info.plist'),
   // Ignore Versions folder for now
-  fs.file('packages/flutter_tools/lib/src/build_system/targets/macos.dart'),
+  globals.fs.file('packages/flutter_tools/lib/src/build_system/targets/macos.dart'),
 ];
 
 void main() {
@@ -62,14 +62,14 @@
     when(mockPlatform.isLinux).thenReturn(false);
     when(mockPlatform.environment).thenReturn(const <String, String>{});
     testbed = Testbed(setup: () {
-      fs.file(fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'lib', 'ui',
+      globals.fs.file(globals.fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'lib', 'ui',
           'ui.dart')).createSync(recursive: true);
-      fs.file(fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'sdk_ext',
+      globals.fs.file(globals.fs.path.join('bin', 'cache', 'pkg', 'sky_engine', 'sdk_ext',
           'vmservice_io.dart')).createSync(recursive: true);
 
       environment = Environment(
-        outputDir: fs.currentDirectory,
-        projectDir: fs.currentDirectory,
+        outputDir: globals.fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory,
         defines: <String, String>{
           kBuildMode: 'debug',
           kTargetPlatform: 'darwin-x64',
@@ -89,12 +89,12 @@
     environment.outputDir.childDirectory(_kOutputPrefix)
         .createSync(recursive: true);
 
-    when(processManager.run(any)).thenAnswer((Invocation invocation) async {
+    when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
       final List<String> arguments = invocation.positionalArguments.first as List<String>;
       final String sourcePath = arguments[arguments.length - 2];
       final String targetPath = arguments.last;
-      final Directory source = fs.directory(sourcePath);
-      final Directory target = fs.directory(targetPath);
+      final Directory source = globals.fs.directory(sourcePath);
+      final Directory target = globals.fs.directory(targetPath);
 
       // verify directory was deleted by command.
       expect(target.existsSync(), false);
@@ -102,10 +102,10 @@
 
       for (FileSystemEntity entity in source.listSync(recursive: true)) {
         if (entity is File) {
-          final String relative = fs.path.relative(entity.path, from: source.path);
-          final String destination = fs.path.join(target.path, relative);
-          if (!fs.file(destination).parent.existsSync()) {
-            fs.file(destination).parent.createSync();
+          final String relative = globals.fs.path.relative(entity.path, from: source.path);
+          final String destination = globals.fs.path.join(target.path, relative);
+          if (!globals.fs.file(destination).parent.existsSync()) {
+            globals.fs.file(destination).parent.createSync();
           }
           entity.copySync(destination);
         }
@@ -114,15 +114,15 @@
     });
     await const DebugUnpackMacOS().build(environment);
 
-    expect(fs.directory('$_kOutputPrefix').existsSync(), true);
+    expect(globals.fs.directory('$_kOutputPrefix').existsSync(), true);
     for (File file in inputs) {
-      expect(fs.file(file.path.replaceFirst(_kInputPrefix, _kOutputPrefix)).existsSync(), true);
+      expect(globals.fs.file(file.path.replaceFirst(_kInputPrefix, _kOutputPrefix)).existsSync(), true);
     }
   }));
 
   test('debug macOS application fails if App.framework missing', () => testbed.run(() async {
-    final String inputKernel = fs.path.join(environment.buildDir.path, 'app.dill');
-    fs.file(inputKernel)
+    final String inputKernel = globals.fs.path.join(environment.buildDir.path, 'app.dill');
+    globals.fs.file(inputKernel)
       ..createSync(recursive: true)
       ..writeAsStringSync('testing');
 
@@ -131,59 +131,59 @@
   }));
 
   test('debug macOS application creates correctly structured framework', () => testbed.run(() async {
-    fs.file(fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
+    globals.fs.file(globals.fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
         'vm_isolate_snapshot.bin')).createSync(recursive: true);
-    fs.file(fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
+    globals.fs.file(globals.fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
         'isolate_snapshot.bin')).createSync(recursive: true);
-    fs.file(fs.path.join(environment.buildDir.path, 'App.framework', 'App'))
+    globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'App.framework', 'App'))
         ..createSync(recursive: true);
 
-    final String inputKernel = fs.path.join(environment.buildDir.path, 'app.dill');
-    final String outputKernel = fs.path.join('App.framework', 'Versions', 'A', 'Resources',
+    final String inputKernel = globals.fs.path.join(environment.buildDir.path, 'app.dill');
+    final String outputKernel = globals.fs.path.join('App.framework', 'Versions', 'A', 'Resources',
         'flutter_assets', 'kernel_blob.bin');
-    final String outputPlist = fs.path.join('App.framework', 'Versions', 'A', 'Resources',
+    final String outputPlist = globals.fs.path.join('App.framework', 'Versions', 'A', 'Resources',
         'Info.plist');
-    fs.file(inputKernel)
+    globals.fs.file(inputKernel)
       ..createSync(recursive: true)
       ..writeAsStringSync('testing');
 
     await const DebugMacOSBundleFlutterAssets().build(environment);
 
-    expect(fs.file(outputKernel).readAsStringSync(), 'testing');
-    expect(fs.file(outputPlist).readAsStringSync(), contains('io.flutter.flutter.app'));
+    expect(globals.fs.file(outputKernel).readAsStringSync(), 'testing');
+    expect(globals.fs.file(outputPlist).readAsStringSync(), contains('io.flutter.flutter.app'));
   }));
 
   test('release/profile macOS application has no blob or precompiled runtime', () => testbed.run(() async {
-    fs.file(fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
+    globals.fs.file(globals.fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
         'vm_isolate_snapshot.bin')).createSync(recursive: true);
-    fs.file(fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
+    globals.fs.file(globals.fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
         'isolate_snapshot.bin')).createSync(recursive: true);
-    fs.file(fs.path.join(environment.buildDir.path, 'App.framework', 'App'))
+    globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'App.framework', 'App'))
         ..createSync(recursive: true);
-    final String outputKernel = fs.path.join('App.framework', 'Resources',
+    final String outputKernel = globals.fs.path.join('App.framework', 'Resources',
         'flutter_assets', 'kernel_blob.bin');
-    final String precompiledVm = fs.path.join('App.framework', 'Resources',
+    final String precompiledVm = globals.fs.path.join('App.framework', 'Resources',
         'flutter_assets', 'vm_snapshot_data');
-    final String precompiledIsolate = fs.path.join('App.framework', 'Resources',
+    final String precompiledIsolate = globals.fs.path.join('App.framework', 'Resources',
         'flutter_assets', 'isolate_snapshot_data');
     await const ProfileMacOSBundleFlutterAssets().build(environment..defines[kBuildMode] = 'profile');
 
-    expect(fs.file(outputKernel).existsSync(), false);
-    expect(fs.file(precompiledVm).existsSync(), false);
-    expect(fs.file(precompiledIsolate).existsSync(), false);
+    expect(globals.fs.file(outputKernel).existsSync(), false);
+    expect(globals.fs.file(precompiledVm).existsSync(), false);
+    expect(globals.fs.file(precompiledIsolate).existsSync(), false);
   }));
 
   test('release/profile macOS application updates when App.framework updates', () => testbed.run(() async {
-    fs.file(fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
+    globals.fs.file(globals.fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
         'vm_isolate_snapshot.bin')).createSync(recursive: true);
-    fs.file(fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
+    globals.fs.file(globals.fs.path.join('bin', 'cache', 'artifacts', 'engine', 'darwin-x64',
         'isolate_snapshot.bin')).createSync(recursive: true);
-    final File inputFramework = fs.file(fs.path.join(environment.buildDir.path, 'App.framework', 'App'))
+    final File inputFramework = globals.fs.file(globals.fs.path.join(environment.buildDir.path, 'App.framework', 'App'))
         ..createSync(recursive: true)
         ..writeAsStringSync('ABC');
 
     await const ProfileMacOSBundleFlutterAssets().build(environment..defines[kBuildMode] = 'profile');
-    final File outputFramework = fs.file(fs.path.join(environment.outputDir.path, 'App.framework', 'App'));
+    final File outputFramework = globals.fs.file(globals.fs.path.join(environment.outputDir.path, 'App.framework', 'App'));
 
     expect(outputFramework.readAsStringSync(), 'ABC');
 
@@ -210,7 +210,7 @@
       return Future<RunResult>.value(RunResult(FakeProcessResult()..exitCode = 0, <String>['test']));
     });
     environment.buildDir.childFile('app.dill').createSync(recursive: true);
-    fs.file('.packages')
+    globals.fs.file('.packages')
       ..createSync()
       ..writeAsStringSync('''
 # Generated
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart
index d5b1e44..4c3b261 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart
@@ -3,15 +3,16 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
-import 'package:flutter_tools/src/base/process_manager.dart';
+
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/depfile.dart';
 import 'package:flutter_tools/src/build_system/targets/dart.dart';
 import 'package:flutter_tools/src/build_system/targets/web.dart';
 import 'package:flutter_tools/src/dart/package_map.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../../src/common.dart';
 import '../../../src/mocks.dart';
@@ -36,17 +37,17 @@
     when(mockWindowsPlatform.isLinux).thenReturn(false);
 
     testbed = Testbed(setup: () {
-      final File packagesFile = fs.file(fs.path.join('foo', '.packages'))
+      final File packagesFile = globals.fs.file(globals.fs.path.join('foo', '.packages'))
         ..createSync(recursive: true)
         ..writeAsStringSync('foo:lib/\n');
       PackageMap.globalPackagesPath = packagesFile.path;
 
       environment = Environment(
-        projectDir: fs.currentDirectory.childDirectory('foo'),
-        outputDir: fs.currentDirectory,
-        buildDir: fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory.childDirectory('foo'),
+        outputDir: globals.fs.currentDirectory,
+        buildDir: globals.fs.currentDirectory,
         defines: <String, String>{
-          kTargetFile: fs.path.join('foo', 'lib', 'main.dart'),
+          kTargetFile: globals.fs.path.join('foo', 'lib', 'main.dart'),
         }
       );
       environment.buildDir.createSync(recursive: true);
@@ -77,7 +78,7 @@
   }));
 
   test('WebEntrypointTarget generates an entrypoint for a file outside of main', () => testbed.run(() async {
-    environment.defines[kTargetFile] = fs.path.join('other', 'lib', 'main.dart');
+    environment.defines[kTargetFile] = globals.fs.path.join('other', 'lib', 'main.dart');
     await const WebEntrypointTarget().build(environment);
 
     final String generated = environment.buildDir.childFile('main.dart').readAsStringSync();
@@ -166,47 +167,47 @@
 
   test('Dart2JSTarget calls dart2js with expected args in profile mode', () => testbed.run(() async {
     environment.defines[kBuildMode] = 'profile';
-    when(processManager.run(any)).thenAnswer((Invocation invocation) async {
+    when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
       return FakeProcessResult(exitCode: 0);
     });
     await const Dart2JSTarget().build(environment);
 
     final List<String> expected = <String>[
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
-      '--libraries-spec=' + fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
+      '--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
       '-O4', // highest optimizations
       '--no-minify', // but uses unminified names for debugging
       '-o',
       environment.buildDir.childFile('main.dart.js').absolute.path,
-      '--packages=${fs.path.join('foo', '.packages')}',
+      '--packages=${globals.fs.path.join('foo', '.packages')}',
       '-Ddart.vm.profile=true',
       environment.buildDir.childFile('main.dart').absolute.path,
     ];
-    verify(processManager.run(expected)).called(1);
+    verify(globals.processManager.run(expected)).called(1);
   }, overrides: <Type, Generator>{
     ProcessManager: () => MockProcessManager(),
   }));
 
   test('Dart2JSTarget calls dart2js with expected args in release mode', () => testbed.run(() async {
     environment.defines[kBuildMode] = 'release';
-    when(processManager.run(any)).thenAnswer((Invocation invocation) async {
+    when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
       return FakeProcessResult(exitCode: 0);
     });
     await const Dart2JSTarget().build(environment);
 
     final List<String> expected = <String>[
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
-      '--libraries-spec=' + fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
+      '--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
       '-O4', // highest optimizations.
       '-o',
       environment.buildDir.childFile('main.dart.js').absolute.path,
-      '--packages=${fs.path.join('foo', '.packages')}',
+      '--packages=${globals.fs.path.join('foo', '.packages')}',
       '-Ddart.vm.product=true',
       environment.buildDir.childFile('main.dart').absolute.path,
     ];
-    verify(processManager.run(expected)).called(1);
+    verify(globals.processManager.run(expected)).called(1);
   }, overrides: <Type, Generator>{
     ProcessManager: () => MockProcessManager(),
   }));
@@ -214,30 +215,30 @@
   test('Dart2JSTarget calls dart2js with expected args in release with dart2js optimization override', () => testbed.run(() async {
     environment.defines[kBuildMode] = 'release';
     environment.defines[kDart2jsOptimization] = 'O3';
-    when(processManager.run(any)).thenAnswer((Invocation invocation) async {
+    when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
       return FakeProcessResult(exitCode: 0);
     });
     await const Dart2JSTarget().build(environment);
 
     final List<String> expected = <String>[
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
-      '--libraries-spec=' + fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
+      '--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
       '-O3', // configured optimizations.
       '-o',
       environment.buildDir.childFile('main.dart.js').absolute.path,
-      '--packages=${fs.path.join('foo', '.packages')}',
+      '--packages=${globals.fs.path.join('foo', '.packages')}',
       '-Ddart.vm.product=true',
       environment.buildDir.childFile('main.dart').absolute.path,
     ];
-    verify(processManager.run(expected)).called(1);
+    verify(globals.processManager.run(expected)).called(1);
   }, overrides: <Type, Generator>{
     ProcessManager: () => MockProcessManager(),
   }));
 
   test('Dart2JSTarget produces expected depfile', () => testbed.run(() async {
     environment.defines[kBuildMode] = 'release';
-    when(processManager.run(any)).thenAnswer((Invocation invocation) async {
+    when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
       environment.buildDir.childFile('main.dart.js.deps')
         ..writeAsStringSync('file:///a.dart');
       return FakeProcessResult(exitCode: 0);
@@ -247,7 +248,7 @@
     expect(environment.buildDir.childFile('dart2js.d').existsSync(), true);
     final Depfile depfile = Depfile.parse(environment.buildDir.childFile('dart2js.d'));
 
-    expect(depfile.inputs.single.path, fs.path.absolute('a.dart'));
+    expect(depfile.inputs.single.path, globals.fs.path.absolute('a.dart'));
     expect(depfile.outputs.single.path,
       environment.buildDir.childFile('main.dart.js').absolute.path);
   }, overrides: <Type, Generator>{
@@ -257,25 +258,25 @@
   test('Dart2JSTarget calls dart2js with Dart defines in release mode', () => testbed.run(() async {
     environment.defines[kBuildMode] = 'release';
     environment.defines[kDartDefines] = '["FOO=bar","BAZ=qux"]';
-    when(processManager.run(any)).thenAnswer((Invocation invocation) async {
+    when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
       return FakeProcessResult(exitCode: 0);
     });
     await const Dart2JSTarget().build(environment);
 
     final List<String> expected = <String>[
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
-      '--libraries-spec=' + fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
+      '--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
       '-O4',
       '-o',
       environment.buildDir.childFile('main.dart.js').absolute.path,
-      '--packages=${fs.path.join('foo', '.packages')}',
+      '--packages=${globals.fs.path.join('foo', '.packages')}',
       '-Ddart.vm.product=true',
       '-DFOO=bar',
       '-DBAZ=qux',
       environment.buildDir.childFile('main.dart').absolute.path,
     ];
-    verify(processManager.run(expected)).called(1);
+    verify(globals.processManager.run(expected)).called(1);
   }, overrides: <Type, Generator>{
     ProcessManager: () => MockProcessManager(),
   }));
@@ -283,26 +284,26 @@
   test('Dart2JSTarget calls dart2js with Dart defines in profile mode', () => testbed.run(() async {
     environment.defines[kBuildMode] = 'profile';
     environment.defines[kDartDefines] = '["FOO=bar","BAZ=qux"]';
-    when(processManager.run(any)).thenAnswer((Invocation invocation) async {
+    when(globals.processManager.run(any)).thenAnswer((Invocation invocation) async {
       return FakeProcessResult(exitCode: 0);
     });
     await const Dart2JSTarget().build(environment);
 
     final List<String> expected = <String>[
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
-      fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
-      '--libraries-spec=' + fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'dart'),
+      globals.fs.path.join('bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'dart2js.dart.snapshot'),
+      '--libraries-spec=' + globals.fs.path.join('bin', 'cache', 'flutter_web_sdk', 'libraries.json'),
       '-O4',
       '--no-minify',
       '-o',
       environment.buildDir.childFile('main.dart.js').absolute.path,
-      '--packages=${fs.path.join('foo', '.packages')}',
+      '--packages=${globals.fs.path.join('foo', '.packages')}',
       '-Ddart.vm.profile=true',
       '-DFOO=bar',
       '-DBAZ=qux',
       environment.buildDir.childFile('main.dart').absolute.path,
     ];
-    verify(processManager.run(expected)).called(1);
+    verify(globals.processManager.run(expected)).called(1);
   }, overrides: <Type, Generator>{
     ProcessManager: () => MockProcessManager(),
   }));
@@ -323,7 +324,7 @@
     }
 
     // Should not attempt to run any processes.
-    verifyNever(processManager.run(any));
+    verifyNever(globals.processManager.run(any));
   }, overrides: <Type, Generator>{
     ProcessManager: () => MockProcessManager(),
   }));
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart
index 4e28a9e..acce757 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart
@@ -4,11 +4,13 @@
 
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/build_system/targets/windows.dart';
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
 
 import '../../../src/common.dart';
 import '../../../src/fake_process_manager.dart';
@@ -33,23 +35,23 @@
     when(platform.pathSeparator).thenReturn(r'\');
     testbed = Testbed(setup: () {
       environment = Environment(
-        outputDir: fs.currentDirectory,
-        projectDir: fs.currentDirectory,
+        outputDir: globals.fs.currentDirectory,
+        projectDir: globals.fs.currentDirectory,
       );
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_export.h').createSync(recursive: true);
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_messenger.h').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.exp').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.lib').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.pdb').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\lutter_export.h').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_messenger.h').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_plugin_registrar.h').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.h').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\icudtl.dat').createSync();
-      fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\cpp_client_wrapper\foo').createSync(recursive: true);
-      fs.file(r'C:\packages\flutter_tools\lib\src\build_system\targets\windows.dart').createSync(recursive: true);
-      fs.directory('windows').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_export.h').createSync(recursive: true);
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_messenger.h').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.exp').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.lib').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.dll.pdb').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\lutter_export.h').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_messenger.h').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_plugin_registrar.h').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_windows.h').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\icudtl.dat').createSync();
+      globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\cpp_client_wrapper\foo').createSync(recursive: true);
+      globals.fs.file(r'C:\packages\flutter_tools\lib\src\build_system\targets\windows.dart').createSync(recursive: true);
+      globals.fs.directory('windows').createSync();
     }, overrides: <Type, Generator>{
       FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows),
       ProcessManager: () => FakeProcessManager.any(),
@@ -60,18 +62,18 @@
   test('Copies files to correct cache directory', () => testbed.run(() async {
     await buildSystem.build(const UnpackWindows(), environment);
 
-    expect(fs.file(r'C:\windows\flutter\flutter_export.h').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_messenger.h').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_windows.dll').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_windows.dll.exp').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_windows.dll.lib').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_windows.dll.pdb').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_export.h').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_messenger.h').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_plugin_registrar.h').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\flutter_windows.h').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\icudtl.dat').existsSync(), true);
-    expect(fs.file(r'C:\windows\flutter\cpp_client_wrapper\foo').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_export.h').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_messenger.h').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_windows.dll').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_windows.dll.exp').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_windows.dll.lib').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_windows.dll.pdb').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_export.h').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_messenger.h').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_plugin_registrar.h').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_windows.h').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\icudtl.dat').existsSync(), true);
+    expect(globals.fs.file(r'C:\windows\flutter\cpp_client_wrapper\foo').existsSync(), true);
   }));
 
   test('Does not re-copy files unecessarily', () => testbed.run(() async {
@@ -79,10 +81,10 @@
     // Set a date in the far distant past to deal with the limited resolution
     // of the windows filesystem.
     final DateTime theDistantPast = DateTime(1991, 8, 23);
-    fs.file(r'C:\windows\flutter\flutter_export.h').setLastModifiedSync(theDistantPast);
+    globals.fs.file(r'C:\windows\flutter\flutter_export.h').setLastModifiedSync(theDistantPast);
     await buildSystem.build(const UnpackWindows(), environment);
 
-    expect(fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified, equals(theDistantPast));
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified, equals(theDistantPast));
   }));
 
   test('Detects changes in input cache files', () => testbed.run(() async {
@@ -90,13 +92,13 @@
     // Set a date in the far distant past to deal with the limited resolution
     // of the windows filesystem.
     final DateTime theDistantPast = DateTime(1991, 8, 23);
-    fs.file(r'C:\windows\flutter\flutter_export.h').setLastModifiedSync(theDistantPast);
-    final DateTime modified = fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified;
-    fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_export.h').writeAsStringSync('asd'); // modify cache.
+    globals.fs.file(r'C:\windows\flutter\flutter_export.h').setLastModifiedSync(theDistantPast);
+    final DateTime modified = globals.fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified;
+    globals.fs.file(r'C:\bin\cache\artifacts\engine\windows-x64\flutter_export.h').writeAsStringSync('asd'); // modify cache.
 
     await buildSystem.build(const UnpackWindows(), environment);
 
-    expect(fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified, isNot(modified));
+    expect(globals.fs.file(r'C:\windows\flutter\flutter_export.h').statSync().modified, isNot(modified));
   }));
 }
 
diff --git a/packages/flutter_tools/test/general.shard/bundle_shim_test.dart b/packages/flutter_tools/test/general.shard/bundle_shim_test.dart
index b4c1376..706bf73 100644
--- a/packages/flutter_tools/test/general.shard/bundle_shim_test.dart
+++ b/packages/flutter_tools/test/general.shard/bundle_shim_test.dart
@@ -3,11 +3,11 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/base/common.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/bundle.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../src/common.dart';
@@ -35,15 +35,15 @@
     await buildWithAssemble(
       buildMode: BuildMode.debug,
       flutterProject: FlutterProject.current(),
-      mainPath: fs.path.join('lib', 'main.dart'),
+      mainPath: globals.fs.path.join('lib', 'main.dart'),
       outputDir: 'example',
       targetPlatform: TargetPlatform.ios,
       depfilePath: 'example.d',
       precompiled: false,
     );
-    expect(fs.file(fs.path.join('example', 'kernel_blob.bin')).existsSync(), true);
-    expect(fs.file(fs.path.join('example', 'LICENSE')).existsSync(), true);
-    expect(fs.file(fs.path.join('example.d')).existsSync(), false);
+    expect(globals.fs.file(globals.fs.path.join('example', 'kernel_blob.bin')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('example', 'LICENSE')).existsSync(), true);
+    expect(globals.fs.file(globals.fs.path.join('example.d')).existsSync(), false);
   }));
 
   test('Handles build system failure', () => testbed.run(() {
diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart
index f77cf52..c0aaf67 100644
--- a/packages/flutter_tools/test/general.shard/cache_test.dart
+++ b/packages/flutter_tools/test/general.shard/cache_test.dart
@@ -5,7 +5,7 @@
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
 import 'package:file_testing/file_testing.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:meta/meta.dart';
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
@@ -19,6 +19,7 @@
 import 'package:flutter_tools/src/base/io.dart' show InternetAddress, SocketException;
 import 'package:flutter_tools/src/base/net.dart';
 import 'package:flutter_tools/src/base/os.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -94,8 +95,8 @@
     });
 
     testUsingContext('Continues on failed delete', () async {
-      final Directory artifactDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_artifact.');
-      final Directory downloadDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_download.');
+      final Directory artifactDir = globals.fs.systemTempDirectory.createTempSync('flutter_cache_test_artifact.');
+      final Directory downloadDir = globals.fs.systemTempDirectory.createTempSync('flutter_cache_test_download.');
       when(mockCache.getArtifactDirectory(any)).thenReturn(artifactDir);
       when(mockCache.getDownloadDir()).thenReturn(downloadDir);
       final File mockFile = MockFile();
@@ -116,10 +117,10 @@
 
     testUsingContext('Gradle wrapper should not be up to date, if some cached artifact is not available', () {
       final GradleWrapper gradleWrapper = GradleWrapper(mockCache);
-      final Directory directory = fs.directory('/Applications/flutter/bin/cache');
+      final Directory directory = globals.fs.directory('/Applications/flutter/bin/cache');
       directory.createSync(recursive: true);
-      fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradle', 'wrapper', 'gradle-wrapper.jar')).createSync(recursive: true);
-      when(mockCache.getCacheDir(fs.path.join('artifacts', 'gradle_wrapper'))).thenReturn(fs.directory(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper')));
+      globals.fs.file(globals.fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradle', 'wrapper', 'gradle-wrapper.jar')).createSync(recursive: true);
+      when(mockCache.getCacheDir(globals.fs.path.join('artifacts', 'gradle_wrapper'))).thenReturn(globals.fs.directory(globals.fs.path.join(directory.path, 'artifacts', 'gradle_wrapper')));
       expect(gradleWrapper.isUpToDateInner(), false);
     }, overrides: <Type, Generator>{
       Cache: () => mockCache,
@@ -129,13 +130,13 @@
 
     testUsingContext('Gradle wrapper should be up to date, only if all cached artifact are available', () {
       final GradleWrapper gradleWrapper = GradleWrapper(mockCache);
-      final Directory directory = fs.directory('/Applications/flutter/bin/cache');
+      final Directory directory = globals.fs.directory('/Applications/flutter/bin/cache');
       directory.createSync(recursive: true);
-      fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradle', 'wrapper', 'gradle-wrapper.jar')).createSync(recursive: true);
-      fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradlew')).createSync(recursive: true);
-      fs.file(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradlew.bat')).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradle', 'wrapper', 'gradle-wrapper.jar')).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradlew')).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join(directory.path, 'artifacts', 'gradle_wrapper', 'gradlew.bat')).createSync(recursive: true);
 
-      when(mockCache.getCacheDir(fs.path.join('artifacts', 'gradle_wrapper'))).thenReturn(fs.directory(fs.path.join(directory.path, 'artifacts', 'gradle_wrapper')));
+      when(mockCache.getCacheDir(globals.fs.path.join('artifacts', 'gradle_wrapper'))).thenReturn(globals.fs.directory(globals.fs.path.join(directory.path, 'artifacts', 'gradle_wrapper')));
       expect(gradleWrapper.isUpToDateInner(), true);
     }, overrides: <Type, Generator>{
       Cache: () => mockCache,
@@ -226,7 +227,7 @@
     });
 
     testUsingContext('Invalid URI for FLUTTER_STORAGE_BASE_URL throws ToolExit', () async {
-      when(platform.environment).thenReturn(const <String, String>{
+      when(globals.platform.environment).thenReturn(const <String, String>{
         'FLUTTER_STORAGE_BASE_URL': ' http://foo',
       });
       final Cache cache = Cache();
@@ -271,8 +272,8 @@
     });
 
     testUsingContext('makes binary dirs readable and executable by all', () async {
-      final Directory artifactDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_artifact.');
-      final Directory downloadDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_download.');
+      final Directory artifactDir = globals.fs.systemTempDirectory.createTempSync('flutter_cache_test_artifact.');
+      final Directory downloadDir = globals.fs.systemTempDirectory.createTempSync('flutter_cache_test_download.');
       when(mockCache.getArtifactDirectory(any)).thenReturn(artifactDir);
       when(mockCache.getDownloadDir()).thenReturn(downloadDir);
       final FakeCachedArtifact artifact = FakeCachedArtifact(
@@ -320,15 +321,15 @@
       final AndroidMavenArtifacts mavenArtifacts = AndroidMavenArtifacts();
       expect(mavenArtifacts.isUpToDate(), isFalse);
 
-      final Directory gradleWrapperDir = fs.systemTempDirectory.createTempSync('flutter_cache_test_gradle_wrapper.');
+      final Directory gradleWrapperDir = globals.fs.systemTempDirectory.createTempSync('flutter_cache_test_gradle_wrapper.');
       when(mockCache.getArtifactDirectory('gradle_wrapper')).thenReturn(gradleWrapperDir);
 
-      fs.directory(gradleWrapperDir.childDirectory('gradle').childDirectory('wrapper'))
+      globals.fs.directory(gradleWrapperDir.childDirectory('gradle').childDirectory('wrapper'))
           .createSync(recursive: true);
-      fs.file(fs.path.join(gradleWrapperDir.path, 'gradlew')).writeAsStringSync('irrelevant');
-      fs.file(fs.path.join(gradleWrapperDir.path, 'gradlew.bat')).writeAsStringSync('irrelevant');
+      globals.fs.file(globals.fs.path.join(gradleWrapperDir.path, 'gradlew')).writeAsStringSync('irrelevant');
+      globals.fs.file(globals.fs.path.join(gradleWrapperDir.path, 'gradlew.bat')).writeAsStringSync('irrelevant');
 
-      when(processManager.run(any, environment: captureAnyNamed('environment')))
+      when(globals.processManager.run(any, environment: captureAnyNamed('environment')))
         .thenAnswer((Invocation invocation) {
           final List<String> args = invocation.positionalArguments[0] as List<String>;
           expect(args.length, 6);
@@ -358,7 +359,7 @@
 
     testUsingContext('verifies executables for libimobiledevice in isUpToDateInner', () async {
       final IosUsbArtifacts iosUsbArtifacts = IosUsbArtifacts('libimobiledevice', mockCache);
-      when(mockCache.getArtifactDirectory(any)).thenReturn(fs.currentDirectory);
+      when(mockCache.getArtifactDirectory(any)).thenReturn(globals.fs.currentDirectory);
       iosUsbArtifacts.location.createSync();
       final File ideviceIdFile = iosUsbArtifacts.location.childFile('idevice_id')
         ..createSync();
@@ -378,7 +379,7 @@
 
     testUsingContext('Does not verify executables for openssl in isUpToDateInner', () async {
       final IosUsbArtifacts iosUsbArtifacts = IosUsbArtifacts('openssl', mockCache);
-      when(mockCache.getArtifactDirectory(any)).thenReturn(fs.currentDirectory);
+      when(mockCache.getArtifactDirectory(any)).thenReturn(globals.fs.currentDirectory);
       iosUsbArtifacts.location.createSync();
 
       expect(iosUsbArtifacts.isUpToDateInner(), true);
@@ -427,7 +428,7 @@
         mockPackageResolver.resolveUrl('fuchsia-debug-symbols-arm64', any),
       ]);
     });
-  }, skip: !platform.isLinux);
+  }, skip: !globals.platform.isLinux);
 }
 
 class FakeCachedArtifact extends EngineCachedArtifact {
diff --git a/packages/flutter_tools/test/general.shard/channel_test.dart b/packages/flutter_tools/test/general.shard/channel_test.dart
index dbd87fa..51e7cb5 100644
--- a/packages/flutter_tools/test/general.shard/channel_test.dart
+++ b/packages/flutter_tools/test/general.shard/channel_test.dart
@@ -9,6 +9,7 @@
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/cache.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/commands/channel.dart';
 import 'package:flutter_tools/src/version.dart';
 import 'package:mockito/mockito.dart';
@@ -180,7 +181,7 @@
         environment: anyNamed('environment'),
       )).thenAnswer((_) => Future<Process>.value(createMockProcess()));
 
-      final File versionCheckFile = Cache.instance.getStampFileFor(
+      final File versionCheckFile = globals.cache.getStampFileFor(
         VersionCheckStamp.flutterVersionCheckStampFile,
       );
 
diff --git a/packages/flutter_tools/test/general.shard/commands/build_aar_test.dart b/packages/flutter_tools/test/general.shard/commands/build_aar_test.dart
index 303dcd0..cfb15a4 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_aar_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_aar_test.dart
@@ -12,6 +12,7 @@
 import 'package:flutter_tools/src/commands/build_aar.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -27,7 +28,7 @@
     Directory tempDir;
 
     setUp(() {
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
     });
 
     tearDown(() {
@@ -94,7 +95,7 @@
       mockUsage = MockUsage();
       when(mockUsage.isFirstRun).thenReturn(true);
 
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
 
       mockProcessManager = MockProcessManager();
       when(mockProcessManager.run(any,
@@ -149,7 +150,7 @@
             arguments: <String>['--no-pub'],
           );
         }, throwsToolExit(
-          message: '[!] No Android SDK found. Try setting the ANDROID_HOME environment variable',
+          message: 'No Android SDK found. Try setting the ANDROID_HOME environment variable',
         ));
       },
       overrides: <Type, Generator>{
@@ -171,7 +172,7 @@
     'aar',
     '--no-pub',
     ...?arguments,
-    fs.path.join(target, 'lib', 'main.dart'),
+    globals.fs.path.join(target, 'lib', 'main.dart'),
   ]);
   return command;
 }
diff --git a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
index 88900ab..50569cb 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
@@ -9,11 +9,12 @@
 import 'package:flutter_tools/src/android/android_sdk.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build_apk.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -29,7 +30,7 @@
     Directory tempDir;
 
     setUp(() {
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
     });
 
     tearDown(() {
@@ -104,9 +105,9 @@
       mockUsage = MockUsage();
       when(mockUsage.isFirstRun).thenReturn(true);
 
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
-      gradlew = fs.path.join(tempDir.path, 'flutter_project', 'android',
-          platform.isWindows ? 'gradlew.bat' : 'gradlew');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+      gradlew = globals.fs.path.join(tempDir.path, 'flutter_project', 'android',
+          globals.platform.isWindows ? 'gradlew.bat' : 'gradlew');
 
       mockProcessManager = MockProcessManager();
       when(mockProcessManager.run(<String>[gradlew, '-v'],
@@ -170,7 +171,7 @@
             arguments: <String>['--no-pub'],
           );
         }, throwsToolExit(
-          message: '[!] No Android SDK found. Try setting the ANDROID_HOME environment variable',
+          message: 'No Android SDK found. Try setting the ANDROID_HOME environment variable',
         ));
       },
       overrides: <Type, Generator>{
@@ -192,7 +193,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=true',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -223,7 +224,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
           'assembleRelease',
@@ -246,7 +247,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=true',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -301,7 +302,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=true',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -352,7 +353,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=true',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -409,7 +410,7 @@
     'apk',
     ...?arguments,
     '--no-pub',
-    fs.path.join(target, 'lib', 'main.dart'),
+    globals.fs.path.join(target, 'lib', 'main.dart'),
   ]);
   return command;
 }
diff --git a/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart b/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
index bccbd0d..fc48b8d 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
@@ -9,11 +9,12 @@
 import 'package:flutter_tools/src/android/android_sdk.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/build_appbundle.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -29,7 +30,7 @@
     Directory tempDir;
 
     setUp(() {
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
     });
 
     tearDown(() {
@@ -83,14 +84,13 @@
     String gradlew;
     Usage mockUsage;
 
-
     setUp(() {
       mockUsage = MockUsage();
       when(mockUsage.isFirstRun).thenReturn(true);
 
-      tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
-      gradlew = fs.path.join(tempDir.path, 'flutter_project', 'android',
-          platform.isWindows ? 'gradlew.bat' : 'gradlew');
+      tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_packages_test.');
+      gradlew = globals.fs.path.join(tempDir.path, 'flutter_project', 'android',
+          globals.platform.isWindows ? 'gradlew.bat' : 'gradlew');
 
       mockProcessManager = MockProcessManager();
       when(mockProcessManager.run(<String>[gradlew, '-v'],
@@ -155,7 +155,7 @@
             arguments: <String>['--no-pub'],
           );
         }, throwsToolExit(
-          message: '[!] No Android SDK found. Try setting the ANDROID_HOME environment variable',
+          message: 'No Android SDK found. Try setting the ANDROID_HOME environment variable',
         ));
       },
       overrides: <Type, Generator>{
@@ -179,7 +179,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=false',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -212,7 +212,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=false',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
           'bundleRelease',
@@ -235,7 +235,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=false',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -290,7 +290,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=false',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -341,7 +341,7 @@
         <String>[
           gradlew,
           '-q',
-          '-Ptarget=${fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
+          '-Ptarget=${globals.fs.path.join(tempDir.path, 'flutter_project', 'lib', 'main.dart')}',
           '-Ptrack-widget-creation=false',
           '-Pshrink=true',
           '-Ptarget-platform=android-arm,android-arm64,android-x64',
@@ -398,7 +398,7 @@
     'appbundle',
     ...?arguments,
     '--no-pub',
-    fs.path.join(target, 'lib', 'main.dart'),
+    globals.fs.path.join(target, 'lib', 'main.dart'),
   ]);
   return command;
 }
diff --git a/packages/flutter_tools/test/general.shard/compile_batch_test.dart b/packages/flutter_tools/test/general.shard/compile_batch_test.dart
index 4b498a3..adf6027 100644
--- a/packages/flutter_tools/test/general.shard/compile_batch_test.dart
+++ b/packages/flutter_tools/test/general.shard/compile_batch_test.dart
@@ -5,13 +5,14 @@
 import 'dart:async';
 
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/convert.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../src/common.dart';
 import '../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/compile_expression_test.dart b/packages/flutter_tools/test/general.shard/compile_expression_test.dart
index fbb654b..eaa7f25 100644
--- a/packages/flutter_tools/test/general.shard/compile_expression_test.dart
+++ b/packages/flutter_tools/test/general.shard/compile_expression_test.dart
@@ -7,13 +7,13 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/convert.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../src/common.dart';
 import '../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart
index f11e9c6..9279c8b 100644
--- a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart
+++ b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart
@@ -7,13 +7,13 @@
 import 'package:flutter_tools/src/base/async_guard.dart';
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/convert.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../src/common.dart';
 import '../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/crash_reporting_test.dart b/packages/flutter_tools/test/general.shard/crash_reporting_test.dart
index 134a914..7a86004 100644
--- a/packages/flutter_tools/test/general.shard/crash_reporting_test.dart
+++ b/packages/flutter_tools/test/general.shard/crash_reporting_test.dart
@@ -12,14 +12,15 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/doctor.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/runner/flutter_command.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:http/http.dart';
 import 'package:http/testing.dart';
 import 'package:quiver/testing/async.dart';
+import 'package:platform/platform.dart';
 
 import '../src/common.dart';
 import '../src/context.dart';
@@ -251,7 +252,7 @@
   expect(crashInfo.fields['uuid'], '00000000-0000-4000-0000-000000000000');
   expect(crashInfo.fields['product'], 'Flutter_Tools');
   expect(crashInfo.fields['version'], 'test-version');
-  expect(crashInfo.fields['osName'], platform.operatingSystem);
+  expect(crashInfo.fields['osName'], globals.platform.operatingSystem);
   expect(crashInfo.fields['osVersion'], 'fake OS name and version');
   expect(crashInfo.fields['type'], 'DartError');
   expect(crashInfo.fields['error_runtime_type'], 'StateError');
diff --git a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart
index 8b5eae7..3e6911c 100644
--- a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart
+++ b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart
@@ -11,15 +11,16 @@
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/base/utils.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/dart/pub.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 import 'package:quiver/testing/async.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -258,7 +259,7 @@
           '--no-precompile',
         ],
         onRun: () {
-          fs.file('.packages')
+          globals.fs.file('.packages')
             ..setLastModifiedSync(DateTime(2002));
         }
       ),
@@ -278,7 +279,7 @@
           '--no-precompile',
         ],
         onRun: () {
-          fs.file('pubspec.yaml')
+          globals.fs.file('pubspec.yaml')
             ..setLastModifiedSync(DateTime(2002));
         }
       ),
@@ -293,35 +294,35 @@
     ]);
     await Testbed().run(() async {
       // the good scenario: .packages is old, pub updates the file.
-      fs.file('.packages')
+      globals.fs.file('.packages')
         ..createSync()
         ..setLastModifiedSync(DateTime(2000));
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..setLastModifiedSync(DateTime(2001));
       await pub.get(context: PubContext.flutterTests, checkLastModified: true); // pub sets date of .packages to 2002
       expect(testLogger.statusText, 'Running "flutter pub get" in /...\n');
       expect(testLogger.errorText, isEmpty);
-      expect(fs.file('pubspec.yaml').lastModifiedSync(), DateTime(2001)); // because nothing should touch it
-      expect(fs.file('.packages').lastModifiedSync(), isNot(DateTime(2000))); // because pub changes it to 2002
-      expect(fs.file('.packages').lastModifiedSync(), isNot(DateTime(2002))); // because we set the timestamp again after pub
+      expect(globals.fs.file('pubspec.yaml').lastModifiedSync(), DateTime(2001)); // because nothing should touch it
+      expect(globals.fs.file('.packages').lastModifiedSync(), isNot(DateTime(2000))); // because pub changes it to 2002
+      expect(globals.fs.file('.packages').lastModifiedSync(), isNot(DateTime(2002))); // because we set the timestamp again after pub
       testLogger.clear();
       // bad scenario 1: pub doesn't update file; doesn't matter, because we do instead
-      fs.file('.packages')
+      globals.fs.file('.packages')
         ..setLastModifiedSync(DateTime(2000));
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..setLastModifiedSync(DateTime(2001));
       await pub.get(context: PubContext.flutterTests, checkLastModified: true); // pub does nothing
       expect(testLogger.statusText, 'Running "flutter pub get" in /...\n');
       expect(testLogger.errorText, isEmpty);
-      expect(fs.file('pubspec.yaml').lastModifiedSync(), DateTime(2001)); // because nothing should touch it
-      expect(fs.file('.packages').lastModifiedSync(), isNot(DateTime(2000))); // because we set the timestamp
-      expect(fs.file('.packages').lastModifiedSync(), isNot(DateTime(2002))); // just in case FakeProcessManager is buggy
+      expect(globals.fs.file('pubspec.yaml').lastModifiedSync(), DateTime(2001)); // because nothing should touch it
+      expect(globals.fs.file('.packages').lastModifiedSync(), isNot(DateTime(2000))); // because we set the timestamp
+      expect(globals.fs.file('.packages').lastModifiedSync(), isNot(DateTime(2002))); // just in case FakeProcessManager is buggy
       testLogger.clear();
       // bad scenario 2: pub changes pubspec.yaml instead
-      fs.file('.packages')
+      globals.fs.file('.packages')
         ..setLastModifiedSync(DateTime(2000));
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..setLastModifiedSync(DateTime(2001));
       try {
         await pub.get(context: PubContext.flutterTests, checkLastModified: true);
@@ -332,12 +333,12 @@
       }
       expect(testLogger.statusText, 'Running "flutter pub get" in /...\n');
       expect(testLogger.errorText, isEmpty);
-      expect(fs.file('pubspec.yaml').lastModifiedSync(), DateTime(2002)); // because fake pub above touched it
-      expect(fs.file('.packages').lastModifiedSync(), DateTime(2000)); // because nothing touched it
+      expect(globals.fs.file('pubspec.yaml').lastModifiedSync(), DateTime(2002)); // because fake pub above touched it
+      expect(globals.fs.file('.packages').lastModifiedSync(), DateTime(2000)); // because nothing touched it
       // bad scenario 3: pubspec.yaml was created in the future
-      fs.file('.packages')
+      globals.fs.file('.packages')
         ..setLastModifiedSync(DateTime(2000));
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..setLastModifiedSync(DateTime(9999));
       assert(DateTime(9999).isAfter(DateTime.now()));
       await pub.get(context: PubContext.flutterTests, checkLastModified: true); // pub does nothing
diff --git a/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart b/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart
index 90f3535..9d864c1 100644
--- a/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart
+++ b/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart
@@ -9,6 +9,7 @@
 import 'package:flutter_tools/src/dart/analysis.dart';
 import 'package:flutter_tools/src/dart/pub.dart';
 import 'package:flutter_tools/src/dart/sdk.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -23,10 +24,10 @@
 void testSampleProject(String lib, String member) {
   testUsingContext('contains dart:$lib', () async {
     Cache.disableLocking();
-    final Directory projectDirectory = fs.systemTempDirectory.createTempSync('flutter_sdk_validation_${lib}_test.').absolute;
+    final Directory projectDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_sdk_validation_${lib}_test.').absolute;
 
     try {
-      final File pubspecFile = fs.file(fs.path.join(projectDirectory.path, 'pubspec.yaml'));
+      final File pubspecFile = globals.fs.file(globals.fs.path.join(projectDirectory.path, 'pubspec.yaml'));
       pubspecFile.writeAsStringSync('''
 name: ${lib}_project
 dependencies:
@@ -34,7 +35,7 @@
     sdk: flutter
 ''');
 
-      final File dartFile = fs.file(fs.path.join(projectDirectory.path, 'lib', 'main.dart'));
+      final File dartFile = globals.fs.file(globals.fs.path.join(projectDirectory.path, 'lib', 'main.dart'));
       dartFile.parent.createSync();
       dartFile.writeAsStringSync('''
 import 'dart:$lib' as $lib;
diff --git a/packages/flutter_tools/test/general.shard/devfs_test.dart b/packages/flutter_tools/test/general.shard/devfs_test.dart
index ce6e0e5..f56b6f0 100644
--- a/packages/flutter_tools/test/general.shard/devfs_test.dart
+++ b/packages/flutter_tools/test/general.shard/devfs_test.dart
@@ -14,6 +14,7 @@
 import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/devfs.dart';
 import 'package:flutter_tools/src/vmservice.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:json_rpc_2/json_rpc_2.dart' as rpc;
 import 'package:mockito/mockito.dart';
 
@@ -29,7 +30,7 @@
 
   setUpAll(() {
     fs = MemoryFileSystem();
-    filePath = fs.path.join('lib', 'foo.txt');
+    filePath = globals.fs.path.join('lib', 'foo.txt');
   });
 
   group('DevFSContent', () {
@@ -61,7 +62,7 @@
       expect(content.isModified, isFalse);
     });
     testUsingContext('file', () async {
-      final File file = fs.file(filePath);
+      final File file = globals.fs.file(filePath);
       final DevFSFileContent content = DevFSFileContent(file);
       expect(content.isModified, isFalse);
       expect(content.isModified, isFalse);
@@ -110,7 +111,7 @@
     });
 
     testUsingContext('retry uploads when failure', () async {
-      final File file = fs.file(fs.path.join(basePath, filePath));
+      final File file = globals.fs.file(globals.fs.path.join(basePath, filePath));
       await file.parent.create(recursive: true);
       file.writeAsBytesSync(<int>[1, 2, 3]);
       // simulate package
@@ -188,7 +189,7 @@
 
     testUsingContext('create dev file system', () async {
       // simulate workspace
-      final File file = fs.file(fs.path.join(basePath, filePath));
+      final File file = globals.fs.file(globals.fs.path.join(basePath, filePath));
       await file.parent.create(recursive: true);
       file.writeAsBytesSync(<int>[1, 2, 3]);
 
@@ -230,7 +231,7 @@
 
     testUsingContext('cleanup preexisting file system', () async {
       // simulate workspace
-      final File file = fs.file(fs.path.join(basePath, filePath));
+      final File file = globals.fs.file(globals.fs.path.join(basePath, filePath));
       await file.parent.create(recursive: true);
       file.writeAsBytesSync(<int>[1, 2, 3]);
 
@@ -297,7 +298,7 @@
         outputPath: anyNamed('outputPath'),
         packagesFilePath: anyNamed('packagesFilePath'),
       )).thenAnswer((Invocation invocation) {
-        fs.file('example').createSync();
+        globals.fs.file('example').createSync();
         return Future<CompilerOutput>.value(CompilerOutput('example', 0, <Uri>[sourceFile.uri]));
       });
 
@@ -417,7 +418,7 @@
 final Map <String, Uri> _packages = <String, Uri>{};
 
 Directory _newTempDir(FileSystem fs) {
-  final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_devfs${_tempDirs.length}_test.');
+  final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_devfs${_tempDirs.length}_test.');
   _tempDirs.add(tempDir);
   return tempDir;
 }
@@ -430,21 +431,21 @@
 
 Future<File> _createPackage(FileSystem fs, String pkgName, String pkgFileName, { bool doubleSlash = false }) async {
   final Directory pkgTempDir = _newTempDir(fs);
-  String pkgFilePath = fs.path.join(pkgTempDir.path, pkgName, 'lib', pkgFileName);
+  String pkgFilePath = globals.fs.path.join(pkgTempDir.path, pkgName, 'lib', pkgFileName);
   if (doubleSlash) {
     // Force two separators into the path.
-    final String doubleSlash = fs.path.separator + fs.path.separator;
-    pkgFilePath = pkgTempDir.path + doubleSlash + fs.path.join(pkgName, 'lib', pkgFileName);
+    final String doubleSlash = globals.fs.path.separator + globals.fs.path.separator;
+    pkgFilePath = pkgTempDir.path + doubleSlash + globals.fs.path.join(pkgName, 'lib', pkgFileName);
   }
-  final File pkgFile = fs.file(pkgFilePath);
+  final File pkgFile = globals.fs.file(pkgFilePath);
   await pkgFile.parent.create(recursive: true);
   pkgFile.writeAsBytesSync(<int>[11, 12, 13]);
-  _packages[pkgName] = fs.path.toUri(pkgFile.parent.path);
+  _packages[pkgName] = globals.fs.path.toUri(pkgFile.parent.path);
   final StringBuffer sb = StringBuffer();
   _packages.forEach((String pkgName, Uri pkgUri) {
     sb.writeln('$pkgName:$pkgUri');
   });
-  return fs.file(fs.path.join(_tempDirs[0].path, '.packages'))
+  return globals.fs.file(globals.fs.path.join(_tempDirs[0].path, '.packages'))
     ..writeAsStringSync(sb.toString());
 }
 
diff --git a/packages/flutter_tools/test/general.shard/features_test.dart b/packages/flutter_tools/test/general.shard/features_test.dart
index 5891260..8dea6b0 100644
--- a/packages/flutter_tools/test/general.shard/features_test.dart
+++ b/packages/flutter_tools/test/general.shard/features_test.dart
@@ -4,9 +4,9 @@
 
 import 'package:flutter_tools/src/base/config.dart';
 import 'package:flutter_tools/src/features.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/version.dart';
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
 
 import '../src/common.dart';
 import '../src/testbed.dart';
diff --git a/packages/flutter_tools/test/general.shard/flutter_platform_test.dart b/packages/flutter_tools/test/general.shard/flutter_platform_test.dart
index 26d00d6..fb9f9f1 100644
--- a/packages/flutter_tools/test/general.shard/flutter_platform_test.dart
+++ b/packages/flutter_tools/test/general.shard/flutter_platform_test.dart
@@ -5,10 +5,10 @@
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/test/flutter_platform.dart';
 import 'package:meta/meta.dart';
 
+import 'package:platform/platform.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 import 'package:test_core/backend.dart'; // ignore: deprecated_member_use
diff --git a/packages/flutter_tools/test/general.shard/forbidden_imports_test.dart b/packages/flutter_tools/test/general.shard/forbidden_imports_test.dart
index bd74954..dce6b55 100644
--- a/packages/flutter_tools/test/general.shard/forbidden_imports_test.dart
+++ b/packages/flutter_tools/test/general.shard/forbidden_imports_test.dart
@@ -3,20 +3,21 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 
 void main() {
-  final String flutterTools = fs.path.join(getFlutterRoot(), 'packages', 'flutter_tools');
+  final String flutterTools = globals.fs.path.join(getFlutterRoot(), 'packages', 'flutter_tools');
 
   test('no imports of commands/* or test/* in lib/src/*', () {
     final List<String> skippedPaths = <String> [
-      fs.path.join(flutterTools, 'lib', 'src', 'commands'),
-      fs.path.join(flutterTools, 'lib', 'src', 'test'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'commands'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'test'),
     ];
     bool _isNotSkipped(FileSystemEntity entity) => skippedPaths.every((String path) => !entity.path.startsWith(path));
 
-    final Iterable<File> files = fs.directory(fs.path.join(flutterTools, 'lib', 'src'))
+    final Iterable<File> files = globals.fs.directory(globals.fs.path.join(flutterTools, 'lib', 'src'))
       .listSync(recursive: true)
       .where(_isDartFile)
       .where(_isNotSkipped)
@@ -28,7 +29,7 @@
         }
         if (line.startsWith(RegExp(r'import.*commands/'))
          || line.startsWith(RegExp(r'import.*test/'))) {
-          final String relativePath = fs.path.relative(file.path, from:flutterTools);
+          final String relativePath = globals.fs.path.relative(file.path, from:flutterTools);
           fail('$relativePath imports $line. This import introduces a layering violation. '
                'Please find another way to access the information you are using.');
         }
@@ -36,15 +37,36 @@
     }
   });
 
+  test('no imports of globals without a global prefix', () {
+    final List<String> skippedPaths = <String> [];
+    bool _isNotSkipped(FileSystemEntity entity) => skippedPaths.every((String path) => !entity.path.startsWith(path));
+
+    final Iterable<File> files = globals.fs.directory(globals.fs.path.join(flutterTools, 'lib', 'src'))
+      .listSync(recursive: true)
+      .followedBy(globals.fs.directory(globals.fs.path.join(flutterTools, 'test',)).listSync(recursive: true))
+      .where(_isDartFile)
+      .where(_isNotSkipped)
+      .map(_asFile);
+    for (File file in files) {
+      for (String line in file.readAsLinesSync()) {
+        if (line.startsWith(RegExp(r'import.*globals.dart'))
+         && !line.contains(r'as globals')) {
+          final String relativePath = globals.fs.path.relative(file.path, from:flutterTools);
+          fail('$relativePath imports globals.dart without a globals prefix.');
+        }
+      }
+    }
+  });
+
   test('no unauthorized imports of dart:io', () {
     final List<String> whitelistedPaths = <String>[
-      fs.path.join(flutterTools, 'lib', 'src', 'base', 'io.dart'),
-      fs.path.join(flutterTools, 'lib', 'src', 'base', 'error_handling_file_system.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'base', 'io.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'base', 'error_handling_file_system.dart'),
     ];
     bool _isNotWhitelisted(FileSystemEntity entity) => whitelistedPaths.every((String path) => path != entity.path);
 
     for (String dirName in <String>['lib', 'bin']) {
-      final Iterable<File> files = fs.directory(fs.path.join(flutterTools, dirName))
+      final Iterable<File> files = globals.fs.directory(globals.fs.path.join(flutterTools, dirName))
         .listSync(recursive: true)
         .where(_isDartFile)
         .where(_isNotWhitelisted)
@@ -53,7 +75,7 @@
         for (String line in file.readAsLinesSync()) {
           if (line.startsWith(RegExp(r'import.*dart:io')) &&
               !line.contains('ignore: dart_io_import')) {
-            final String relativePath = fs.path.relative(file.path, from:flutterTools);
+            final String relativePath = globals.fs.path.relative(file.path, from:flutterTools);
             fail("$relativePath imports 'dart:io'; import 'lib/src/base/io.dart' instead");
           }
         }
@@ -63,15 +85,15 @@
 
   test('no unauthorized imports of test_api', () {
     final List<String> whitelistedPaths = <String>[
-      fs.path.join(flutterTools, 'lib', 'src', 'build_runner', 'build_script.dart'),
-      fs.path.join(flutterTools, 'lib', 'src', 'test', 'flutter_platform.dart'),
-      fs.path.join(flutterTools, 'lib', 'src', 'test', 'flutter_web_platform.dart'),
-      fs.path.join(flutterTools, 'lib', 'src', 'test', 'test_wrapper.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'build_runner', 'build_script.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'test', 'flutter_platform.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'test', 'flutter_web_platform.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'test', 'test_wrapper.dart'),
     ];
     bool _isNotWhitelisted(FileSystemEntity entity) => whitelistedPaths.every((String path) => path != entity.path);
 
     for (String dirName in <String>['lib']) {
-      final Iterable<File> files = fs.directory(fs.path.join(flutterTools, dirName))
+      final Iterable<File> files = globals.fs.directory(globals.fs.path.join(flutterTools, dirName))
         .listSync(recursive: true)
         .where(_isDartFile)
         .where(_isNotWhitelisted)
@@ -80,7 +102,7 @@
         for (String line in file.readAsLinesSync()) {
           if (line.startsWith(RegExp(r'import.*package:test_api')) &&
               !line.contains('ignore: test_api_import')) {
-            final String relativePath = fs.path.relative(file.path, from:flutterTools);
+            final String relativePath = globals.fs.path.relative(file.path, from:flutterTools);
             fail("$relativePath imports 'package:test_api/test_api.dart';");
           }
         }
@@ -89,9 +111,9 @@
   });
 
   test('no unauthorized imports of package:path', () {
-    final String whitelistedPath = fs.path.join(flutterTools, 'lib', 'src', 'build_runner', 'web_compilation_delegate.dart');
+    final String whitelistedPath = globals.fs.path.join(flutterTools, 'lib', 'src', 'build_runner', 'web_compilation_delegate.dart');
     for (String dirName in <String>['lib', 'bin', 'test']) {
-      final Iterable<File> files = fs.directory(fs.path.join(flutterTools, dirName))
+      final Iterable<File> files = globals.fs.directory(globals.fs.path.join(flutterTools, dirName))
         .listSync(recursive: true)
         .where(_isDartFile)
         .where((FileSystemEntity entity) => entity.path != whitelistedPath)
@@ -100,8 +122,8 @@
         for (String line in file.readAsLinesSync()) {
           if (line.startsWith(RegExp(r'import.*package:path/path.dart')) &&
               !line.contains('ignore: package_path_import')) {
-            final String relativePath = fs.path.relative(file.path, from:flutterTools);
-            fail("$relativePath imports 'package:path/path.dart'; use 'fs.path' instead");
+            final String relativePath = globals.fs.path.relative(file.path, from:flutterTools);
+            fail("$relativePath imports 'package:path/path.dart'; use 'globals.fs.path' instead");
           }
         }
       }
@@ -110,13 +132,13 @@
 
   test('no unauthorized imports of dart:convert', () {
     final List<String> whitelistedPaths = <String>[
-      fs.path.join(flutterTools, 'lib', 'src', 'convert.dart'),
-      fs.path.join(flutterTools, 'lib', 'src', 'base', 'error_handling_file_system.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'convert.dart'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'base', 'error_handling_file_system.dart'),
     ];
     bool _isNotWhitelisted(FileSystemEntity entity) => whitelistedPaths.every((String path) => path != entity.path);
 
     for (String dirName in <String>['lib']) {
-      final Iterable<File> files = fs.directory(fs.path.join(flutterTools, dirName))
+      final Iterable<File> files = globals.fs.directory(globals.fs.path.join(flutterTools, dirName))
         .listSync(recursive: true)
         .where(_isDartFile)
         .where(_isNotWhitelisted)
@@ -125,7 +147,7 @@
         for (String line in file.readAsLinesSync()) {
           if (line.startsWith(RegExp(r'import.*dart:convert')) &&
               !line.contains('ignore: dart_convert_import')) {
-            final String relativePath = fs.path.relative(file.path, from:flutterTools);
+            final String relativePath = globals.fs.path.relative(file.path, from:flutterTools);
             fail("$relativePath imports 'dart:convert'; import 'lib/src/convert.dart' instead");
           }
         }
@@ -135,14 +157,14 @@
 
   test('no unauthorized imports of build_runner', () {
     final List<String> whitelistedPaths = <String>[
-      fs.path.join(flutterTools, 'test', 'src', 'build_runner'),
-      fs.path.join(flutterTools, 'lib', 'src', 'build_runner'),
-      fs.path.join(flutterTools, 'lib', 'executable.dart'),
+      globals.fs.path.join(flutterTools, 'test', 'src', 'build_runner'),
+      globals.fs.path.join(flutterTools, 'lib', 'src', 'build_runner'),
+      globals.fs.path.join(flutterTools, 'lib', 'executable.dart'),
     ];
     bool _isNotWhitelisted(FileSystemEntity entity) => whitelistedPaths.every((String path) => !entity.path.contains(path));
 
     for (String dirName in <String>['lib']) {
-      final Iterable<File> files = fs.directory(fs.path.join(flutterTools, dirName))
+      final Iterable<File> files = globals.fs.directory(globals.fs.path.join(flutterTools, dirName))
         .listSync(recursive: true)
         .where(_isDartFile)
         .where(_isNotWhitelisted)
@@ -153,7 +175,7 @@
               line.startsWith(RegExp(r'import.*package:build_runner/build_runner.dart')) ||
               line.startsWith(RegExp(r'import.*package:build_config/build_config.dart')) ||
               line.startsWith(RegExp(r'import.*build_runner/.*.dart'))) {
-            final String relativePath = fs.path.relative(file.path, from:flutterTools);
+            final String relativePath = globals.fs.path.relative(file.path, from:flutterTools);
             fail('$relativePath imports a build_runner package');
           }
         }
diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart
index d009ea3..d5b4e58 100644
--- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart
@@ -25,7 +25,7 @@
 import 'package:flutter_tools/src/fuchsia/fuchsia_pm.dart';
 import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart';
 import 'package:flutter_tools/src/fuchsia/tiles_ctl.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/vmservice.dart';
 import 'package:meta/meta.dart';
@@ -81,8 +81,8 @@
 
     testUsingContext('default capabilities', () async {
       final FuchsiaDevice device = FuchsiaDevice('123');
-      fs.directory('fuchsia').createSync(recursive: true);
-      fs.file('pubspec.yaml').createSync();
+      globals.fs.directory('fuchsia').createSync(recursive: true);
+      globals.fs.file('pubspec.yaml').createSync();
 
       expect(device.supportsHotReload, true);
       expect(device.supportsHotRestart, false);
@@ -95,8 +95,8 @@
 
     testUsingContext('supported for project', () async {
       final FuchsiaDevice device = FuchsiaDevice('123');
-      fs.directory('fuchsia').createSync(recursive: true);
-      fs.file('pubspec.yaml').createSync();
+      globals.fs.directory('fuchsia').createSync(recursive: true);
+      globals.fs.file('pubspec.yaml').createSync();
       expect(device.isSupportedForProject(FlutterProject.current()), true);
     }, overrides: <Type, Generator>{
       FileSystem: () => memoryFileSystem,
@@ -105,7 +105,7 @@
 
     testUsingContext('not supported for project', () async {
       final FuchsiaDevice device = FuchsiaDevice('123');
-      fs.file('pubspec.yaml').createSync();
+      globals.fs.file('pubspec.yaml').createSync();
       expect(device.isSupportedForProject(FlutterProject.current()), false);
     }, overrides: <Type, Generator>{
       FileSystem: () => memoryFileSystem,
@@ -391,28 +391,28 @@
   });
 
   testUsingContext('Correct flutter runner', () async {
-    expect(artifacts.getArtifactPath(
+    expect(globals.artifacts.getArtifactPath(
         Artifact.fuchsiaFlutterRunner,
         platform: TargetPlatform.fuchsia_x64,
         mode: BuildMode.debug,
       ),
       contains('flutter_jit_runner'),
     );
-    expect(artifacts.getArtifactPath(
+    expect(globals.artifacts.getArtifactPath(
         Artifact.fuchsiaFlutterRunner,
         platform: TargetPlatform.fuchsia_x64,
         mode: BuildMode.profile,
       ),
       contains('flutter_aot_runner'),
     );
-    expect(artifacts.getArtifactPath(
+    expect(globals.artifacts.getArtifactPath(
         Artifact.fuchsiaFlutterRunner,
         platform: TargetPlatform.fuchsia_x64,
         mode: BuildMode.release,
       ),
       contains('flutter_aot_product_runner'),
     );
-    expect(artifacts.getArtifactPath(
+    expect(globals.artifacts.getArtifactPath(
         Artifact.fuchsiaFlutterRunner,
         platform: TargetPlatform.fuchsia_x64,
         mode: BuildMode.jitRelease,
@@ -475,20 +475,20 @@
     }) async {
       const String appName = 'app_name';
       final FuchsiaDevice device = FuchsiaDeviceWithFakeDiscovery('123');
-      fs.directory('fuchsia').createSync(recursive: true);
-      final File pubspecFile = fs.file('pubspec.yaml')..createSync();
+      globals.fs.directory('fuchsia').createSync(recursive: true);
+      final File pubspecFile = globals.fs.file('pubspec.yaml')..createSync();
       pubspecFile.writeAsStringSync('name: $appName');
 
       FuchsiaApp app;
       if (prebuilt) {
-        final File far = fs.file('app_name-0.far')..createSync();
+        final File far = globals.fs.file('app_name-0.far')..createSync();
         app = FuchsiaApp.fromPrebuiltApp(far);
       } else {
-        fs.file(fs.path.join('fuchsia', 'meta', '$appName.cmx'))
+        globals.fs.file(globals.fs.path.join('fuchsia', 'meta', '$appName.cmx'))
           ..createSync(recursive: true)
           ..writeAsStringSync('{}');
-        fs.file('.packages').createSync();
-        fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+        globals.fs.file('.packages').createSync();
+        globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
         app = BuildableFuchsiaApp(project: FlutterProject.current().fuchsia);
       }
 
@@ -518,10 +518,10 @@
     testUsingContext('start and stop prebuilt in release mode', () async {
       const String appName = 'app_name';
       final FuchsiaDevice device = FuchsiaDeviceWithFakeDiscovery('123');
-      fs.directory('fuchsia').createSync(recursive: true);
-      final File pubspecFile = fs.file('pubspec.yaml')..createSync();
+      globals.fs.directory('fuchsia').createSync(recursive: true);
+      final File pubspecFile = globals.fs.file('pubspec.yaml')..createSync();
       pubspecFile.writeAsStringSync('name: $appName');
-      final File far = fs.file('app_name-0.far')..createSync();
+      final File far = globals.fs.file('app_name-0.far')..createSync();
 
       final FuchsiaApp app = FuchsiaApp.fromPrebuiltApp(far);
       final DebuggingOptions debuggingOptions =
@@ -983,11 +983,11 @@
 
   @override
   Future<bool> init(String buildPath, String appName) async {
-    if (!fs.directory(buildPath).existsSync()) {
+    if (!globals.fs.directory(buildPath).existsSync()) {
       return false;
     }
-    fs
-        .file(fs.path.join(buildPath, 'meta', 'package'))
+    globals.fs
+        .file(globals.fs.path.join(buildPath, 'meta', 'package'))
         .createSync(recursive: true);
     _appName = appName;
     return true;
@@ -995,43 +995,43 @@
 
   @override
   Future<bool> genkey(String buildPath, String outKeyPath) async {
-    if (!fs.file(fs.path.join(buildPath, 'meta', 'package')).existsSync()) {
+    if (!globals.fs.file(globals.fs.path.join(buildPath, 'meta', 'package')).existsSync()) {
       return false;
     }
-    fs.file(outKeyPath).createSync(recursive: true);
+    globals.fs.file(outKeyPath).createSync(recursive: true);
     return true;
   }
 
   @override
   Future<bool> build(String buildPath, String keyPath, String manifestPath) async {
-    if (!fs.file(fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
-        !fs.file(keyPath).existsSync() ||
-        !fs.file(manifestPath).existsSync()) {
+    if (!globals.fs.file(globals.fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
+        !globals.fs.file(keyPath).existsSync() ||
+        !globals.fs.file(manifestPath).existsSync()) {
       return false;
     }
-    fs.file(fs.path.join(buildPath, 'meta.far')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join(buildPath, 'meta.far')).createSync(recursive: true);
     return true;
   }
 
   @override
   Future<bool> archive(String buildPath, String keyPath, String manifestPath) async {
-    if (!fs.file(fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
-        !fs.file(keyPath).existsSync() ||
-        !fs.file(manifestPath).existsSync()) {
+    if (!globals.fs.file(globals.fs.path.join(buildPath, 'meta', 'package')).existsSync() ||
+        !globals.fs.file(keyPath).existsSync() ||
+        !globals.fs.file(manifestPath).existsSync()) {
       return false;
     }
     if (_appName == null) {
       return false;
     }
-    fs
-        .file(fs.path.join(buildPath, '$_appName-0.far'))
+    globals.fs
+        .file(globals.fs.path.join(buildPath, '$_appName-0.far'))
         .createSync(recursive: true);
     return true;
   }
 
   @override
   Future<bool> newrepo(String repoPath) async {
-    if (!fs.directory(repoPath).existsSync()) {
+    if (!globals.fs.directory(repoPath).existsSync()) {
       return false;
     }
     return true;
@@ -1044,10 +1044,10 @@
 
   @override
   Future<bool> publish(String repoPath, String packagePath) async {
-    if (!fs.directory(repoPath).existsSync()) {
+    if (!globals.fs.directory(repoPath).existsSync()) {
       return false;
     }
-    if (!fs.file(packagePath).existsSync()) {
+    if (!globals.fs.file(packagePath).existsSync()) {
       return false;
     }
     return true;
@@ -1100,8 +1100,8 @@
   }) async {
     final String outDir = getFuchsiaBuildDirectory();
     final String appName = fuchsiaProject.project.manifest.appName;
-    final String manifestPath = fs.path.join(outDir, '$appName.dilpmanifest');
-    fs.file(manifestPath).createSync(recursive: true);
+    final String manifestPath = globals.fs.path.join(outDir, '$appName.dilpmanifest');
+    globals.fs.file(manifestPath).createSync(recursive: true);
   }
 }
 
diff --git a/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart b/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart
index 18b2c80..a0ff560 100644
--- a/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart
+++ b/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart
@@ -10,6 +10,7 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/doctor.dart';
 import 'package:flutter_tools/src/intellij/intellij.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -18,7 +19,7 @@
   FileSystem fs;
 
   void writeFileCreatingDirectories(String path, List<int> bytes) {
-    final File file = fs.file(path);
+    final File file = globals.fs.file(path);
     file.parent.createSync(recursive: true);
     file.writeAsBytesSync(bytes);
   }
@@ -40,7 +41,7 @@
 </idea-plugin>
 ''');
         writeFileCreatingDirectories(
-            fs.path.join(_kPluginsPath, 'Dart', 'lib', 'Dart.jar'),
+            globals.fs.path.join(_kPluginsPath, 'Dart', 'lib', 'Dart.jar'),
             ZipEncoder().encode(dartJarArchive));
 
         final Archive flutterJarArchive =
@@ -51,7 +52,7 @@
 </idea-plugin>
 ''');
         writeFileCreatingDirectories(
-            fs.path.join(_kPluginsPath, 'flutter-intellij.jar'),
+            globals.fs.path.join(_kPluginsPath, 'flutter-intellij.jar'),
             ZipEncoder().encode(flutterJarArchive));
 
         final List<ValidationMessage> messages = <ValidationMessage>[];
diff --git a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
index ff57bab..973bfa1 100644
--- a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
@@ -13,7 +13,7 @@
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/ios/code_signing.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:process/process.dart';
 
 import '../../src/common.dart';
@@ -316,7 +316,7 @@
       verify(mockOpenSslStdIn.write('This is a mock certificate'));
       expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '4444DDDD44'});
 
-      verify(config.setValue('ios-signing-cert', 'iPhone Developer: Profile 3 (3333CCCC33)'));
+      verify(globals.config.setValue('ios-signing-cert', 'iPhone Developer: Profile 3 (3333CCCC33)'));
     },
     overrides: <Type, Generator>{
       ProcessManager: () => mockProcessManager,
@@ -549,7 +549,7 @@
         contains('Certificate choice "iPhone Developer: Profile 3 (3333CCCC33)"'),
       );
       expect(signingConfigs, <String, String>{'DEVELOPMENT_TEAM': '4444DDDD44'});
-      verify(config.setValue('ios-signing-cert', 'iPhone Developer: Profile 3 (3333CCCC33)'));
+      verify(globals.config.setValue('ios-signing-cert', 'iPhone Developer: Profile 3 (3333CCCC33)'));
     },
     overrides: <Type, Generator>{
       ProcessManager: () => mockProcessManager,
diff --git a/packages/flutter_tools/test/general.shard/ios/devices_test.dart b/packages/flutter_tools/test/general.shard/ios/devices_test.dart
index f584891..4820ae2 100644
--- a/packages/flutter_tools/test/general.shard/ios/devices_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/devices_test.dart
@@ -24,6 +24,8 @@
 import 'package:flutter_tools/src/mdns_discovery.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:meta/meta.dart';
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
@@ -193,7 +195,7 @@
         mockIosDeploy = MockIOSDeploy();
         mockUsage = MockUsage();
 
-        tempDir = fs.systemTempDirectory.createTempSync('flutter_tools_create_test.');
+        tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_create_test.');
         projectDir = tempDir.childDirectory('flutter_project');
 
         when(
@@ -527,7 +529,7 @@
               projectDir.childDirectory('build/ios/iphoneos/Debug-arm64');
 
           // The -showBuildSettings calls have a timeout and so go through
-          // processManager.start().
+          // globals.processManager.start().
           mockProcessManager.processFactory = flakyProcessFactory(
             flakes: showBuildSettingsFlakes ? 1 : 0,
             delay: const Duration(seconds: 62),
@@ -919,7 +921,7 @@
     });
   });
   testUsingContext('IOSDevice.isSupportedForProject is true on module project', () async {
-    fs.file('pubspec.yaml')
+    globals.fs.file('pubspec.yaml')
       ..createSync()
       ..writeAsStringSync(r'''
 name: example
@@ -927,7 +929,7 @@
 flutter:
   module: {}
 ''');
-    fs.file('.packages').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(IOSDevice('test').isSupportedForProject(flutterProject), true);
@@ -937,9 +939,9 @@
     Platform: () => macPlatform,
   });
   testUsingContext('IOSDevice.isSupportedForProject is true with editable host app', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.directory('ios').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.directory('ios').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(IOSDevice('test').isSupportedForProject(flutterProject), true);
@@ -950,8 +952,8 @@
   });
 
   testUsingContext('IOSDevice.isSupportedForProject is false with no host app and no module', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(IOSDevice('test').isSupportedForProject(flutterProject), false);
@@ -973,7 +975,7 @@
 
   @override
   String get deviceBundlePath =>
-      fs.path.join(project.parent.directory.path, 'build', 'ios', 'iphoneos', name);
+      globals.fs.path.join(project.parent.directory.path, 'build', 'ios', 'iphoneos', name);
 
 }
 
diff --git a/packages/flutter_tools/test/general.shard/ios/mac_test.dart b/packages/flutter_tools/test/general.shard/ios/mac_test.dart
index 7a87dfa..ae846bf 100644
--- a/packages/flutter_tools/test/general.shard/ios/mac_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/mac_test.dart
@@ -13,6 +13,8 @@
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 import 'package:process/process.dart';
@@ -37,10 +39,10 @@
     final FakePlatform osx = FakePlatform.fromPlatform(const LocalPlatform())
       ..operatingSystem = 'macos';
     MockProcessManager mockProcessManager;
-    final String libimobiledevicePath = fs.path.join('bin', 'cache', 'artifacts', 'libimobiledevice');
-    final String ideviceIdPath = fs.path.join(libimobiledevicePath, 'idevice_id');
-    final String ideviceInfoPath = fs.path.join(libimobiledevicePath, 'ideviceinfo');
-    final String idevicescreenshotPath = fs.path.join(libimobiledevicePath, 'idevicescreenshot');
+    final String libimobiledevicePath = globals.fs.path.join('bin', 'cache', 'artifacts', 'libimobiledevice');
+    final String ideviceIdPath = globals.fs.path.join(libimobiledevicePath, 'idevice_id');
+    final String ideviceInfoPath = globals.fs.path.join(libimobiledevicePath, 'ideviceinfo');
+    final String idevicescreenshotPath = globals.fs.path.join(libimobiledevicePath, 'idevicescreenshot');
     MockArtifacts mockArtifacts;
     MockCache mockCache;
 
@@ -177,7 +179,7 @@
     });
 
     group('screenshot', () {
-      final String outputPath = fs.path.join('some', 'test', 'path', 'image.png');
+      final String outputPath = globals.fs.path.join('some', 'test', 'path', 'image.png');
       MockProcessManager mockProcessManager;
       MockFile mockOutputFile;
 
diff --git a/packages/flutter_tools/test/general.shard/ios/plist_parser_test.dart b/packages/flutter_tools/test/general.shard/ios/plist_parser_test.dart
index 6d4c74b..4f32aaf 100644
--- a/packages/flutter_tools/test/general.shard/ios/plist_parser_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/plist_parser_test.dart
@@ -8,6 +8,8 @@
 import 'package:file/file.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/ios/plist_parser.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:process/process.dart';
 
 import '../../src/common.dart';
@@ -48,7 +50,7 @@
         File file;
 
         setUp(() {
-          file = fs.file('foo.plist')..createSync();
+          file = globals.fs.file('foo.plist')..createSync();
         });
 
         tearDown(() {
diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
index 7eb77ef..153ac57 100644
--- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
@@ -18,6 +18,8 @@
 import 'package:flutter_tools/src/ios/simulators.dart';
 import 'package:flutter_tools/src/macos/xcode.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 import 'package:process/process.dart';
@@ -239,7 +241,7 @@
         when(mockXcode.minorVersion).thenReturn(2);
         expect(deviceUnderTest.supportsScreenshot, true);
         final MockFile mockFile = MockFile();
-        when(mockFile.path).thenReturn(fs.path.join('some', 'path', 'to', 'screenshot.png'));
+        when(mockFile.path).thenReturn(globals.fs.path.join('some', 'path', 'to', 'screenshot.png'));
         await deviceUnderTest.takeScreenshot(mockFile);
         verify(mockProcessManager.run(
           <String>[
@@ -248,7 +250,7 @@
             'io',
             'x',
             'screenshot',
-            fs.path.join('some', 'path', 'to', 'screenshot.png'),
+            globals.fs.path.join('some', 'path', 'to', 'screenshot.png'),
           ],
           environment: null,
           workingDirectory: null,
@@ -478,7 +480,7 @@
       final IOSSimulator device = IOSSimulator('x', name: 'iPhone SE', simulatorCategory: 'iOS 11.2');
       when(PlistParser.instance.getValueFromFile(any, any)).thenReturn('correct');
 
-      final Directory mockDir = fs.currentDirectory;
+      final Directory mockDir = globals.fs.currentDirectory;
       final IOSApp package = PrebuiltIOSApp(projectBundleId: 'incorrect', bundleName: 'name', bundleDir: mockDir);
 
       const BuildInfo mockInfo = BuildInfo(BuildMode.debug, 'flavor');
@@ -493,7 +495,7 @@
   });
 
   testUsingContext('IOSDevice.isSupportedForProject is true on module project', () async {
-    fs.file('pubspec.yaml')
+    globals.fs.file('pubspec.yaml')
       ..createSync()
       ..writeAsStringSync(r'''
 name: example
@@ -501,7 +503,7 @@
 flutter:
   module: {}
 ''');
-    fs.file('.packages').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(IOSSimulator('test').isSupportedForProject(flutterProject), true);
@@ -511,9 +513,9 @@
   });
 
   testUsingContext('IOSDevice.isSupportedForProject is true with editable host app', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.directory('ios').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.directory('ios').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(IOSSimulator('test').isSupportedForProject(flutterProject), true);
@@ -523,8 +525,8 @@
   });
 
   testUsingContext('IOSDevice.isSupportedForProject is false with no host app and no module', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(IOSSimulator('test').isSupportedForProject(flutterProject), false);
diff --git a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
index 17119f9..98544ec 100644
--- a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
@@ -11,6 +11,8 @@
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
 import 'package:platform/platform.dart';
 import 'package:process/process.dart';
@@ -418,7 +420,7 @@
       mockArtifacts = MockLocalEngineArtifacts();
       mockProcessManager = MockProcessManager();
       macOS = fakePlatform('macos');
-      fs.file(xcodebuild).createSync(recursive: true);
+      globals.fs.file(xcodebuild).createSync(recursive: true);
     });
 
     void testUsingOsxContext(String description, dynamic testMethod()) {
@@ -433,7 +435,7 @@
     testUsingOsxContext('sets ARCHS=armv7 when armv7 local engine is set', () async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.ios, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'ios_profile_arm'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'ios_profile_arm'));
 
       const BuildInfo buildInfo = BuildInfo(BuildMode.debug, null);
       final FlutterProject project = FlutterProject.fromPath('path/to/project');
@@ -442,13 +444,13 @@
         buildInfo: buildInfo,
       );
 
-      final File config = fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
+      final File config = globals.fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
       expect(config.existsSync(), isTrue);
 
       final String contents = config.readAsStringSync();
       expect(contents.contains('ARCHS=armv7'), isTrue);
 
-      final File buildPhaseScript = fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
+      final File buildPhaseScript = globals.fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
       expect(buildPhaseScript.existsSync(), isTrue);
 
       final String buildPhaseScriptContents = buildPhaseScript.readAsStringSync();
@@ -458,7 +460,7 @@
     testUsingOsxContext('sets TRACK_WIDGET_CREATION=true when trackWidgetCreation is true', () async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.ios, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'ios_profile_arm'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'ios_profile_arm'));
       const BuildInfo buildInfo = BuildInfo(BuildMode.debug, null, trackWidgetCreation: true);
       final FlutterProject project = FlutterProject.fromPath('path/to/project');
       await updateGeneratedXcodeProperties(
@@ -466,13 +468,13 @@
         buildInfo: buildInfo,
       );
 
-      final File config = fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
+      final File config = globals.fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
       expect(config.existsSync(), isTrue);
 
       final String contents = config.readAsStringSync();
       expect(contents.contains('TRACK_WIDGET_CREATION=true'), isTrue);
 
-      final File buildPhaseScript = fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
+      final File buildPhaseScript = globals.fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
       expect(buildPhaseScript.existsSync(), isTrue);
 
       final String buildPhaseScriptContents = buildPhaseScript.readAsStringSync();
@@ -482,7 +484,7 @@
     testUsingOsxContext('does not set TRACK_WIDGET_CREATION when trackWidgetCreation is false', () async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.ios, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'ios_profile_arm'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'ios_profile_arm'));
       const BuildInfo buildInfo = BuildInfo(BuildMode.debug, null);
       final FlutterProject project = FlutterProject.fromPath('path/to/project');
       await updateGeneratedXcodeProperties(
@@ -490,13 +492,13 @@
         buildInfo: buildInfo,
       );
 
-      final File config = fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
+      final File config = globals.fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
       expect(config.existsSync(), isTrue);
 
       final String contents = config.readAsStringSync();
       expect(contents.contains('TRACK_WIDGET_CREATION=true'), isFalse);
 
-      final File buildPhaseScript = fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
+      final File buildPhaseScript = globals.fs.file('path/to/project/ios/Flutter/flutter_export_environment.sh');
       expect(buildPhaseScript.existsSync(), isTrue);
 
       final String buildPhaseScriptContents = buildPhaseScript.readAsStringSync();
@@ -506,7 +508,7 @@
     testUsingOsxContext('sets ARCHS=armv7 when armv7 local engine is set', () async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.ios, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'ios_profile'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'ios_profile'));
       const BuildInfo buildInfo = BuildInfo(BuildMode.debug, null);
 
       final FlutterProject project = FlutterProject.fromPath('path/to/project');
@@ -515,7 +517,7 @@
         buildInfo: buildInfo,
       );
 
-      final File config = fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
+      final File config = globals.fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
       expect(config.existsSync(), isTrue);
 
       final String contents = config.readAsStringSync();
@@ -539,9 +541,9 @@
     }) async {
       when(mockArtifacts.getArtifactPath(Artifact.flutterFramework,
           platform: TargetPlatform.ios, mode: anyNamed('mode'))).thenReturn('engine');
-      when(mockArtifacts.engineOutPath).thenReturn(fs.path.join('out', 'ios'));
+      when(mockArtifacts.engineOutPath).thenReturn(globals.fs.path.join('out', 'ios'));
 
-      final File manifestFile = fs.file('path/to/project/pubspec.yaml');
+      final File manifestFile = globals.fs.file('path/to/project/pubspec.yaml');
       manifestFile.createSync(recursive: true);
       manifestFile.writeAsStringSync(manifestString);
 
@@ -553,7 +555,7 @@
         buildInfo: buildInfo,
       );
 
-      final File localPropertiesFile = fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
+      final File localPropertiesFile = globals.fs.file('path/to/project/ios/Flutter/Generated.xcconfig');
       expect(propertyFor('FLUTTER_BUILD_NAME', localPropertiesFile), expectedBuildName);
       expect(propertyFor('FLUTTER_BUILD_NUMBER', localPropertiesFile), expectedBuildNumber);
       expect(propertyFor('FLUTTER_BUILD_NUMBER', localPropertiesFile), isNotNull);
diff --git a/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart b/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart
index e8628e8..5bfe7b4 100644
--- a/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart
@@ -4,13 +4,15 @@
 
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/linux/application_package.dart';
 import 'package:flutter_tools/src/linux/linux_device.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
+
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -40,9 +42,9 @@
   });
 
   testUsingContext('LinuxDevice.isSupportedForProject is true with editable host app', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
-    fs.directory('linux').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
+    globals.fs.directory('linux').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(LinuxDevice().isSupportedForProject(flutterProject), true);
@@ -52,8 +54,8 @@
   });
 
   testUsingContext('LinuxDevice.isSupportedForProject is false with no host app', () async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file('.packages').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file('.packages').createSync();
     final FlutterProject flutterProject = FlutterProject.current();
 
     expect(LinuxDevice().isSupportedForProject(flutterProject), false);
diff --git a/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart b/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart
index dc4b761..095fcdc 100644
--- a/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart
+++ b/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/doctor.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/linux/linux_doctor.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
@@ -22,13 +23,13 @@
     });
 
     testUsingContext('Returns full validation when clang++ and make are availibe', () async {
-      when(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
+      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
         return FakeProcessResult(
           stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
           exitCode: 0,
         );
       });
-      when(processManager.run(<String>[
+      when(globals.processManager.run(<String>[
         'make',
         '--version',
       ])).thenAnswer((_) async {
@@ -49,13 +50,13 @@
     });
 
     testUsingContext('Returns partial validation when clang++ version is too old', () async {
-      when(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
+      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
         return FakeProcessResult(
           stdout: 'clang version 2.0.1-10 (tags/RELEASE_401/final)\njunk',
           exitCode: 0,
         );
       });
-      when(processManager.run(<String>[
+      when(globals.processManager.run(<String>[
         'make',
         '--version',
       ])).thenAnswer((_) async {
@@ -76,13 +77,13 @@
     });
 
     testUsingContext('Returns mising validation when make is not availible', () async {
-      when(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
+      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
         return FakeProcessResult(
           stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
           exitCode: 0,
         );
       });
-      when(processManager.run(<String>[
+      when(globals.processManager.run(<String>[
         'make',
         '--version',
       ])).thenAnswer((_) async {
@@ -103,13 +104,13 @@
     });
 
     testUsingContext('Returns mising validation when clang++ is not availible', () async {
-      when(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
+      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
         return FakeProcessResult(
           stdout: '',
           exitCode: 1,
         );
       });
-      when(processManager.run(<String>[
+      when(globals.processManager.run(<String>[
         'make',
         '--version',
       ])).thenAnswer((_) async {
@@ -131,13 +132,13 @@
 
 
     testUsingContext('Returns missing validation when clang and make are not availible', () async {
-      when(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
+      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
         return FakeProcessResult(
           stdout: '',
           exitCode: 1,
         );
       });
-      when(processManager.run(<String>[
+      when(globals.processManager.run(<String>[
         'make',
         '--version',
       ])).thenAnswer((_) async {
diff --git a/packages/flutter_tools/test/general.shard/linux/linux_workflow_test.dart b/packages/flutter_tools/test/general.shard/linux/linux_workflow_test.dart
index 0028765..5630431 100644
--- a/packages/flutter_tools/test/general.shard/linux/linux_workflow_test.dart
+++ b/packages/flutter_tools/test/general.shard/linux/linux_workflow_test.dart
@@ -4,8 +4,9 @@
 
 import 'package:flutter_tools/src/features.dart';
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/linux/linux_workflow.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
index 19ae134..ecd7e47 100644
--- a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
+++ b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
@@ -6,16 +6,17 @@
 
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
+import 'package:platform/platform.dart';
+import 'package:mockito/mockito.dart';
+import 'package:process/process.dart';
+
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:flutter_tools/src/macos/cocoapods.dart';
 import 'package:flutter_tools/src/plugins.dart';
 import 'package:flutter_tools/src/project.dart';
-import 'package:mockito/mockito.dart';
-import 'package:process/process.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart b/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart
index ed3affb..f88ebb1 100644
--- a/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart
@@ -7,14 +7,15 @@
 import 'package:flutter_tools/src/project.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/macos/application_package.dart';
 import 'package:flutter_tools/src/macos/macos_device.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -48,9 +49,9 @@
     });
 
     testUsingContext('isSupportedForProject is true with editable host app', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
-      fs.directory('macos').createSync();
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
+      globals.fs.directory('macos').createSync();
       final FlutterProject flutterProject = FlutterProject.current();
 
       expect(MacOSDevice().isSupportedForProject(flutterProject), true);
@@ -60,8 +61,8 @@
     });
 
     testUsingContext('isSupportedForProject is false with no host app', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
       final FlutterProject flutterProject = FlutterProject.current();
 
       expect(MacOSDevice().isSupportedForProject(flutterProject), false);
diff --git a/packages/flutter_tools/test/general.shard/macos/macos_workflow_test.dart b/packages/flutter_tools/test/general.shard/macos/macos_workflow_test.dart
index 6edd62e..b845326 100644
--- a/packages/flutter_tools/test/general.shard/macos/macos_workflow_test.dart
+++ b/packages/flutter_tools/test/general.shard/macos/macos_workflow_test.dart
@@ -4,10 +4,9 @@
 
 import 'package:flutter_tools/src/features.dart';
 import 'package:mockito/mockito.dart';
-
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/macos/macos_workflow.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/macos/xcode_test.dart b/packages/flutter_tools/test/general.shard/macos/xcode_test.dart
index 8a56721..90407de 100644
--- a/packages/flutter_tools/test/general.shard/macos/xcode_test.dart
+++ b/packages/flutter_tools/test/general.shard/macos/xcode_test.dart
@@ -3,11 +3,11 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/base/io.dart' show ProcessException, ProcessResult;
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:flutter_tools/src/macos/xcode.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart b/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart
index 9c86f7b..c03f3df 100644
--- a/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart
+++ b/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart
@@ -7,6 +7,7 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/convert.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../src/common.dart';
@@ -31,7 +32,7 @@
   setUp(() {
     mockFileSystem = MockFileSystem();
     mockFile = MockFile();
-    when(mockFileSystem.path).thenReturn(fs.path);
+    when(mockFileSystem.path).thenReturn(globals.fs.path);
     when(mockFileSystem.file(any)).thenReturn(mockFile);
     when(mockFile.readAsBytesSync()).thenReturn(utf8.encode(packagesContents) as Uint8List);
   });
@@ -65,7 +66,7 @@
   testUsingContext('multi-root maps main file from same package on multiroot scheme', () async {
     final MockFileSystem mockFileSystem = MockFileSystem();
     final MockFile mockFile = MockFile();
-    when(mockFileSystem.path).thenReturn(fs.path);
+    when(mockFileSystem.path).thenReturn(globals.fs.path);
     when(mockFileSystem.file(any)).thenReturn(mockFile);
     when(mockFile.readAsBytesSync())
         .thenReturn(utf8.encode(multiRootPackagesContents) as Uint8List);
diff --git a/packages/flutter_tools/test/general.shard/persistent_tool_state_test.dart b/packages/flutter_tools/test/general.shard/persistent_tool_state_test.dart
index f1778c9..b27257e 100644
--- a/packages/flutter_tools/test/general.shard/persistent_tool_state_test.dart
+++ b/packages/flutter_tools/test/general.shard/persistent_tool_state_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/persistent_tool_state.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/testbed.dart';
@@ -16,7 +17,7 @@
   });
 
   test('state can be set and persists', () => testbed.run(() {
-    final File stateFile = fs.file('.flutter_tool_state');
+    final File stateFile = globals.fs.file('.flutter_tool_state');
     final PersistentToolState state1 = PersistentToolState(stateFile);
     expect(state1.redisplayWelcomeMessage, null);
     state1.redisplayWelcomeMessage = true;
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 9d6dd39..3d251a5 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
@@ -4,9 +4,10 @@
 
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/run_hot.dart';
 
+import 'package:platform/platform.dart';
+
 import '../src/common.dart';
 
 // assumption: tests have a timeout less than 100 days
diff --git a/packages/flutter_tools/test/general.shard/project_test.dart b/packages/flutter_tools/test/general.shard/project_test.dart
index c8d3a09..d42a617 100644
--- a/packages/flutter_tools/test/general.shard/project_test.dart
+++ b/packages/flutter_tools/test/general.shard/project_test.dart
@@ -9,13 +9,13 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/features.dart';
 import 'package:flutter_tools/src/flutter_manifest.dart';
 import 'package:flutter_tools/src/ios/plist_parser.dart';
 import 'package:flutter_tools/src/ios/xcodeproj.dart';
 import 'package:flutter_tools/src/project.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:meta/meta.dart';
 import 'package:mockito/mockito.dart';
 
@@ -34,7 +34,7 @@
       });
 
       testInMemory('fails on invalid pubspec.yaml', () async {
-        final Directory directory = fs.directory('myproject');
+        final Directory directory = globals.fs.directory('myproject');
         directory.childFile('pubspec.yaml')
           ..createSync(recursive: true)
           ..writeAsStringSync(invalidPubspec);
@@ -46,7 +46,7 @@
       });
 
       testInMemory('fails on pubspec.yaml parse failure', () async {
-        final Directory directory = fs.directory('myproject');
+        final Directory directory = globals.fs.directory('myproject');
         directory.childFile('pubspec.yaml')
           ..createSync(recursive: true)
           ..writeAsStringSync(parseErrorPubspec);
@@ -58,7 +58,7 @@
       });
 
       testInMemory('fails on invalid example/pubspec.yaml', () async {
-        final Directory directory = fs.directory('myproject');
+        final Directory directory = globals.fs.directory('myproject');
         directory.childDirectory('example').childFile('pubspec.yaml')
           ..createSync(recursive: true)
           ..writeAsStringSync(invalidPubspec);
@@ -70,7 +70,7 @@
       });
 
       testInMemory('treats missing pubspec.yaml as empty', () async {
-        final Directory directory = fs.directory('myproject')
+        final Directory directory = globals.fs.directory('myproject')
           ..createSync(recursive: true);
         expect((FlutterProject.fromDirectory(directory)).manifest.isEmpty,
           true,
@@ -78,7 +78,7 @@
       });
 
       testInMemory('reads valid pubspec.yaml', () async {
-        final Directory directory = fs.directory('myproject');
+        final Directory directory = globals.fs.directory('myproject');
         directory.childFile('pubspec.yaml')
           ..createSync(recursive: true)
           ..writeAsStringSync(validPubspec);
@@ -89,7 +89,7 @@
       });
 
       testInMemory('sets up location', () async {
-        final Directory directory = fs.directory('myproject');
+        final Directory directory = globals.fs.directory('myproject');
         expect(
           FlutterProject.fromDirectory(directory).directory.absolute.path,
           directory.absolute.path,
@@ -100,7 +100,7 @@
         );
         expect(
           FlutterProject.current().directory.absolute.path,
-          fs.currentDirectory.absolute.path,
+          globals.fs.currentDirectory.absolute.path,
         );
       });
     });
@@ -154,7 +154,7 @@
     group('ensure ready for platform-specific tooling', () {
       testInMemory('does nothing, if project is not created', () async {
         final FlutterProject project = FlutterProject(
-          fs.directory('not_created'),
+          globals.fs.directory('not_created'),
           FlutterManifest.empty(),
           FlutterManifest.empty(),
         );
@@ -513,7 +513,7 @@
     });
 
     test('Handles asking for builders from an invalid pubspec', () => testbed.run(() {
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync(r'''
 # Hello, World
@@ -526,7 +526,7 @@
     }));
 
     test('Handles asking for builders from a trivial pubspec', () => testbed.run(() {
-      fs.file('pubspec.yaml')
+      globals.fs.file('pubspec.yaml')
         ..createSync()
         ..writeAsStringSync(r'''
 # Hello, World
@@ -542,7 +542,7 @@
 }
 
 Future<FlutterProject> someProject() async {
-  final Directory directory = fs.directory('some_project');
+  final Directory directory = globals.fs.directory('some_project');
   directory.childFile('.packages').createSync(recursive: true);
   directory.childDirectory('ios').createSync(recursive: true);
   final Directory androidDirectory = directory
@@ -555,7 +555,7 @@
 }
 
 Future<FlutterProject> aPluginProject({bool legacy = true}) async {
-  final Directory directory = fs.directory('plugin_project');
+  final Directory directory = globals.fs.directory('plugin_project');
   directory.childDirectory('ios').createSync(recursive: true);
   directory.childDirectory('android').createSync(recursive: true);
   directory.childDirectory('example').createSync(recursive: true);
@@ -593,7 +593,7 @@
 }
 
 Future<FlutterProject> aModuleProject() async {
-  final Directory directory = fs.directory('module_project');
+  final Directory directory = globals.fs.directory('module_project');
   directory.childFile('.packages').createSync(recursive: true);
   directory.childFile('pubspec.yaml').writeAsStringSync('''
 name: my_module
@@ -610,16 +610,16 @@
 void testInMemory(String description, Future<void> testMethod()) {
   Cache.flutterRoot = getFlutterRoot();
   final FileSystem testFileSystem = MemoryFileSystem(
-    style: platform.isWindows ? FileSystemStyle.windows : FileSystemStyle.posix,
+    style: globals.platform.isWindows ? FileSystemStyle.windows : FileSystemStyle.posix,
   );
   // Transfer needed parts of the Flutter installation folder
   // to the in-memory file system used during testing.
   transfer(Cache().getArtifactDirectory('gradle_wrapper'), testFileSystem);
-  transfer(fs.directory(Cache.flutterRoot)
+  transfer(globals.fs.directory(Cache.flutterRoot)
       .childDirectory('packages')
       .childDirectory('flutter_tools')
       .childDirectory('templates'), testFileSystem);
-  transfer(fs.directory(Cache.flutterRoot)
+  transfer(globals.fs.directory(Cache.flutterRoot)
       .childDirectory('packages')
       .childDirectory('flutter_tools')
       .childDirectory('schema'), testFileSystem);
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 187991f..19c4593 100644
--- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -15,7 +15,7 @@
 import 'package:flutter_tools/src/devfs.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/features.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/resident_runner.dart';
@@ -42,7 +42,7 @@
 
   setUp(() {
     testbed = Testbed(setup: () {
-      fs.file(fs.path.join('build', 'app.dill'))
+      globals.fs.file(globals.fs.path.join('build', 'app.dill'))
         ..createSync(recursive: true)
         ..writeAsStringSync('ABC');
       residentRunner = HotRunner(
@@ -352,7 +352,7 @@
       ],
       stayResident: false,
       debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
-      dillOutputPath: fs.path.join('foobar', 'app.dill'),
+      dillOutputPath: globals.fs.path.join('foobar', 'app.dill'),
     );
     expect(otherRunner.artifactDirectory.path, contains('foobar'));
   }));
@@ -566,7 +566,7 @@
   }));
 
   test('HotRunner writes vm service file when providing debugging option', () => testbed.run(() async {
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
     residentRunner = HotRunner(
       <FlutterDevice>[
         mockFlutterDevice,
@@ -582,13 +582,13 @@
     });
     await residentRunner.run();
 
-    expect(await fs.file('foo').readAsString(), testUri.toString());
+    expect(await globals.fs.file('foo').readAsString(), testUri.toString());
   }));
 
   test('HotRunner unforwards device ports', () => testbed.run(() async {
     final MockDevicePortForwarder mockPortForwarder = MockDevicePortForwarder();
     when(mockDevice.portForwarder).thenReturn(mockPortForwarder);
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
     residentRunner = HotRunner(
       <FlutterDevice>[
         mockFlutterDevice,
@@ -613,7 +613,7 @@
   }));
 
   test('HotRunner handles failure to write vmservice file', () => testbed.run(() async {
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
     residentRunner = HotRunner(
       <FlutterDevice>[
         mockFlutterDevice,
@@ -636,7 +636,7 @@
 
 
   test('ColdRunner writes vm service file when providing debugging option', () => testbed.run(() async {
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
     residentRunner = ColdRunner(
       <FlutterDevice>[
         mockFlutterDevice,
@@ -652,7 +652,7 @@
     });
     await residentRunner.run();
 
-    expect(await fs.file('foo').readAsString(), testUri.toString());
+    expect(await globals.fs.file('foo').readAsString(), testUri.toString());
   }));
 
   test('FlutterDevice uses dartdevc configuration when targeting web', () => testbed.run(() async {
@@ -671,10 +671,10 @@
 
     expect(residentCompiler.targetModel, TargetModel.dartdevc);
     expect(residentCompiler.sdkRoot,
-      artifacts.getArtifactPath(Artifact.flutterWebSdk, mode: BuildMode.debug) + '/');
+      globals.artifacts.getArtifactPath(Artifact.flutterWebSdk, mode: BuildMode.debug) + '/');
     expect(
       residentCompiler.platformDill,
-      fs.file(artifacts.getArtifactPath(Artifact.webPlatformKernelDill, mode: BuildMode.debug))
+      globals.fs.file(globals.artifacts.getArtifactPath(Artifact.webPlatformKernelDill, mode: BuildMode.debug))
         .absolute.uri.toString(),
     );
   }, overrides: <Type, Generator>{
diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_cold_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_cold_test.dart
index ebf2127..854c39f 100644
--- a/packages/flutter_tools/test/general.shard/resident_web_runner_cold_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_web_runner_cold_test.dart
@@ -6,12 +6,11 @@
 
 import 'package:dwds/dwds.dart';
 import 'package:flutter_tools/src/base/common.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/logger.dart';
 import 'package:flutter_tools/src/base/net.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/device.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/resident_runner.dart';
 import 'package:flutter_tools/src/build_runner/resident_web_runner.dart';
@@ -65,15 +64,15 @@
   });
 
   void _setupMocks() {
-    fs.file('pubspec.yaml').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-    fs.file(fs.path.join('web', 'index.html')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join('web', 'index.html')).createSync(recursive: true);
     when(mockWebFs.connect(any)).thenThrow(StateError('debugging not supported'));
   }
 
   test('Can successfully run and connect without vmservice', () => testbed.run(() async {
     _setupMocks();
-    final DelegateLogger delegateLogger = logger as DelegateLogger;
+    final DelegateLogger delegateLogger = globals.logger as DelegateLogger;
     final MockStatus mockStatus = MockStatus();
     delegateLogger.status = mockStatus;
     final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
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 9633014..da322c4 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
@@ -8,7 +8,6 @@
 import 'package:build_daemon/client.dart';
 import 'package:dwds/dwds.dart';
 import 'package:flutter_tools/src/base/common.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/logger.dart';
 import 'package:flutter_tools/src/base/net.dart';
@@ -19,7 +18,7 @@
 import 'package:flutter_tools/src/devfs.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/features.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/resident_runner.dart';
@@ -102,9 +101,9 @@
   });
 
   void _setupMocks() {
-    fs.file('pubspec.yaml').createSync();
-    fs.file(fs.path.join('lib', 'main.dart')).createSync(recursive: true);
-    fs.file(fs.path.join('web', 'index.html')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
+    globals.fs.file(globals.fs.path.join('web', 'index.html')).createSync(recursive: true);
     when(mockWebFs.connect(any)).thenAnswer((Invocation _) async {
       return ConnectionResult(mockAppConnection, mockDebugConnection);
     });
@@ -224,24 +223,24 @@
   }));
 
   test('Exits on run if application does not support the web', () => testbed.run(() async {
-    fs.file('pubspec.yaml').createSync();
+    globals.fs.file('pubspec.yaml').createSync();
 
     expect(await residentWebRunner.run(), 1);
     expect(testLogger.errorText, contains('This application is not configured to build on the web'));
   }));
 
   test('Exits on run if target file does not exist', () => testbed.run(() async {
-    fs.file('pubspec.yaml').createSync();
-    fs.file(fs.path.join('web', 'index.html')).createSync(recursive: true);
+    globals.fs.file('pubspec.yaml').createSync();
+    globals.fs.file(globals.fs.path.join('web', 'index.html')).createSync(recursive: true);
 
     expect(await residentWebRunner.run(), 1);
-    final String absoluteMain = fs.path.absolute(fs.path.join('lib', 'main.dart'));
+    final String absoluteMain = globals.fs.path.absolute(globals.fs.path.join('lib', 'main.dart'));
     expect(testLogger.errorText, contains('Tried to run $absoluteMain, but that file does not exist.'));
   }));
 
   test('Can successfully run and connect to vmservice', () => testbed.run(() async {
     _setupMocks();
-    final DelegateLogger delegateLogger = logger as DelegateLogger;
+    final DelegateLogger delegateLogger = globals.logger as DelegateLogger;
     final BufferLogger bufferLogger = delegateLogger.delegate as BufferLogger;
     final MockStatus status = MockStatus();
     delegateLogger.status = status;
@@ -832,14 +831,14 @@
     ));
     await connectionInfoCompleter.future;
 
-    expect(testLogger.statusText, contains('Launching ${fs.path.join('lib', 'main.dart')} on Chromez in debug mode'));
+    expect(testLogger.statusText, contains('Launching ${globals.fs.path.join('lib', 'main.dart')} on Chromez in debug mode'));
   }));
 
   test('Sends launched app.webLaunchUrl event for Chrome device', () => testbed.run(() async {
     _setupMocks();
     when(mockFlutterDevice.device).thenReturn(ChromeDevice());
 
-    final DelegateLogger delegateLogger = logger as DelegateLogger;
+    final DelegateLogger delegateLogger = globals.logger as DelegateLogger;
     final MockStatus mockStatus = MockStatus();
     delegateLogger.status = mockStatus;
     final ResidentWebRunner runner = DwdsWebRunnerFactory().createWebRunner(
@@ -859,7 +858,7 @@
     await connectionInfoCompleter.future;
 
     // Ensure we got the URL and that it was already launched.
-    verify(logger.sendEvent(
+    verify(globals.logger.sendEvent(
       'app.webLaunchUrl',
       argThat(allOf(
         containsPair('url', 'http://localhost:8765/app/'),
@@ -875,7 +874,7 @@
     _setupMocks();
     when(mockFlutterDevice.device).thenReturn(WebServerDevice());
 
-    final DelegateLogger delegateLogger = logger as DelegateLogger;
+    final DelegateLogger delegateLogger = globals.logger as DelegateLogger;
     final MockStatus mockStatus = MockStatus();
     delegateLogger.status = mockStatus;
     final ResidentWebRunner runner = DwdsWebRunnerFactory().createWebRunner(
@@ -895,7 +894,7 @@
     await connectionInfoCompleter.future;
 
     // Ensure we got the URL and that it was not already launched.
-    verify(logger.sendEvent(
+    verify(globals.logger.sendEvent(
       'app.webLaunchUrl',
       argThat(allOf(
         containsPair('url', 'http://localhost:8765/app/'),
@@ -1061,7 +1060,7 @@
 
   test('Rethrows unknown exception type from web tooling', () => testbed.run(() async {
     _setupMocks();
-    final DelegateLogger delegateLogger = logger as DelegateLogger;
+    final DelegateLogger delegateLogger = globals.logger as DelegateLogger;
     final MockStatus mockStatus = MockStatus();
     delegateLogger.status = mockStatus;
     final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>();
diff --git a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart
index 6bd474f..a1ae4e8 100644
--- a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart
+++ b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart
@@ -7,7 +7,6 @@
 
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/error_handling_file_system.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/signals.dart';
 import 'package:flutter_tools/src/base/time.dart';
@@ -15,6 +14,7 @@
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/runner/flutter_command.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../../src/common.dart';
@@ -70,7 +70,7 @@
     testUsingContext('uses the error handling file system', () async {
       final DummyFlutterCommand flutterCommand = DummyFlutterCommand(
         commandFunction: () async {
-          expect(fs, isA<ErrorHandlingFileSystem>());
+          expect(globals.fs, isA<ErrorHandlingFileSystem>());
           return const FlutterCommandResult(ExitStatus.success);
         }
       );
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 115e122..c6bc637 100644
--- a/packages/flutter_tools/test/general.shard/test_compiler_test.dart
+++ b/packages/flutter_tools/test/general.shard/test_compiler_test.dart
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/build_info.dart';
 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:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import '../src/common.dart';
@@ -21,9 +21,9 @@
     setUp(() {
       testbed = Testbed(
         setup: () async {
-          fs.file('pubspec.yaml').createSync();
-          fs.file('.packages').createSync();
-          fs.file('test/foo.dart').createSync(recursive: true);
+          globals.fs.file('pubspec.yaml').createSync();
+          globals.fs.file('.packages').createSync();
+          globals.fs.file('test/foo.dart').createSync(recursive: true);
           residentCompiler = MockResidentCompiler();
           testCompiler = FakeTestCompiler(
             BuildMode.debug,
@@ -41,12 +41,12 @@
         <Uri>[Uri.parse('test/foo.dart')],
         outputPath: testCompiler.outputDill.path,
       )).thenAnswer((Invocation invocation) async {
-        fs.file('abc.dill').createSync();
+        globals.fs.file('abc.dill').createSync();
         return const CompilerOutput('abc.dill', 0, <Uri>[]);
       });
 
       expect(await testCompiler.compile('test/foo.dart'), 'test/foo.dart.dill');
-      expect(fs.file('test/foo.dart.dill').existsSync(), true);
+      expect(globals.fs.file('test/foo.dart.dill').existsSync(), true);
     }));
 
     test('Reports null when a compile fails', () => testbed.run(() async {
@@ -55,12 +55,12 @@
         <Uri>[Uri.parse('test/foo.dart')],
         outputPath: testCompiler.outputDill.path,
       )).thenAnswer((Invocation invocation) async {
-        fs.file('abc.dill').createSync();
+        globals.fs.file('abc.dill').createSync();
         return const CompilerOutput('abc.dill', 1, <Uri>[]);
       });
 
       expect(await testCompiler.compile('test/foo.dart'), null);
-      expect(fs.file('test/foo.dart.dill').existsSync(), false);
+      expect(globals.fs.file('test/foo.dart.dill').existsSync(), false);
       verify(residentCompiler.shutdown()).called(1);
     }));
 
diff --git a/packages/flutter_tools/test/general.shard/testbed_test.dart b/packages/flutter_tools/test/general.shard/testbed_test.dart
index 7d1c396..6e10a6b 100644
--- a/packages/flutter_tools/test/general.shard/testbed_test.dart
+++ b/packages/flutter_tools/test/general.shard/testbed_test.dart
@@ -10,6 +10,7 @@
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/error_handling_file_system.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 import '../src/testbed.dart';
@@ -22,7 +23,7 @@
 
       FileSystem localFileSystem;
       await testbed.run(() {
-        localFileSystem = fs;
+        localFileSystem = globals.fs;
       });
 
       expect(localFileSystem, isA<ErrorHandlingFileSystem>());
diff --git a/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart b/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart
index a16ea4d..ea2eed1 100644
--- a/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart
+++ b/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart
@@ -7,36 +7,36 @@
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/artifacts.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/build_system/build_system.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/tester/flutter_tester.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
 import '../../src/mocks.dart';
 
 void main() {
-  MemoryFileSystem fs;
+  MemoryFileSystem fileSystem;
 
   setUp(() {
-    fs = MemoryFileSystem();
+    fileSystem = MemoryFileSystem();
   });
 
   group('FlutterTesterApp', () {
     testUsingContext('fromCurrentDirectory', () async {
       const String projectPath = '/home/my/projects/my_project';
-      await fs.directory(projectPath).create(recursive: true);
-      fs.currentDirectory = projectPath;
+      await fileSystem.directory(projectPath).create(recursive: true);
+      fileSystem.currentDirectory = projectPath;
 
       final FlutterTesterApp app = FlutterTesterApp.fromCurrentDirectory();
       expect(app.name, 'my_project');
-      expect(app.packagesFile.path, fs.path.join(projectPath, '.packages'));
+      expect(app.packagesFile.path, fileSystem.path.join(projectPath, '.packages'));
     }, overrides: <Type, Generator>{
-      FileSystem: () => fs,
+      FileSystem: () => fileSystem,
       ProcessManager: () => FakeProcessManager.any(),
     });
   });
@@ -106,7 +106,7 @@
 
       final Map<Type, Generator> startOverrides = <Type, Generator>{
         Platform: () => FakePlatform(operatingSystem: 'linux'),
-        FileSystem: () => fs,
+        FileSystem: () => fileSystem,
         ProcessManager: () => mockProcessManager,
         Artifacts: () => mockArtifacts,
         BuildSystem: () => mockBuildSystem,
@@ -114,23 +114,23 @@
 
       setUp(() {
         mockBuildSystem = MockBuildSystem();
-        flutterRoot = fs.path.join('home', 'me', 'flutter');
-        flutterTesterPath = fs.path.join(flutterRoot, 'bin', 'cache',
+        flutterRoot = fileSystem.path.join('home', 'me', 'flutter');
+        flutterTesterPath = fileSystem.path.join(flutterRoot, 'bin', 'cache',
             'artifacts', 'engine', 'linux-x64', 'flutter_tester');
-        final File flutterTesterFile = fs.file(flutterTesterPath);
+        final File flutterTesterFile = fileSystem.file(flutterTesterPath);
         flutterTesterFile.parent.createSync(recursive: true);
         flutterTesterFile.writeAsBytesSync(const <int>[]);
 
-        projectPath = fs.path.join('home', 'me', 'hello');
-        mainPath = fs.path.join(projectPath, 'lin', 'main.dart');
+        projectPath = fileSystem.path.join('home', 'me', 'hello');
+        mainPath = fileSystem.path.join(projectPath, 'lin', 'main.dart');
 
         mockProcessManager = MockProcessManager();
         mockProcessManager.processFactory =
             (List<String> commands) => mockProcess;
 
         mockArtifacts = MockArtifacts();
-        final String artifactPath = fs.path.join(flutterRoot, 'artifact');
-        fs.file(artifactPath).createSync(recursive: true);
+        final String artifactPath = fileSystem.path.join(flutterRoot, 'artifact');
+        fileSystem.file(artifactPath).createSync(recursive: true);
         when(mockArtifacts.getArtifactPath(
           any,
           mode: anyNamed('mode')
@@ -140,7 +140,7 @@
           any,
           any,
         )).thenAnswer((_) async {
-          fs.file('$mainPath.dill').createSync(recursive: true);
+          fileSystem.file('$mainPath.dill').createSync(recursive: true);
           return BuildResult(success: true);
         });
       });
diff --git a/packages/flutter_tools/test/general.shard/vscode_test.dart b/packages/flutter_tools/test/general.shard/vscode_test.dart
index afc4744..8e58859 100644
--- a/packages/flutter_tools/test/general.shard/vscode_test.dart
+++ b/packages/flutter_tools/test/general.shard/vscode_test.dart
@@ -7,7 +7,7 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/logger.dart';
 import 'package:flutter_tools/src/base/version.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/vscode/vscode.dart';
 
 import '../src/common.dart';
@@ -15,9 +15,9 @@
 
 void main() {
   testUsingContext('VsCode.fromDirectory does not crash when packages.json is malformed', () {
-    final BufferLogger bufferLogger = logger as BufferLogger;
+    final BufferLogger bufferLogger = globals.logger as BufferLogger;
     // Create invalid JSON file.
-    fs.file(fs.path.join('', 'resources', 'app', 'package.json'))
+    globals.fs.file(globals.fs.path.join('', 'resources', 'app', 'package.json'))
       ..createSync(recursive: true)
       ..writeAsStringSync('{');
 
diff --git a/packages/flutter_tools/test/general.shard/web/asset_server_test.dart b/packages/flutter_tools/test/general.shard/web/asset_server_test.dart
index c51b93c..d964a5b 100644
--- a/packages/flutter_tools/test/general.shard/web/asset_server_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/asset_server_test.dart
@@ -6,7 +6,7 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/build_runner/web_fs.dart';
-import 'package:flutter_tools/src/globals.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/project.dart';
 import 'package:shelf/shelf.dart';
 
@@ -28,18 +28,18 @@
   setUp(() {
     testbed = Testbed(
       setup: () {
-        fs.file(fs.path.join('lib', 'main.dart'))
+        globals.fs.file(globals.fs.path.join('lib', 'main.dart'))
           .createSync(recursive: true);
-        fs.file(fs.path.join('web', 'index.html'))
+        globals.fs.file(globals.fs.path.join('web', 'index.html'))
           ..createSync(recursive: true)
           ..writeAsStringSync('hello');
-        fs.file(fs.path.join('build', 'flutter_assets', 'foo.png'))
+        globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo.png'))
           ..createSync(recursive: true)
           ..writeAsBytesSync(kTransparentImage);
-        fs.file(fs.path.join('build', 'flutter_assets', 'bar'))
+        globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'bar'))
           ..createSync(recursive: true)
           ..writeAsBytesSync(<int>[1, 2, 3]);
-        assetServer = DebugAssetServer(FlutterProject.current(), fs.path.join('main'));
+        assetServer = DebugAssetServer(FlutterProject.current(), globals.fs.path.join('main'));
       }
     );
   });
@@ -56,8 +56,8 @@
   }));
 
   test('can serve a sourcemap from dart:ui', () => testbed.run(() async {
-    final String flutterWebSdkPath = artifacts.getArtifactPath(Artifact.flutterWebSdk);
-    final File windowSourceFile = fs.file(fs.path.join(flutterWebSdkPath, 'lib', 'ui', 'src', 'ui', 'window.dart'))
+    final String flutterWebSdkPath = globals.artifacts.getArtifactPath(Artifact.flutterWebSdk);
+    final File windowSourceFile = globals.fs.file(globals.fs.path.join(flutterWebSdkPath, 'lib', 'ui', 'src', 'ui', 'window.dart'))
       ..createSync(recursive: true)
       ..writeAsStringSync('test');
     final Response response = await assetServer
@@ -70,8 +70,8 @@
   }));
 
   test('can serve a sourcemap from the dart:sdk', () => testbed.run(() async {
-    final String dartSdkPath = artifacts.getArtifactPath(Artifact.engineDartSdkPath);
-    final File listSourceFile = fs.file(fs.path.join(dartSdkPath, 'lib', 'core', 'list.dart'))
+    final String dartSdkPath = globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath);
+    final File listSourceFile = globals.fs.file(globals.fs.path.join(dartSdkPath, 'lib', 'core', 'list.dart'))
       ..createSync(recursive: true)
       ..writeAsStringSync('test');
 
@@ -113,7 +113,7 @@
 
   test('release asset server serves correct mime type and content length for png', () => testbed.run(() async {
     assetServer = ReleaseAssetServer();
-    fs.file(fs.path.join('build', 'web', 'assets', 'foo.png'))
+    globals.fs.file(globals.fs.path.join('build', 'web', 'assets', 'foo.png'))
       ..createSync(recursive: true)
       ..writeAsBytesSync(kTransparentImage);
     final Response response = await assetServer
@@ -127,7 +127,7 @@
 
   test('release asset server serves correct mime type and content length for JavaScript', () => testbed.run(() async {
     assetServer = ReleaseAssetServer();
-    fs.file(fs.path.join('build', 'web', 'assets', 'foo.js'))
+    globals.fs.file(globals.fs.path.join('build', 'web', 'assets', 'foo.js'))
       ..createSync(recursive: true)
       ..writeAsStringSync('function main() {}');
     final Response response = await assetServer
@@ -141,7 +141,7 @@
 
   test('release asset server serves correct mime type and content length for html', () => testbed.run(() async {
     assetServer = ReleaseAssetServer();
-    fs.file(fs.path.join('build', 'web', 'assets', 'foo.html'))
+    globals.fs.file(globals.fs.path.join('build', 'web', 'assets', 'foo.html'))
       ..createSync(recursive: true)
       ..writeAsStringSync('<!doctype html><html></html>');
     final Response response = await assetServer
@@ -155,7 +155,7 @@
 
   test('release asset server serves content from flutter root', () => testbed.run(() async {
     assetServer = ReleaseAssetServer();
-    fs.file(fs.path.join('flutter', 'bar.dart'))
+    globals.fs.file(globals.fs.path.join('flutter', 'bar.dart'))
       ..createSync(recursive: true)
       ..writeAsStringSync('void main() { }');
     final Response response = await assetServer
@@ -166,7 +166,7 @@
 
   test('release asset server serves content from project directory', () => testbed.run(() async {
     assetServer = ReleaseAssetServer();
-    fs.file(fs.path.join('lib', 'bar.dart'))
+    globals.fs.file(globals.fs.path.join('lib', 'bar.dart'))
       ..createSync(recursive: true)
       ..writeAsStringSync('void main() { }');
     final Response response = await assetServer
diff --git a/packages/flutter_tools/test/general.shard/web/chrome_test.dart b/packages/flutter_tools/test/general.shard/web/chrome_test.dart
index 48ad64c..3e10239 100644
--- a/packages/flutter_tools/test/general.shard/web/chrome_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/chrome_test.dart
@@ -6,12 +6,12 @@
 
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/os.dart';
-import 'package:flutter_tools/src/base/platform.dart';
-import 'package:flutter_tools/src/base/process_manager.dart';
 import 'package:flutter_tools/src/convert.dart';
 import 'package:flutter_tools/src/web/chrome.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/mocks.dart';
@@ -36,7 +36,7 @@
       when(platform.environment).thenReturn(<String, String>{
         kChromeEnvironment: 'example_chrome',
       });
-      when(processManager.start(any))
+      when(globals.processManager.start(any))
         .thenAnswer((Invocation invocation) async {
         return FakeProcess(
           exitCode: exitCompleter.future,
@@ -69,13 +69,13 @@
     ];
 
     await chromeLauncher.launch('example_url', skipCheck: true);
-    final VerificationResult result = verify(processManager.start(captureAny));
+    final VerificationResult result = verify(globals.processManager.start(captureAny));
 
     expect(result.captured.single, containsAll(expected));
   }));
 
   test('can seed chrome temp directory with existing preferences', () => testbed.run(() async {
-    final Directory dataDir = fs.directory('chrome-stuff');
+    final Directory dataDir = globals.fs.directory('chrome-stuff');
     final File preferencesFile = dataDir
       .childDirectory('Default')
       .childFile('preferences');
@@ -84,10 +84,10 @@
       ..writeAsStringSync('example');
 
     await chromeLauncher.launch('example_url', skipCheck: true, dataDir: dataDir);
-    final VerificationResult result = verify(processManager.start(captureAny));
+    final VerificationResult result = verify(globals.processManager.start(captureAny));
     final String arg = (result.captured.single as List<String>)
       .firstWhere((String arg) => arg.startsWith('--user-data-dir='));
-    final Directory tempDirectory = fs.directory(arg.split('=')[1]);
+    final Directory tempDirectory = globals.fs.directory(arg.split('=')[1]);
     final File tempFile = tempDirectory
       .childDirectory('Default')
       .childFile('preferences');
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 3b735e7..1c63148 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
@@ -8,10 +8,11 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/convert.dart';
 import 'package:flutter_tools/src/web/devfs_web.dart';
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/testbed.dart';
@@ -87,18 +88,18 @@
   }));
 
   test('Handles against malformed manifest', () => testbed.run(() async {
-    final File source = fs.file('source')
+    final File source = globals.fs.file('source')
       ..writeAsStringSync('main() {}');
-    final File sourcemap = fs.file('sourcemap')
+    final File sourcemap = globals.fs.file('sourcemap')
       ..writeAsStringSync('{}');
 
     // Missing ending offset.
-    final File manifestMissingOffset = fs.file('manifestA')
+    final File manifestMissingOffset = globals.fs.file('manifestA')
       ..writeAsStringSync(json.encode(<String, Object>{'/foo.js': <String, Object>{
         'code': <int>[0],
         'sourcemap': <int>[0],
       }}));
-    final File manifestOutOfBounds = fs.file('manifest')
+    final File manifestOutOfBounds = globals.fs.file('manifest')
       ..writeAsStringSync(json.encode(<String, Object>{'/foo.js': <String, Object>{
         'code': <int>[0, 100],
         'sourcemap': <int>[0],
@@ -109,11 +110,11 @@
   }));
 
   test('serves JavaScript files from in memory cache', () => testbed.run(() async {
-    final File source = fs.file('source')
+    final File source = globals.fs.file('source')
       ..writeAsStringSync('main() {}');
-    final File sourcemap = fs.file('sourcemap')
+    final File sourcemap = globals.fs.file('sourcemap')
       ..writeAsStringSync('{}');
-    final File manifest = fs.file('manifest')
+    final File manifest = globals.fs.file('manifest')
       ..writeAsStringSync(json.encode(<String, Object>{'/foo.js': <String, Object>{
         'code': <int>[0, source.lengthSync()],
         'sourcemap': <int>[0, 2],
@@ -132,11 +133,11 @@
   }));
 
   test('serves JavaScript files from in memory cache on Windows', () => testbed.run(() async {
-    final File source = fs.file('source')
+    final File source = globals.fs.file('source')
       ..writeAsStringSync('main() {}');
-    final File sourcemap = fs.file('sourcemap')
+    final File sourcemap = globals.fs.file('sourcemap')
       ..writeAsStringSync('{}');
-    final File manifest = fs.file('manifest')
+    final File manifest = globals.fs.file('manifest')
       ..writeAsStringSync(json.encode(<String, Object>{'/C:/foo.js': <String, Object>{
         'code': <int>[0, source.lengthSync()],
         'sourcemap': <int>[0, 2],
@@ -167,11 +168,11 @@
   }));
 
   test('handles missing JavaScript files from in memory cache', () => testbed.run(() async {
-    final File source = fs.file('source')
+    final File source = globals.fs.file('source')
       ..writeAsStringSync('main() {}');
-    final File sourcemap = fs.file('sourcemap')
+    final File sourcemap = globals.fs.file('sourcemap')
       ..writeAsStringSync('{}');
-    final File manifest = fs.file('manifest')
+    final File manifest = globals.fs.file('manifest')
       ..writeAsStringSync(json.encode(<String, Object>{'/foo.js': <String, Object>{
         'code': <int>[0, source.lengthSync()],
         'sourcemap': <int>[0, 2],
@@ -186,7 +187,7 @@
   }));
 
   test('serves Dart files from in filesystem on Windows', () => testbed.run(() async {
-    final File source = fs.file('foo.dart').absolute
+    final File source = globals.fs.file('foo.dart').absolute
       ..createSync(recursive: true)
       ..writeAsStringSync('void main() {}');
 
@@ -201,7 +202,7 @@
   }));
 
   test('serves Dart files from in filesystem on Linux/macOS', () => testbed.run(() async {
-    final File source = fs.file('foo.dart').absolute
+    final File source = globals.fs.file('foo.dart').absolute
       ..createSync(recursive: true)
       ..writeAsStringSync('void main() {}');
 
@@ -224,7 +225,7 @@
   }));
 
   test('serves asset files from in filesystem with known mime type', () => testbed.run(() async {
-    final File source = fs.file(fs.path.join('build', 'flutter_assets', 'foo.png'))
+    final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo.png'))
       ..createSync(recursive: true)
       ..writeAsBytesSync(kTransparentImage);
 
@@ -238,7 +239,7 @@
   }));
 
   test('serves asset files from in filesystem with known mime type on Windows', () => testbed.run(() async {
-    final File source = fs.file(fs.path.join('build', 'flutter_assets', 'foo.png'))
+    final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo.png'))
       ..createSync(recursive: true)
       ..writeAsBytesSync(kTransparentImage);
 
@@ -255,7 +256,7 @@
 
 
   test('serves asset files files from in filesystem with unknown mime type and length > 12', () => testbed.run(() async {
-    final File source = fs.file(fs.path.join('build', 'flutter_assets', 'foo'))
+    final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo'))
       ..createSync(recursive: true)
       ..writeAsBytesSync(List<int>.filled(100, 0));
 
@@ -269,7 +270,7 @@
   }));
 
   test('serves asset files files from in filesystem with unknown mime type and length < 12', () => testbed.run(() async {
-    final File source = fs.file(fs.path.join('build', 'flutter_assets', 'foo'))
+    final File source = globals.fs.file(globals.fs.path.join('build', 'flutter_assets', 'foo'))
       ..createSync(recursive: true)
       ..writeAsBytesSync(<int>[1, 2, 3]);
 
diff --git a/packages/flutter_tools/test/general.shard/web/devices_test.dart b/packages/flutter_tools/test/general.shard/web/devices_test.dart
index 20afe07..47958a7 100644
--- a/packages/flutter_tools/test/general.shard/web/devices_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/devices_test.dart
@@ -3,12 +3,12 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/device.dart';
 import 'package:flutter_tools/src/web/chrome.dart';
 import 'package:flutter_tools/src/web/web_device.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
diff --git a/packages/flutter_tools/test/general.shard/web/golden_comparator_process_test.dart b/packages/flutter_tools/test/general.shard/web/golden_comparator_process_test.dart
index 2cc377b..127a635 100644
--- a/packages/flutter_tools/test/general.shard/web/golden_comparator_process_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/golden_comparator_process_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/test/flutter_web_platform.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../../src/common.dart';
 import '../../src/mocks.dart';
@@ -22,9 +23,9 @@
     MockProcess Function(String) createMockProcess;
 
     setUpAll(() {
-      imageFile = fs.file('test_image_file');
+      imageFile = globals.fs.file('test_image_file');
       goldenKey = Uri.parse('file://golden_key');
-      imageFile2 = fs.file('second_test_image_file');
+      imageFile2 = globals.fs.file('second_test_image_file');
       goldenKey2 = Uri.parse('file://second_golden_key');
       createMockProcess = (String stdout) => MockProcess(
         exitCode: Future<int>.value(0),
diff --git a/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart b/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart
index e2e1c74..eab269e 100644
--- a/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart
@@ -6,9 +6,9 @@
 import 'dart:convert';
 import 'dart:typed_data';
 
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/test/flutter_web_platform.dart';
 import 'package:flutter_tools/src/test/test_compiler.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -175,7 +175,7 @@
       expect(result, null);
 
       await comparator.close();
-      expect(fs.systemTempDirectory.listSync(recursive: true), isEmpty);
+      expect(globals.fs.systemTempDirectory.listSync(recursive: true), isEmpty);
     }));
   });
 }
diff --git a/packages/flutter_tools/test/general.shard/web/web_fs_test.dart b/packages/flutter_tools/test/general.shard/web/web_fs_test.dart
index dd372e3..a81216d 100644
--- a/packages/flutter_tools/test/general.shard/web/web_fs_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/web_fs_test.dart
@@ -7,7 +7,6 @@
 import 'package:built_collection/built_collection.dart';
 import 'package:dwds/asset_handler.dart';
 import 'package:dwds/dwds.dart';
-import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/os.dart';
 import 'package:flutter_tools/src/base/process.dart';
 import 'package:flutter_tools/src/build_info.dart';
@@ -15,6 +14,7 @@
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/web/chrome.dart';
 import 'package:flutter_tools/src/build_runner/web_fs.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:http_multi_server/http_multi_server.dart';
 import 'package:meta/meta.dart';
 import 'package:mockito/mockito.dart';
@@ -61,7 +61,7 @@
       environment: anyNamed('environment'),
     )).thenAnswer((Invocation invocation) async {
       final String workingDirectory = invocation.namedArguments[#workingDirectory] as String;
-      fs.file(fs.path.join(workingDirectory, '.packages')).createSync(recursive: true);
+      globals.fs.file(globals.fs.path.join(workingDirectory, '.packages')).createSync(recursive: true);
       return 0;
     });
     when(mockBuildDaemonClient.buildResults).thenAnswer((Invocation _) {
@@ -81,12 +81,12 @@
     when(mockBuildDaemonCreator.assetServerPort(any)).thenReturn(4321);
     testbed = Testbed(
       setup: () {
-        fs.file(fs.path.join('packages', 'flutter_tools', 'pubspec.yaml'))
+        globals.fs.file(globals.fs.path.join('packages', 'flutter_tools', 'pubspec.yaml'))
           ..createSync(recursive: true)
           ..setLastModifiedSync(DateTime(1991, 08, 23));
         // Create an empty .packages file so we can read it when we check for
-        // plugins on WebFs.start()
-        fs.file('.packages').createSync();
+        // plugins on Webglobals.fs.start()
+        globals.fs.file('.packages').createSync();
       },
       overrides: <Type, Generator>{
         Pub: () => MockPub(),
@@ -121,7 +121,7 @@
     final FlutterProject flutterProject = FlutterProject.current();
     await WebFs.start(
       skipDwds: false,
-      target: fs.path.join('lib', 'main.dart'),
+      target: globals.fs.path.join('lib', 'main.dart'),
       buildInfo: BuildInfo.debug,
       flutterProject: flutterProject,
       initializePlatform: true,
@@ -152,7 +152,7 @@
     final FlutterProject flutterProject = FlutterProject.current();
     await WebFs.start(
       skipDwds: false,
-      target: fs.path.join('lib', 'main.dart'),
+      target: globals.fs.path.join('lib', 'main.dart'),
       buildInfo: BuildInfo.debug,
       flutterProject: flutterProject,
       initializePlatform: false,
@@ -174,7 +174,7 @@
     final FlutterProject flutterProject = FlutterProject.current();
     final WebFs webFs = await WebFs.start(
       skipDwds: false,
-      target: fs.path.join('lib', 'main.dart'),
+      target: globals.fs.path.join('lib', 'main.dart'),
       buildInfo: BuildInfo.debug,
       flutterProject: flutterProject,
       initializePlatform: false,
@@ -208,7 +208,7 @@
 
     expect(WebFs.start(
       skipDwds: false,
-      target: fs.path.join('lib', 'main.dart'),
+      target: globals.fs.path.join('lib', 'main.dart'),
       buildInfo: BuildInfo.debug,
       flutterProject: flutterProject,
       initializePlatform: false,
diff --git a/packages/flutter_tools/test/general.shard/web/web_validator_test.dart b/packages/flutter_tools/test/general.shard/web/web_validator_test.dart
index 4717ba6..2bcdb9d 100644
--- a/packages/flutter_tools/test/general.shard/web/web_validator_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/web_validator_test.dart
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/doctor.dart';
 import 'package:flutter_tools/src/web/chrome.dart';
 import 'package:flutter_tools/src/web/web_validator.dart';
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/testbed.dart';
diff --git a/packages/flutter_tools/test/general.shard/web/workflow_test.dart b/packages/flutter_tools/test/general.shard/web/workflow_test.dart
index 483c3cb..0adeac2 100644
--- a/packages/flutter_tools/test/general.shard/web/workflow_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/workflow_test.dart
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/features.dart';
 import 'package:flutter_tools/src/web/chrome.dart';
 import 'package:flutter_tools/src/web/workflow.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -32,7 +33,7 @@
       workflow = const WebWorkflow();
       mockProcessManager = MockProcessManager();
       testbed = Testbed(setup: () async {
-        fs.file('chrome').createSync();
+        globals.fs.file('chrome').createSync();
         when(mockProcessManager.canRun('chrome')).thenReturn(true);
       }, overrides: <Type, Generator>{
         FeatureFlags: () => TestFeatureFlags(isWebEnabled: true),
diff --git a/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart b/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart
index 6a9935e..008d1b0 100644
--- a/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart
+++ b/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart
@@ -5,11 +5,13 @@
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart' show ProcessException, ProcessResult;
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/convert.dart';
 import 'package:flutter_tools/src/windows/visual_studio.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -73,8 +75,8 @@
     Map<String, dynamic> response,
     String responseOverride,
   ]) {
-    fs.file(vswherePath).createSync(recursive: true);
-    fs.file(vcvarsPath).createSync(recursive: true);
+    globals.fs.file(vswherePath).createSync(recursive: true);
+    globals.fs.file(vcvarsPath).createSync(recursive: true);
 
     final MockProcessResult result = MockProcessResult();
     when(result.exitCode).thenReturn(0);
diff --git a/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart b/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart
index f59642f..319cf55 100644
--- a/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart
@@ -4,13 +4,14 @@
 
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/windows/application_package.dart';
 import 'package:flutter_tools/src/windows/windows_device.dart';
 import 'package:flutter_tools/src/device.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
+import 'package:platform/platform.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -41,9 +42,9 @@
     });
 
     testUsingContext('isSupportedForProject is true with editable host app', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
-      fs.directory('windows').createSync();
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
+      globals.fs.directory('windows').createSync();
       final FlutterProject flutterProject = FlutterProject.current();
 
       expect(WindowsDevice().isSupportedForProject(flutterProject), true);
@@ -53,8 +54,8 @@
     });
 
     testUsingContext('isSupportedForProject is false with no host app', () async {
-      fs.file('pubspec.yaml').createSync();
-      fs.file('.packages').createSync();
+      globals.fs.file('pubspec.yaml').createSync();
+      globals.fs.file('.packages').createSync();
       final FlutterProject flutterProject = FlutterProject.current();
 
       expect(WindowsDevice().isSupportedForProject(flutterProject), false);
diff --git a/packages/flutter_tools/test/general.shard/windows/windows_workflow_test.dart b/packages/flutter_tools/test/general.shard/windows/windows_workflow_test.dart
index 93a6e30..2a047d0 100644
--- a/packages/flutter_tools/test/general.shard/windows/windows_workflow_test.dart
+++ b/packages/flutter_tools/test/general.shard/windows/windows_workflow_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:flutter_tools/src/features.dart';
 import 'package:mockito/mockito.dart';
-
-import 'package:flutter_tools/src/base/platform.dart';
+import 'package:platform/platform.dart';
 import 'package:flutter_tools/src/windows/windows_workflow.dart';
 
 import '../../src/common.dart';
diff --git a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart
index 571da8a..fbf4163 100644
--- a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart
+++ b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart
@@ -9,6 +9,7 @@
 import 'package:file/file.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:process/process.dart';
 
 import '../src/common.dart';
@@ -23,7 +24,7 @@
     final BasicProject _project = BasicProject();
     await _project.setUpIn(tempDir);
 
-    final String flutterBin = fs.path.join(getFlutterRoot(), 'bin', 'flutter');
+    final String flutterBin = globals.fs.path.join(getFlutterRoot(), 'bin', 'flutter');
 
     const ProcessManager processManager = LocalProcessManager();
     final Process process = await processManager.start(
diff --git a/packages/flutter_tools/test/integration.shard/flutter_run_test.dart b/packages/flutter_tools/test/integration.shard/flutter_run_test.dart
index d4d1902..e1bfcab 100644
--- a/packages/flutter_tools/test/integration.shard/flutter_run_test.dart
+++ b/packages/flutter_tools/test/integration.shard/flutter_run_test.dart
@@ -5,6 +5,7 @@
 import 'package:file/file.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:process/process.dart';
 
 import '../src/common.dart';
@@ -33,7 +34,7 @@
     // like https://github.com/flutter/flutter/issues/21418 which were skipped
     // over because other integration tests run using flutter-tester which short-cuts
     // some of the checks for devices.
-    final String flutterBin = fs.path.join(getFlutterRoot(), 'bin', 'flutter');
+    final String flutterBin = globals.fs.path.join(getFlutterRoot(), 'bin', 'flutter');
 
     const ProcessManager _processManager = LocalProcessManager();
     final ProcessResult _proc = await _processManager.run(
diff --git a/packages/flutter_tools/test/integration.shard/test_data/hot_reload_project.dart b/packages/flutter_tools/test/integration.shard/test_data/hot_reload_project.dart
index 7462ffa..47ae295 100644
--- a/packages/flutter_tools/test/integration.shard/test_data/hot_reload_project.dart
+++ b/packages/flutter_tools/test/integration.shard/test_data/hot_reload_project.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../test_utils.dart';
 import 'project.dart';
@@ -86,6 +86,6 @@
       '// printHotReloadWorked();',
       'printHotReloadWorked();',
     );
-    writeFile(fs.path.join(dir.path, 'lib', 'main.dart'), newMainContents);
+    writeFile(globals.fs.path.join(dir.path, 'lib', 'main.dart'), newMainContents);
   }
 }
diff --git a/packages/flutter_tools/test/integration.shard/test_data/project.dart b/packages/flutter_tools/test/integration.shard/test_data/project.dart
index d98147f..cee6092 100644
--- a/packages/flutter_tools/test/integration.shard/test_data/project.dart
+++ b/packages/flutter_tools/test/integration.shard/test_data/project.dart
@@ -6,6 +6,7 @@
 
 import 'package:file/file.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../test_utils.dart';
 
@@ -19,9 +20,9 @@
 
   Future<void> setUpIn(Directory dir) async {
     this.dir = dir;
-    writeFile(fs.path.join(dir.path, 'pubspec.yaml'), pubspec);
+    writeFile(globals.fs.path.join(dir.path, 'pubspec.yaml'), pubspec);
     if (main != null) {
-      writeFile(fs.path.join(dir.path, 'lib', 'main.dart'), main);
+      writeFile(globals.fs.path.join(dir.path, 'lib', 'main.dart'), main);
     }
     await getPackages(dir.path);
   }
diff --git a/packages/flutter_tools/test/integration.shard/test_data/tests_project.dart b/packages/flutter_tools/test/integration.shard/test_data/tests_project.dart
index 0abad69..c452bb6 100644
--- a/packages/flutter_tools/test/integration.shard/test_data/tests_project.dart
+++ b/packages/flutter_tools/test/integration.shard/test_data/tests_project.dart
@@ -5,6 +5,7 @@
 
 import 'package:file/file.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../test_utils.dart';
 import 'project.dart';
@@ -45,7 +46,7 @@
     return super.setUpIn(dir);
   }
 
-  String get testFilePath => fs.path.join(dir.path, 'test', 'test.dart');
+  String get testFilePath => globals.fs.path.join(dir.path, 'test', 'test.dart');
 
   Uri get breakpointUri => Uri.file(testFilePath);
 
diff --git a/packages/flutter_tools/test/integration.shard/test_driver.dart b/packages/flutter_tools/test/integration.shard/test_driver.dart
index ff881e1..8dc062f 100644
--- a/packages/flutter_tools/test/integration.shard/test_driver.dart
+++ b/packages/flutter_tools/test/integration.shard/test_driver.dart
@@ -10,6 +10,7 @@
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/utils.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:meta/meta.dart';
 import 'package:process/process.dart';
 import 'package:vm_service/vm_service.dart';
@@ -83,7 +84,7 @@
     bool withDebugger = false,
     File pidFile,
   }) async {
-    final String flutterBin = fs.path.join(getFlutterRoot(), 'bin', 'flutter');
+    final String flutterBin = globals.fs.path.join(getFlutterRoot(), 'bin', 'flutter');
     if (withDebugger) {
       arguments.add('--start-paused');
     }
diff --git a/packages/flutter_tools/test/integration.shard/test_utils.dart b/packages/flutter_tools/test/integration.shard/test_utils.dart
index 1833a2d..5aa7549 100644
--- a/packages/flutter_tools/test/integration.shard/test_utils.dart
+++ b/packages/flutter_tools/test/integration.shard/test_utils.dart
@@ -6,7 +6,7 @@
 
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/process_manager.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 
 import '../src/common.dart';
 
@@ -15,24 +15,24 @@
 /// https://github.com/flutter/flutter/pull/21741
 Directory createResolvedTempDirectorySync(String prefix) {
   assert(prefix.endsWith('.'));
-  final Directory tempDirectory = fs.systemTempDirectory.createTempSync('flutter_$prefix');
-  return fs.directory(tempDirectory.resolveSymbolicLinksSync());
+  final Directory tempDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_$prefix');
+  return globals.fs.directory(tempDirectory.resolveSymbolicLinksSync());
 }
 
 void writeFile(String path, String content) {
-  fs.file(path)
+  globals.fs.file(path)
     ..createSync(recursive: true)
     ..writeAsStringSync(content);
 }
 
 void writePackages(String folder) {
-  writeFile(fs.path.join(folder, '.packages'), '''
-test:${fs.path.join(fs.currentDirectory.path, 'lib')}/
+  writeFile(globals.fs.path.join(folder, '.packages'), '''
+test:${globals.fs.path.join(globals.fs.currentDirectory.path, 'lib')}/
 ''');
 }
 
 void writePubspec(String folder) {
-  writeFile(fs.path.join(folder, 'pubspec.yaml'), '''
+  writeFile(globals.fs.path.join(folder, 'pubspec.yaml'), '''
 name: test
 dependencies:
   flutter:
@@ -42,11 +42,11 @@
 
 Future<void> getPackages(String folder) async {
   final List<String> command = <String>[
-    fs.path.join(getFlutterRoot(), 'bin', 'flutter'),
+    globals.fs.path.join(getFlutterRoot(), 'bin', 'flutter'),
     'pub',
     'get',
   ];
-  final ProcessResult result = await processManager.run(command, workingDirectory: folder);
+  final ProcessResult result = await globals.processManager.run(command, workingDirectory: folder);
   if (result.exitCode != 0) {
     throw Exception('flutter pub get failed: ${result.stderr}\n${result.stdout}');
   }
diff --git a/packages/flutter_tools/test/src/common.dart b/packages/flutter_tools/test/src/common.dart
index c693e52..419674a 100644
--- a/packages/flutter_tools/test/src/common.dart
+++ b/packages/flutter_tools/test/src/common.dart
@@ -8,11 +8,12 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/base/process.dart';
 import 'package:flutter_tools/src/commands/create.dart';
 import 'package:flutter_tools/src/runner/flutter_command.dart';
 import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:meta/meta.dart';
 import 'package:test_api/test_api.dart' as test_package show TypeMatcher, test; // ignore: deprecated_member_use
 import 'package:test_api/test_api.dart' hide TypeMatcher, isInstanceOf; // ignore: deprecated_member_use
@@ -40,20 +41,20 @@
 /// environment variable is set, it will be returned. Otherwise, this will
 /// deduce the path from `platform.script`.
 String getFlutterRoot() {
-  if (platform.environment.containsKey('FLUTTER_ROOT')) {
-    return platform.environment['FLUTTER_ROOT'];
+  if (globals.platform.environment.containsKey('FLUTTER_ROOT')) {
+    return globals.platform.environment['FLUTTER_ROOT'];
   }
 
-  Error invalidScript() => StateError('Could not determine flutter_tools/ path from script URL (${platform.script}); consider setting FLUTTER_ROOT explicitly.');
+  Error invalidScript() => StateError('Could not determine flutter_tools/ path from script URL (${globals.platform.script}); consider setting FLUTTER_ROOT explicitly.');
 
   Uri scriptUri;
-  switch (platform.script.scheme) {
+  switch (globals.platform.script.scheme) {
     case 'file':
-      scriptUri = platform.script;
+      scriptUri = globals.platform.script;
       break;
     case 'data':
       final RegExp flutterTools = RegExp(r'(file://[^"]*[/\\]flutter_tools[/\\][^"]+\.dart)', multiLine: true);
-      final Match match = flutterTools.firstMatch(Uri.decodeFull(platform.script.path));
+      final Match match = flutterTools.firstMatch(Uri.decodeFull(globals.platform.script.path));
       if (match == null) {
         throw invalidScript();
       }
@@ -63,13 +64,13 @@
       throw invalidScript();
   }
 
-  final List<String> parts = fs.path.split(fs.path.fromUri(scriptUri));
+  final List<String> parts = globals.fs.path.split(globals.fs.path.fromUri(scriptUri));
   final int toolsIndex = parts.indexOf('flutter_tools');
   if (toolsIndex == -1) {
     throw invalidScript();
   }
-  final String toolsPath = fs.path.joinAll(parts.sublist(0, toolsIndex + 1));
-  return fs.path.normalize(fs.path.join(toolsPath, '..', '..'));
+  final String toolsPath = globals.fs.path.joinAll(parts.sublist(0, toolsIndex + 1));
+  return globals.fs.path.normalize(globals.fs.path.join(toolsPath, '..', '..'));
 }
 
 CommandRunner<void> createTestCommandRunner([ FlutterCommand command ]) {
@@ -87,7 +88,7 @@
   int seconds,
 ) {
   final DateTime modificationTime = baseTime.add(Duration(seconds: seconds));
-  fs.file(path).setLastModifiedSync(modificationTime);
+  globals.fs.file(path).setLastModifiedSync(modificationTime);
 }
 
 /// Matcher for functions that throw [ToolExit].
@@ -120,12 +121,12 @@
 /// Returns the path to the flutter project.
 Future<String> createProject(Directory temp, { List<String> arguments }) async {
   arguments ??= <String>['--no-pub'];
-  final String projectPath = fs.path.join(temp.path, 'flutter_project');
+  final String projectPath = globals.fs.path.join(temp.path, 'flutter_project');
   final CreateCommand command = CreateCommand();
   final CommandRunner<void> runner = createTestCommandRunner(command);
   await runner.run(<String>['create', ...arguments, projectPath]);
   // Created `.packages` since it's not created when the flag `--no-pub` is passed.
-  fs.file(fs.path.join(projectPath, '.packages')).createSync();
+  globals.fs.file(globals.fs.path.join(projectPath, '.packages')).createSync();
   return projectPath;
 }
 
diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index 4229d2b..8c29688 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -28,6 +28,7 @@
 import 'package:flutter_tools/src/reporting/github_template.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:meta/meta.dart';
 import 'package:mockito/mockito.dart';
 
@@ -73,16 +74,16 @@
     }
   });
   Config buildConfig(FileSystem fs) {
-    configDir ??= fs.systemTempDirectory.createTempSync('flutter_config_dir_test.');
-    final File settingsFile = fs.file(
-      fs.path.join(configDir.path, '.flutter_settings')
+    configDir ??= globals.fs.systemTempDirectory.createTempSync('flutter_config_dir_test.');
+    final File settingsFile = globals.fs.file(
+      globals.fs.path.join(configDir.path, '.flutter_settings')
     );
     return Config(settingsFile);
   }
   PersistentToolState buildPersistentToolState(FileSystem fs) {
-    configDir ??= fs.systemTempDirectory.createTempSync('flutter_config_dir_test.');
-    final File toolStateFile = fs.file(
-      fs.path.join(configDir.path, '.flutter_tool_state'));
+    configDir ??= globals.fs.systemTempDirectory.createTempSync('flutter_config_dir_test.');
+    final File toolStateFile = globals.fs.file(
+      globals.fs.path.join(configDir.path, '.flutter_tool_state'));
     return PersistentToolState(toolStateFile);
   }
 
@@ -91,7 +92,7 @@
       return context.run<dynamic>(
         name: 'mocks',
         overrides: <Type, Generator>{
-          Config: () => buildConfig(fs),
+          Config: () => buildConfig(globals.fs),
           DeviceManager: () => FakeDeviceManager(),
           Doctor: () => FakeDoctor(),
           FlutterVersion: () => MockFlutterVersion(),
@@ -104,7 +105,7 @@
           OutputPreferences: () => OutputPreferences.test(),
           Logger: () => BufferLogger(),
           OperatingSystemUtils: () => FakeOperatingSystemUtils(),
-          PersistentToolState: () => buildPersistentToolState(fs),
+          PersistentToolState: () => buildPersistentToolState(globals.fs),
           SimControl: () => MockSimControl(),
           Usage: () => FakeUsage(),
           XcodeProjectInterpreter: () => FakeXcodeProjectInterpreter(),
@@ -410,10 +411,10 @@
 
   @override
   set currentDirectory(dynamic value) {
-    throw 'fs.currentDirectory should not be set on the local file system during '
+    throw 'globals.fs.currentDirectory should not be set on the local file system during '
           'tests as this can cause race conditions with concurrent tests. '
           'Consider using a MemoryFileSystem for testing if possible or refactor '
-          'code to not require setting fs.currentDirectory.';
+          'code to not require setting globals.fs.currentDirectory.';
   }
 }
 
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
index 539f8ab..95fdd64 100644
--- a/packages/flutter_tools/test/src/mocks.dart
+++ b/packages/flutter_tools/test/src/mocks.dart
@@ -6,13 +6,14 @@
 import 'dart:convert';
 import 'dart:io' as io show IOSink, ProcessSignal, Stdout, StdoutException;
 
+import 'package:platform/platform.dart';
+
 import 'package:flutter_tools/src/android/android_device.dart';
 import 'package:flutter_tools/src/android/android_sdk.dart' show AndroidSdk;
 import 'package:flutter_tools/src/application_package.dart';
 import 'package:flutter_tools/src/base/context.dart';
 import 'package:flutter_tools/src/base/file_system.dart' hide IOSink;
 import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
 import 'package:flutter_tools/src/build_info.dart';
 import 'package:flutter_tools/src/compile.dart';
 import 'package:flutter_tools/src/devfs.dart';
@@ -21,6 +22,7 @@
 import 'package:flutter_tools/src/ios/simulators.dart';
 import 'package:flutter_tools/src/project.dart';
 import 'package:flutter_tools/src/runner/flutter_command.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 import 'package:process/process.dart';
 
@@ -36,7 +38,7 @@
   MockApplicationPackageStore() : super(
     android: AndroidApk(
       id: 'io.flutter.android.mock',
-      file: fs.file('/mock/path/to/android/SkyShell.apk'),
+      file: globals.fs.file('/mock/path/to/android/SkyShell.apk'),
       versionCode: 1,
       launchActivity: 'io.flutter.android.mock.MockActivity',
     ),
@@ -67,9 +69,9 @@
     bool withPlatformTools = true,
     bool withBuildTools = true,
   }) {
-    final Directory dir = fs.systemTempDirectory.createTempSync('flutter_mock_android_sdk.');
-    final String exe = platform.isWindows ? '.exe' : '';
-    final String bat = platform.isWindows ? '.bat' : '';
+    final Directory dir = globals.fs.systemTempDirectory.createTempSync('flutter_mock_android_sdk.');
+    final String exe = globals.platform.isWindows ? '.exe' : '';
+    final String bat = globals.platform.isWindows ? '.bat' : '';
 
     _createDir(dir, 'licenses');
 
@@ -98,7 +100,7 @@
     }
 
     if (withNdkDir != null) {
-      final String ndkToolchainBin = fs.path.join(
+      final String ndkToolchainBin = globals.fs.path.join(
         'ndk-bundle',
         'toolchains',
         'arm-linux-androideabi-4.9',
@@ -106,24 +108,24 @@
         withNdkDir,
         'bin',
       );
-      final String ndkCompiler = fs.path.join(
+      final String ndkCompiler = globals.fs.path.join(
         ndkToolchainBin,
         'arm-linux-androideabi-gcc',
       );
-      final String ndkLinker = fs.path.join(
+      final String ndkLinker = globals.fs.path.join(
         ndkToolchainBin,
         'arm-linux-androideabi-ld',
       );
       _createSdkFile(dir, ndkCompiler);
       _createSdkFile(dir, ndkLinker);
-      _createSdkFile(dir, fs.path.join('ndk-bundle', 'source.properties'), contents: '''
+      _createSdkFile(dir, globals.fs.path.join('ndk-bundle', 'source.properties'), contents: '''
 Pkg.Desc = Android NDK[]
 Pkg.Revision = $ndkVersion.1.5063045
 
 ''');
     }
     if (withNdkSysroot) {
-      final String armPlatform = fs.path.join(
+      final String armPlatform = globals.fs.path.join(
         'ndk-bundle',
         'platforms',
         'android-9',
@@ -144,7 +146,7 @@
   }
 
   static void _createDir(Directory dir, String path) {
-    final Directory directory = fs.directory(fs.path.join(dir.path, path));
+    final Directory directory = globals.fs.directory(globals.fs.path.join(dir.path, path));
     directory.createSync(recursive: true);
   }
 
@@ -675,8 +677,8 @@
   }
   @override
   Future<CompilerOutput> recompile(String mainPath, List<Uri> invalidatedFiles, { String outputPath, String packagesFilePath }) async {
-    fs.file(outputPath).createSync(recursive: true);
-    fs.file(outputPath).writeAsStringSync('compiled_kernel_output');
+    globals.fs.file(outputPath).createSync(recursive: true);
+    globals.fs.file(outputPath).writeAsStringSync('compiled_kernel_output');
     return CompilerOutput(outputPath, 0, <Uri>[]);
   }
 }
diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart
index 476bb72..2022ebf 100644
--- a/packages/flutter_tools/test/src/testbed.dart
+++ b/packages/flutter_tools/test/src/testbed.dart
@@ -12,7 +12,7 @@
 import 'package:flutter_tools/src/base/io.dart';
 import 'package:flutter_tools/src/base/logger.dart';
 import 'package:flutter_tools/src/base/os.dart';
-import 'package:flutter_tools/src/base/platform.dart';
+
 import 'package:flutter_tools/src/base/signals.dart';
 import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/cache.dart';
@@ -21,6 +21,7 @@
 import 'package:flutter_tools/src/features.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:meta/meta.dart';
 import 'package:process/process.dart';
 
@@ -35,7 +36,7 @@
 // this provider. For example, [BufferLogger], [MemoryFileSystem].
 final Map<Type, Generator> _testbedDefaults = <Type, Generator>{
   // Keeps tests fast by avoiding the actual file system.
-  FileSystem: () => MemoryFileSystem(style: platform.isWindows ? FileSystemStyle.windows : FileSystemStyle.posix),
+  FileSystem: () => MemoryFileSystem(style: globals.platform.isWindows ? FileSystemStyle.windows : FileSystemStyle.posix),
   ProcessManager: () => FakeProcessManager.any(),
   Logger: () => BufferLogger(), // Allows reading logs and prevents stdout.
   OperatingSystemUtils: () => FakeOperatingSystemUtils(),
@@ -61,14 +62,14 @@
 ///
 ///         setUp(() {
 ///           testbed = Testbed(setUp: () {
-///             fs.file('foo').createSync()
+///             globals.fs.file('foo').createSync()
 ///           });
 ///         })
 ///
 ///         test('Can delete a file', () => testbed.run(() {
-///           expect(fs.file('foo').existsSync(), true);
-///           fs.file('foo').deleteSync();
-///           expect(fs.file('foo').existsSync(), false);
+///           expect(globals.fs.file('foo').existsSync(), true);
+///           globals.fs.file('foo').deleteSync();
+///           expect(globals.fs.file('foo').existsSync(), false);
 ///         }));
 ///       });
 ///     }
@@ -843,32 +844,32 @@
 
   @override
   Directory getArtifactDirectory(String name) {
-    return fs.currentDirectory;
+    return globals.fs.currentDirectory;
   }
 
   @override
   Directory getCacheArtifacts() {
-    return fs.currentDirectory;
+    return globals.fs.currentDirectory;
   }
 
   @override
   Directory getCacheDir(String name) {
-    return fs.currentDirectory;
+    return globals.fs.currentDirectory;
   }
 
   @override
   Directory getDownloadDir() {
-    return fs.currentDirectory;
+    return globals.fs.currentDirectory;
   }
 
   @override
   Directory getRoot() {
-    return fs.currentDirectory;
+    return globals.fs.currentDirectory;
   }
 
   @override
   File getLicenseFile() {
-    return fs.currentDirectory.childFile('LICENSE');
+    return globals.fs.currentDirectory.childFile('LICENSE');
   }
 
   @override
@@ -893,7 +894,7 @@
 
   @override
   Directory getWebSdkDirectory() {
-    return fs.currentDirectory;
+    return globals.fs.currentDirectory;
   }
 
   @override
diff --git a/packages/flutter_tools/test/template_test.dart b/packages/flutter_tools/test/template_test.dart
index 8c042c9..2aedd4e 100644
--- a/packages/flutter_tools/test/template_test.dart
+++ b/packages/flutter_tools/test/template_test.dart
@@ -5,6 +5,7 @@
 import 'package:flutter_tools/src/base/common.dart';
 import 'package:flutter_tools/src/base/file_system.dart';
 import 'package:flutter_tools/src/template.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:mockito/mockito.dart';
 
 import 'src/common.dart';
@@ -18,7 +19,7 @@
   });
 
   test('Template.render throws ToolExit when FileSystem exception is raised', () => testbed.run(() {
-    final Template template = Template(fs.directory('examples'), fs.currentDirectory);
+    final Template template = Template(globals.fs.directory('examples'), globals.fs.currentDirectory);
     final MockDirectory mockDirectory = MockDirectory();
     when(mockDirectory.createSync(recursive: true)).thenThrow(const FileSystemException());