diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart
index 6382cbf..5640105 100644
--- a/packages/flutter_tools/lib/executable.dart
+++ b/packages/flutter_tools/lib/executable.dart
@@ -67,7 +67,14 @@
   final bool verboseHelp = help && verbose;
 
   await runner.run(args, <FlutterCommand>[
-    AnalyzeCommand(verboseHelp: verboseHelp),
+    AnalyzeCommand(
+      verboseHelp: verboseHelp,
+      fileSystem: globals.fs,
+      platform: globals.platform,
+      processManager: globals.processManager,
+      logger: globals.logger,
+      terminal: globals.terminal,
+    ),
     AssembleCommand(),
     AttachCommand(verboseHelp: verboseHelp),
     BuildCommand(verboseHelp: verboseHelp),
diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart
index 4fb8815..d2690a5 100644
--- a/packages/flutter_tools/lib/src/commands/analyze.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze.dart
@@ -4,14 +4,32 @@
 
 import 'dart:async';
 
+import 'package:meta/meta.dart';
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
+
 import '../base/file_system.dart';
+import '../base/logger.dart';
+import '../base/terminal.dart';
 import '../globals.dart' as globals;
 import '../runner/flutter_command.dart';
 import 'analyze_continuously.dart';
 import 'analyze_once.dart';
 
 class AnalyzeCommand extends FlutterCommand {
-  AnalyzeCommand({bool verboseHelp = false, this.workingDirectory}) {
+  AnalyzeCommand({
+    bool verboseHelp = false,
+    this.workingDirectory,
+    @required FileSystem fileSystem,
+    @required Platform platform,
+    @required AnsiTerminal terminal,
+    @required Logger logger,
+    @required ProcessManager processManager,
+  }) : _fileSystem = fileSystem,
+       _processManager = processManager,
+       _logger = logger,
+       _terminal = terminal,
+       _platform = platform {
     argParser.addFlag('flutter-repo',
         negatable: false,
         help: 'Include all the examples and tests from the Flutter repository.',
@@ -59,6 +77,12 @@
   /// The working directory for testing analysis using dartanalyzer.
   final Directory workingDirectory;
 
+  final FileSystem _fileSystem;
+  final Logger _logger;
+  final AnsiTerminal _terminal;
+  final ProcessManager _processManager;
+  final Platform _platform;
+
   @override
   String get name => 'analyze';
 
@@ -73,7 +97,7 @@
     }
 
     // Or we're not in a project directory.
-    if (!globals.fs.file('pubspec.yaml').existsSync()) {
+    if (!_fileSystem.file('pubspec.yaml').existsSync()) {
       return false;
     }
 
@@ -87,6 +111,13 @@
         argResults,
         runner.getRepoRoots(),
         runner.getRepoPackages(),
+        fileSystem: _fileSystem,
+        // TODO(jonahwilliams): determine a better way to inject the logger,
+        // since it is constructed on-demand.
+        logger: _logger ?? globals.logger,
+        platform: _platform,
+        processManager: _processManager,
+        terminal: _terminal,
       ).analyze();
     } else {
       await AnalyzeOnce(
@@ -94,6 +125,13 @@
         runner.getRepoRoots(),
         runner.getRepoPackages(),
         workingDirectory: workingDirectory,
+        fileSystem: _fileSystem,
+        // TODO(jonahwilliams): determine a better way to inject the logger,
+        // since it is constructed on-demand.
+        logger: _logger ?? globals.logger,
+        platform: _platform,
+        processManager: _processManager,
+        terminal: _terminal,
       ).analyze();
     }
     return FlutterCommandResult.success();
diff --git a/packages/flutter_tools/lib/src/commands/analyze_base.dart b/packages/flutter_tools/lib/src/commands/analyze_base.dart
index 63fb3dc..35d2def 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_base.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_base.dart
@@ -5,20 +5,47 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
+import 'package:meta/meta.dart';
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
 import 'package:yaml/yaml.dart' as yaml;
 
 import '../base/common.dart';
 import '../base/file_system.dart';
+import '../base/logger.dart';
+import '../base/terminal.dart';
 import '../base/utils.dart';
 import '../cache.dart';
 import '../globals.dart' as globals;
 
 /// Common behavior for `flutter analyze` and `flutter analyze --watch`
 abstract class AnalyzeBase {
-  AnalyzeBase(this.argResults);
+  AnalyzeBase(this.argResults, {
+    @required this.repoRoots,
+    @required this.repoPackages,
+    @required this.fileSystem,
+    @required this.logger,
+    @required this.platform,
+    @required this.processManager,
+    @required this.terminal,
+  });
 
   /// The parsed argument results for execution.
   final ArgResults argResults;
+  @protected
+  final List<String> repoRoots;
+  @protected
+  final List<Directory> repoPackages;
+  @protected
+  final FileSystem fileSystem;
+  @protected
+  final Logger logger;
+  @protected
+  final ProcessManager processManager;
+  @protected
+  final Platform platform;
+  @protected
+  final AnsiTerminal terminal;
 
   /// Called by [AnalyzeCommand] to start the analysis process.
   Future<void> analyze();
@@ -26,7 +53,7 @@
   void dumpErrors(Iterable<String> errors) {
     if (argResults['write'] != null) {
       try {
-        final RandomAccessFile resultsFile = globals.fs.file(argResults['write']).openSync(mode: FileMode.write);
+        final RandomAccessFile resultsFile = fileSystem.file(argResults['write']).openSync(mode: FileMode.write);
         try {
           resultsFile.lockSync();
           resultsFile.writeStringSync(errors.join('\n'));
@@ -34,7 +61,7 @@
           resultsFile.close();
         }
       } catch (e) {
-        globals.printError('Failed to save output to "${argResults['write']}": $e');
+        logger.printError('Failed to save output to "${argResults['write']}": $e');
       }
     }
   }
@@ -46,30 +73,13 @@
       'issues': errorCount,
       'missingDartDocs': membersMissingDocumentation,
     };
-    globals.fs.file(benchmarkOut).writeAsStringSync(toPrettyJson(data));
-    globals.printStatus('Analysis benchmark written to $benchmarkOut ($data).');
+    fileSystem.file(benchmarkOut).writeAsStringSync(toPrettyJson(data));
+    logger.printStatus('Analysis benchmark written to $benchmarkOut ($data).');
   }
 
   bool get isBenchmarking => argResults['benchmark'] as bool;
 }
 
-/// Return true if [fileList] contains a path that resides inside the Flutter repository.
-/// 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>[globals.fs.path.current];
-  }
-  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 = globals.fs.path.normalize(globals.fs.path.absolute(file));
-    if (file == root || file.startsWith(prefix)) {
-      return true;
-    }
-  }
-  return false;
-}
-
 class PackageDependency {
   // This is a map from dependency targets (lib directories) to a list
   // of places that ask for that target (.packages or pubspec.yaml files)
diff --git a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
index c6271d5..506b44c 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
@@ -5,23 +5,38 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
+import 'package:meta/meta.dart';
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
 
 import '../base/common.dart';
 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' as globals;
 import 'analyze_base.dart';
 
 class AnalyzeContinuously extends AnalyzeBase {
-  AnalyzeContinuously(ArgResults argResults, this.repoRoots, this.repoPackages) : super(argResults);
-
-  final List<String> repoRoots;
-  final List<Directory> repoPackages;
+  AnalyzeContinuously(ArgResults argResults, List<String> repoRoots, List<Directory> repoPackages, {
+    @required FileSystem fileSystem,
+    @required Logger logger,
+    @required AnsiTerminal terminal,
+    @required Platform platform,
+    @required ProcessManager processManager,
+  }) : super(
+        argResults,
+        repoPackages: repoPackages,
+        repoRoots: repoRoots,
+        fileSystem: fileSystem,
+        logger: logger,
+        platform: platform,
+        terminal: terminal,
+        processManager: processManager,
+      );
 
   String analysisTarget;
   bool firstAnalysis = true;
@@ -42,18 +57,24 @@
       directories = repoRoots;
       analysisTarget = 'Flutter repository';
 
-      globals.printTrace('Analyzing Flutter repository:');
+      logger.printTrace('Analyzing Flutter repository:');
       for (final String projectPath in repoRoots) {
-        globals.printTrace('  ${globals.fs.path.relative(projectPath)}');
+        logger.printTrace('  ${fileSystem.path.relative(projectPath)}');
       }
     } else {
-      directories = <String>[globals.fs.currentDirectory.path];
-      analysisTarget = globals.fs.currentDirectory.path;
+      directories = <String>[fileSystem.currentDirectory.path];
+      analysisTarget = fileSystem.currentDirectory.path;
     }
 
     final String sdkPath = argResults['dart-sdk'] as String ?? sdk.dartSdkPath;
 
-    final AnalysisServer server = AnalysisServer(sdkPath, directories);
+    final AnalysisServer server = AnalysisServer(sdkPath, directories,
+      fileSystem: fileSystem,
+      logger: logger,
+      platform: platform,
+      processManager: processManager,
+      terminal: terminal,
+    );
     server.onAnalyzing.listen((bool isAnalyzing) => _handleAnalysisStatus(server, isAnalyzing));
     server.onErrors.listen(_handleAnalysisErrors);
 
@@ -66,7 +87,7 @@
     if (exitCode != 0) {
       throwToolExit(message, exitCode: exitCode);
     }
-    globals.printStatus(message);
+    logger.printStatus(message);
 
     if (server.didServerErrorOccur) {
       throwToolExit('Server error(s) occurred.');
@@ -77,9 +98,9 @@
     if (isAnalyzing) {
       analysisStatus?.cancel();
       if (!firstAnalysis) {
-        globals.printStatus('\n');
+        logger.printStatus('\n');
       }
-      analysisStatus = globals.logger.startProgress('Analyzing $analysisTarget...', timeout: timeoutConfiguration.slowOperation);
+      analysisStatus = logger.startProgress('Analyzing $analysisTarget...', timeout: timeoutConfiguration.slowOperation);
       analyzedPaths.clear();
       analysisTimer = Stopwatch()..start();
     } else {
@@ -87,12 +108,12 @@
       analysisStatus = null;
       analysisTimer.stop();
 
-      globals.logger.printStatus(globals.terminal.clearScreen(), newline: false);
+      logger.printStatus(terminal.clearScreen(), newline: false);
 
       // Remove errors for deleted files, sort, and print errors.
       final List<AnalysisError> errors = <AnalysisError>[];
       for (final String path in analysisErrors.keys.toList()) {
-        if (globals.fs.isFileSync(path)) {
+        if (fileSystem.isFileSync(path)) {
           errors.addAll(analysisErrors[path]);
         } else {
           analysisErrors.remove(path);
@@ -113,9 +134,9 @@
       errors.sort();
 
       for (final AnalysisError error in errors) {
-        globals.printStatus(error.toString());
+        logger.printStatus(error.toString());
         if (error.code != null) {
-          globals.printTrace('error code: ${error.code}');
+          logger.printTrace('error code: ${error.code}');
         }
       }
 
@@ -148,9 +169,9 @@
       final String files = '${analyzedPaths.length} ${pluralize('file', analyzedPaths.length)}';
       final String seconds = (analysisTimer.elapsedMilliseconds / 1000.0).toStringAsFixed(2);
       if (undocumentedMembers > 0) {
-        globals.printStatus('$errorsMessage • $dartdocMessage • analyzed $files in $seconds seconds');
+        logger.printStatus('$errorsMessage • $dartdocMessage • analyzed $files in $seconds seconds');
       } else {
-        globals.printStatus('$errorsMessage • analyzed $files in $seconds seconds');
+        logger.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 db2b724..a186edf 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_once.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart
@@ -5,15 +5,18 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
+import 'package:meta/meta.dart';
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
 
 import '../base/common.dart';
 import '../base/file_system.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' as globals;
 import 'analyze.dart';
 import 'analyze_base.dart';
 
@@ -21,13 +24,24 @@
 class AnalyzeOnce extends AnalyzeBase {
   AnalyzeOnce(
     ArgResults argResults,
-    this.repoRoots,
-    this.repoPackages, {
+    List<String> repoRoots,
+    List<Directory> repoPackages, {
+    @required FileSystem fileSystem,
+    @required Logger logger,
+    @required Platform platform,
+    @required ProcessManager processManager,
+    @required AnsiTerminal terminal,
     this.workingDirectory,
-  }) : super(argResults);
-
-  final List<String> repoRoots;
-  final List<Directory> repoPackages;
+  }) : super(
+        argResults,
+        repoRoots: repoRoots,
+        repoPackages: repoPackages,
+        fileSystem: fileSystem,
+        logger: logger,
+        platform: platform,
+        processManager: processManager,
+        terminal: terminal,
+      );
 
   /// The working directory for testing analysis using dartanalyzer.
   final Directory workingDirectory;
@@ -35,14 +49,14 @@
   @override
   Future<void> analyze() async {
     final String currentDirectory =
-        (workingDirectory ?? globals.fs.currentDirectory).path;
+        (workingDirectory ?? fileSystem.currentDirectory).path;
 
     // find directories from argResults.rest
     final Set<String> directories = Set<String>.from(argResults.rest
-        .map<String>((String path) => globals.fs.path.canonicalize(path)));
+        .map<String>((String path) => fileSystem.path.canonicalize(path)));
     if (directories.isNotEmpty) {
       for (final String directory in directories) {
-        final FileSystemEntityType type = globals.fs.typeSync(directory);
+        final FileSystemEntityType type = fileSystem.typeSync(directory);
 
         if (type == FileSystemEntityType.notFound) {
           throwToolExit("'$directory' does not exist");
@@ -79,6 +93,11 @@
     final AnalysisServer server = AnalysisServer(
       sdkPath,
       directories.toList(),
+      fileSystem: fileSystem,
+      platform: platform,
+      logger: logger,
+      processManager: processManager,
+      terminal: terminal,
     );
 
     StreamSubscription<bool> subscription;
@@ -108,9 +127,9 @@
     final Stopwatch timer = Stopwatch()..start();
     final String message = directories.length > 1
         ? '${directories.length} ${directories.length == 1 ? 'directory' : 'directories'}'
-        : globals.fs.path.basename(directories.first);
+        : fileSystem.path.basename(directories.first);
     final Status progress = argResults['preamble'] as bool
-        ? globals.logger.startProgress('Analyzing $message...', timeout: timeoutConfiguration.slowOperation)
+        ? logger.startProgress('Analyzing $message...', timeout: timeoutConfiguration.slowOperation)
         : null;
 
     await analysisCompleter.future;
@@ -135,11 +154,11 @@
 
     // report errors
     if (errors.isNotEmpty && (argResults['preamble'] as bool)) {
-      globals.printStatus('');
+      logger.printStatus('');
     }
     errors.sort();
     for (final AnalysisError error in errors) {
-      globals.printStatus(error.toString(), hangingIndent: 7);
+      logger.printStatus(error.toString(), hangingIndent: 7);
     }
 
     final String seconds = (timer.elapsedMilliseconds / 1000.0).toStringAsFixed(1);
@@ -154,7 +173,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;
-      globals.printStatus('');
+      logger.printStatus('');
       if (undocumentedMembers > 0) {
         throwToolExit('$errorCount ${pluralize('issue', errorCount)} found. (ran in ${seconds}s; $dartdocMessage)');
       } else {
@@ -168,9 +187,9 @@
 
     if (argResults['congratulate'] as bool) {
       if (undocumentedMembers > 0) {
-        globals.printStatus('No issues found! (ran in ${seconds}s; $dartdocMessage)');
+        logger.printStatus('No issues found! (ran in ${seconds}s; $dartdocMessage)');
       } else {
-        globals.printStatus('No issues found! (ran in ${seconds}s)');
+        logger.printStatus('No issues found! (ran in ${seconds}s)');
       }
     }
   }
diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart
index 85b77fe..8714c50 100644
--- a/packages/flutter_tools/lib/src/dart/analysis.dart
+++ b/packages/flutter_tools/lib/src/dart/analysis.dart
@@ -5,18 +5,39 @@
 import 'dart:async';
 import 'dart:math' as math;
 
+import 'package:meta/meta.dart';
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
+
 import '../base/common.dart';
+import '../base/file_system.dart';
 import '../base/io.dart';
+import '../base/logger.dart';
 import '../base/terminal.dart';
 import '../base/utils.dart';
 import '../convert.dart';
-import '../globals.dart' as globals;
 
+/// An interface to the Dart analysis server.
 class AnalysisServer {
-  AnalysisServer(this.sdkPath, this.directories);
+  AnalysisServer(this.sdkPath, this.directories, {
+    @required FileSystem fileSystem,
+    @required ProcessManager processManager,
+    @required Logger logger,
+    @required Platform platform,
+    @required AnsiTerminal terminal,
+  }) : _fileSystem = fileSystem,
+       _processManager = processManager,
+       _logger = logger,
+       _platform = platform,
+       _terminal = terminal;
 
   final String sdkPath;
   final List<String> directories;
+  final FileSystem _fileSystem;
+  final ProcessManager _processManager;
+  final Logger _logger;
+  final Platform _platform;
+  final AnsiTerminal _terminal;
 
   Process _process;
   final StreamController<bool> _analyzingController =
@@ -29,9 +50,9 @@
 
   Future<void> start() async {
     final String snapshot =
-        globals.fs.path.join(sdkPath, 'bin/snapshots/analysis_server.dart.snapshot');
+        _fileSystem.path.join(sdkPath, 'bin/snapshots/analysis_server.dart.snapshot');
     final List<String> command = <String>[
-      globals.fs.path.join(sdkPath, 'bin', 'dart'),
+      _fileSystem.path.join(sdkPath, 'bin', 'dart'),
       snapshot,
       '--disable-server-feature-completion',
       '--disable-server-feature-search',
@@ -39,14 +60,14 @@
       sdkPath,
     ];
 
-    globals.printTrace('dart ${command.skip(1).join(' ')}');
-    _process = await globals.processManager.start(command);
+    _logger.printTrace('dart ${command.skip(1).join(' ')}');
+    _process = await _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(globals.printError);
+    errorStream.listen(_logger.printError);
 
     final Stream<String> inStream =
         _process.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter());
@@ -73,11 +94,11 @@
       'params': params,
     });
     _process.stdin.writeln(message);
-    globals.printTrace('==> $message');
+    _logger.printTrace('==> $message');
   }
 
   void _handleServerResponse(String line) {
-    globals.printTrace('<== $line');
+    _logger.printTrace('<== $line');
 
     final dynamic response = json.decode(line);
 
@@ -98,10 +119,10 @@
       } else if (response['error'] != null) {
         // Fields are 'code', 'message', and 'stackTrace'.
         final Map<String, dynamic> error = castStringKeyedMap(response['error']);
-        globals.printError(
+        _logger.printError(
             'Error response from the server: ${error['code']} ${error['message']}');
         if (error['stackTrace'] != null) {
-          globals.printError(error['stackTrace'] as String);
+          _logger.printError(error['stackTrace'] as String);
         }
       }
     }
@@ -117,9 +138,9 @@
 
   void _handleServerError(Map<String, dynamic> error) {
     // Fields are 'isFatal', 'message', and 'stackTrace'.
-    globals.printError('Error from the analysis server: ${error['message']}');
+    _logger.printError('Error from the analysis server: ${error['message']}');
     if (error['stackTrace'] != null) {
-      globals.printError(error['stackTrace'] as String);
+      _logger.printError(error['stackTrace'] as String);
     }
     _didServerErrorOccur = true;
   }
@@ -130,7 +151,13 @@
     final List<dynamic> errorsList = issueInfo['errors'] as List<dynamic>;
     final List<AnalysisError> errors = errorsList
         .map<Map<String, dynamic>>(castStringKeyedMap)
-        .map<AnalysisError>((Map<String, dynamic> json) => AnalysisError(json))
+        .map<AnalysisError>((Map<String, dynamic> json) {
+          return AnalysisError(json,
+            fileSystem: _fileSystem,
+            platform: _platform,
+            terminal: _terminal,
+          );
+        })
         .toList();
     if (!_errorsController.isClosed) {
       _errorsController.add(FileAnalysisErrors(file, errors));
@@ -152,7 +179,17 @@
 }
 
 class AnalysisError implements Comparable<AnalysisError> {
-  AnalysisError(this.json);
+  AnalysisError(this.json, {
+    @required Platform platform,
+    @required AnsiTerminal terminal,
+    @required FileSystem fileSystem,
+  }) : _platform = platform,
+       _terminal = terminal,
+       _fileSystem = fileSystem;
+
+  final Platform _platform;
+  final AnsiTerminal _terminal;
+  final FileSystem _fileSystem;
 
   static final Map<String, _AnalysisSeverity> _severityMap = <String, _AnalysisSeverity>{
     'INFO': _AnalysisSeverity.info,
@@ -160,7 +197,7 @@
     'ERROR': _AnalysisSeverity.error,
   };
 
-  static final String _separator = globals.platform.isWindows ? '-' : '•';
+  String  get _separator => _platform.isWindows ? '-' : '•';
 
   // "severity":"INFO","type":"TODO","location":{
   //   "file":"/Users/.../lib/test.dart","offset":362,"length":72,"startLine":15,"startColumn":4
@@ -171,9 +208,9 @@
   String get colorSeverity {
     switch(_severityLevel) {
       case _AnalysisSeverity.error:
-        return globals.terminal.color(severity, TerminalColor.red);
+        return _terminal.color(severity, TerminalColor.red);
       case _AnalysisSeverity.warning:
-        return globals.terminal.color(severity, TerminalColor.yellow);
+        return _terminal.color(severity, TerminalColor.yellow);
       case _AnalysisSeverity.info:
       case _AnalysisSeverity.none:
         return severity;
@@ -224,7 +261,7 @@
     final String padding = ' ' * math.max(0, 7 - severity.length);
     return '$padding${colorSeverity.toLowerCase()} $_separator '
         '$messageSentenceFragment $_separator '
-        '${globals.fs.path.relative(file)}:$startLine:$startColumn $_separator '
+        '${_fileSystem.path.relative(file)}:$startLine:$startColumn $_separator '
         '$code';
   }
 
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 1d23c04..d8ee436 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
@@ -5,12 +5,15 @@
 import 'dart:async';
 
 import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/base/os.dart';
+import 'package:flutter_tools/src/base/io.dart';
+import 'package:flutter_tools/src/base/logger.dart';
+import 'package:flutter_tools/src/base/terminal.dart';
 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/runner/flutter_command_runner.dart';
-import 'package:flutter_tools/src/globals.dart' as globals;
+import 'package:platform/platform.dart';
+import 'package:process/process.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
@@ -18,10 +21,21 @@
 void main() {
   AnalysisServer server;
   Directory tempDir;
+  FileSystem fileSystem;
+  Platform platform;
+  ProcessManager processManager;
+  AnsiTerminal terminal;
+  Logger logger;
 
   setUp(() {
+    platform = const LocalPlatform();
+    fileSystem = const LocalFileSystem();
+    platform = const LocalPlatform();
+    processManager = const LocalProcessManager();
+    terminal = AnsiTerminal(platform: platform, stdio: Stdio());
+    logger = BufferLogger(outputPreferences: OutputPreferences.test(), terminal: terminal);
     FlutterCommandRunner.initFlutterRoot();
-    tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analysis_test.');
+    tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analysis_test.');
   });
 
   tearDown(() {
@@ -29,13 +43,36 @@
     return server?.dispose();
   });
 
+
+  void _createSampleProject(Directory directory, { bool brokenCode = false }) {
+    final File pubspecFile = fileSystem.file(fileSystem.path.join(directory.path, 'pubspec.yaml'));
+    pubspecFile.writeAsStringSync('''
+  name: foo_project
+  ''');
+
+    final File dartFile = fileSystem.file(fileSystem.path.join(directory.path, 'lib', 'main.dart'));
+    dartFile.parent.createSync();
+    dartFile.writeAsStringSync('''
+  void main() {
+    print('hello world');
+    ${brokenCode ? 'prints("hello world");' : ''}
+  }
+  ''');
+  }
+
   group('analyze --watch', () {
     testUsingContext('AnalysisServer success', () async {
       _createSampleProject(tempDir);
 
-      await pub.get(context: PubContext.flutterTests, directory: tempDir.path);
+      await const Pub().get(context: PubContext.flutterTests, directory: tempDir.path);
 
-      server = AnalysisServer(dartSdkPath, <String>[tempDir.path]);
+      server = AnalysisServer(dartSdkPath, <String>[tempDir.path],
+        fileSystem: fileSystem,
+        platform: platform,
+        processManager: processManager,
+        logger: logger,
+        terminal: terminal,
+      );
 
       int errorCount = 0;
       final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
@@ -45,18 +82,21 @@
       await onDone;
 
       expect(errorCount, 0);
-    }, overrides: <Type, Generator>{
-      OperatingSystemUtils: () => globals.os,
-      Pub: () => const Pub(),
     });
   });
 
   testUsingContext('AnalysisServer errors', () async {
     _createSampleProject(tempDir, brokenCode: true);
 
-    await pub.get(context: PubContext.flutterTests, directory: tempDir.path);
+    await const Pub().get(context: PubContext.flutterTests, directory: tempDir.path);
 
-    server = AnalysisServer(dartSdkPath, <String>[tempDir.path]);
+    server = AnalysisServer(dartSdkPath, <String>[tempDir.path],
+      fileSystem: fileSystem,
+      platform: platform,
+      processManager: processManager,
+      logger: logger,
+      terminal: terminal,
+    );
 
     int errorCount = 0;
     final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
@@ -68,15 +108,18 @@
     await onDone;
 
     expect(errorCount, greaterThan(0));
-  }, overrides: <Type, Generator>{
-    OperatingSystemUtils: () => globals.os,
-    Pub: () => const Pub(),
   });
 
   testUsingContext('Returns no errors when source is error-free', () async {
     const String contents = "StringBuffer bar = StringBuffer('baz');";
     tempDir.childFile('main.dart').writeAsStringSync(contents);
-    server = AnalysisServer(dartSdkPath, <String>[tempDir.path]);
+    server = AnalysisServer(dartSdkPath, <String>[tempDir.path],
+      fileSystem: fileSystem,
+      platform: platform,
+      processManager: processManager,
+      logger: logger,
+      terminal: terminal,
+    );
 
     int errorCount = 0;
     final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
@@ -86,24 +129,5 @@
     await server.start();
     await onDone;
     expect(errorCount, 0);
-  }, overrides: <Type, Generator>{
-    OperatingSystemUtils: () => globals.os,
-    Pub: () => const Pub(),
   });
 }
-
-void _createSampleProject(Directory directory, { bool brokenCode = false }) {
-  final File pubspecFile = globals.fs.file(globals.fs.path.join(directory.path, 'pubspec.yaml'));
-  pubspecFile.writeAsStringSync('''
-name: foo_project
-''');
-
-  final File dartFile = globals.fs.file(globals.fs.path.join(directory.path, 'lib', 'main.dart'));
-  dartFile.parent.createSync();
-  dartFile.writeAsStringSync('''
-void main() {
-  print('hello world');
-  ${brokenCode ? 'prints("hello world");' : ''}
-}
-''');
-}
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 a2c11be..3ab094a 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart
@@ -5,7 +5,6 @@
 import 'package:file/file.dart';
 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';
@@ -13,6 +12,23 @@
 
 const String _kFlutterRoot = '/data/flutter';
 
+/// Return true if [fileList] contains a path that resides inside the Flutter repository.
+/// 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>[globals.fs.path.current];
+  }
+  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 = globals.fs.path.normalize(globals.fs.path.absolute(file));
+    if (file == root || file.startsWith(prefix)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 void main() {
   FileSystem fs;
   Directory tempDir;
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 bdf7884..3b30266 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
@@ -8,250 +8,326 @@
 
 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/terminal.dart';
 import 'package:flutter_tools/src/cache.dart';
 import 'package:flutter_tools/src/commands/analyze.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:process/process.dart';
 
 import '../../src/common.dart';
 import '../../src/context.dart';
 
-final Generator _kNoColorTerminalPlatform = () => FakePlatform.fromPlatform(const LocalPlatform())..stdoutSupportsAnsi = false;
-final Map<Type, Generator> noColorTerminalOverride = <Type, Generator>{
-  Platform: _kNoColorTerminalPlatform,
-};
+final Platform _kNoColorTerminalPlatform = FakePlatform.fromPlatform(const LocalPlatform())..stdoutSupportsAnsi = false;
 
 void main() {
-  final String analyzerSeparator = globals.platform.isWindows ? '-' : '•';
+  String analyzerSeparator;
+  FileSystem fileSystem;
+  Platform platform;
+  BufferLogger logger;
+  AnsiTerminal terminal;
+  ProcessManager processManager;
+  Directory tempDir;
+  String projectPath;
+  File libMain;
 
-  group('analyze once', () {
-    setUpAll(() {
-      Cache.disableLocking();
-      Cache.flutterRoot = FlutterCommandRunner.defaultFlutterRoot;
-    });
-
-    void _createDotPackages(String projectPath) {
-      final StringBuffer flutterRootUri = StringBuffer('file://');
-      final String canonicalizedFlutterRootPath = globals.fs.path.canonicalize(Cache.flutterRoot);
-      if (globals.platform.isWindows) {
-        flutterRootUri
-            ..write('/')
-            ..write(canonicalizedFlutterRootPath.replaceAll(r'\', '/'));
-      } else {
-        flutterRootUri.write(canonicalizedFlutterRootPath);
+  Future<void> runCommand({
+    FlutterCommand command,
+    List<String> arguments,
+    List<String> statusTextContains,
+    List<String> errorTextContains,
+    bool toolExit = false,
+    String exitMessageContains,
+  }) async {
+    try {
+      arguments.insert(0, '--flutter-root=${Cache.flutterRoot}');
+      await createTestCommandRunner(command).run(arguments);
+      expect(toolExit, isFalse, reason: 'Expected ToolExit exception');
+    } on ToolExit catch (e) {
+      if (!toolExit) {
+        testLogger.clear();
+        rethrow;
       }
-      final String dotPackagesSrc = '''
-# Generated
+      if (exitMessageContains != null) {
+        expect(e.message, contains(exitMessageContains));
+      }
+    }
+    assertContains(logger.statusText, statusTextContains);
+    assertContains(logger.errorText, errorTextContains);
+
+    logger.clear();
+  }
+
+  void _createDotPackages(String projectPath) {
+    final StringBuffer flutterRootUri = StringBuffer('file://');
+    final String canonicalizedFlutterRootPath = fileSystem.path.canonicalize(Cache.flutterRoot);
+    if (platform.isWindows) {
+      flutterRootUri
+          ..write('/')
+          ..write(canonicalizedFlutterRootPath.replaceAll('\\', '/'));
+    } else {
+      flutterRootUri.write(canonicalizedFlutterRootPath);
+    }
+    final String dotPackagesSrc = '''# Generated
 flutter:$flutterRootUri/packages/flutter/lib/
 sky_engine:$flutterRootUri/bin/cache/pkg/sky_engine/lib/
 flutter_project:lib/
 ''';
-      globals.fs.file(globals.fs.path.join(projectPath, '.packages'))
-          ..createSync(recursive: true)
-          ..writeAsStringSync(dotPackagesSrc);
+    fileSystem.file(fileSystem.path.join(projectPath, '.packages'))
+        ..createSync(recursive: true)
+        ..writeAsStringSync(dotPackagesSrc);
+  }
+
+  setUpAll(() {
+    Cache.disableLocking();
+    Cache.flutterRoot = FlutterCommandRunner.defaultFlutterRoot;
+    processManager = const LocalProcessManager();
+    terminal = AnsiTerminal(platform: platform, stdio: Stdio());
+    fileSystem = const LocalFileSystem();
+    platform = const LocalPlatform();
+    logger = BufferLogger(
+      outputPreferences: OutputPreferences.test(),
+      terminal: terminal,
+    );
+    analyzerSeparator = platform.isWindows ? '-' : '•';
+    tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analyze_once_test_1.').absolute;
+    projectPath = fileSystem.path.join(tempDir.path, 'flutter_project');
+    fileSystem.file(fileSystem.path.join(projectPath, 'pubspec.yaml'))
+        ..createSync(recursive: true)
+        ..writeAsStringSync(pubspecYamlSrc);
+    _createDotPackages(projectPath);
+  });
+
+  setUp(() {
+    libMain = fileSystem.file(fileSystem.path.join(projectPath, 'lib', 'main.dart'))
+        ..createSync(recursive: true)
+        ..writeAsStringSync(mainDartSrc);
+  });
+
+  tearDownAll(() {
+    tryToDelete(tempDir);
+  });
+
+  // Analyze in the current directory - no arguments
+  testUsingContext('working directory', () async {
+    await runCommand(
+      command: AnalyzeCommand(
+        workingDirectory: fileSystem.directory(projectPath),
+        fileSystem: fileSystem,
+        logger: logger,
+        platform: platform,
+        processManager: processManager,
+        terminal: terminal,
+      ),
+      arguments: <String>['analyze', '--no-pub'],
+      statusTextContains: <String>['No issues found!'],
+    );
+  });
+
+  // Analyze a specific file outside the current directory
+  testUsingContext('passing one file throws', () async {
+    await runCommand(
+      command: AnalyzeCommand(
+        platform: platform,
+        fileSystem: fileSystem,
+        logger: logger,
+        processManager: processManager,
+        terminal: terminal,
+      ),
+      arguments: <String>['analyze', '--no-pub', libMain.path],
+      toolExit: true,
+      exitMessageContains: 'is not a directory',
+    );
+  });
+
+  // Analyze in the current directory - no arguments
+  testUsingContext('working directory with errors', () async {
+    // Break the code to produce the "Avoid empty else" hint
+    // that is upgraded to a warning in package:flutter/analysis_options_user.yaml
+    // to assert that we are using the default Flutter analysis options.
+    // Also insert a statement that should not trigger a lint here
+    // but will trigger a lint later on when an analysis_options.yaml is added.
+    String source = await libMain.readAsString();
+    source = source.replaceFirst(
+      'return MaterialApp(',
+      'if (debugPrintRebuildDirtyWidgets) {} else ; return MaterialApp(',
+    );
+    source = source.replaceFirst(
+      'onPressed: _incrementCounter,',
+      '// onPressed: _incrementCounter,',
+    );
+    source = source.replaceFirst(
+        '_counter++;',
+        '_counter++; throw "an error message";',
+      );
+    libMain.writeAsStringSync(source);
+
+    // Analyze in the current directory - no arguments
+    await runCommand(
+      command: AnalyzeCommand(
+        workingDirectory: fileSystem.directory(projectPath),
+        platform: platform,
+        fileSystem: fileSystem,
+        logger: logger,
+        processManager: processManager,
+        terminal: terminal,
+      ),
+      arguments: <String>['analyze', '--no-pub'],
+      statusTextContains: <String>[
+        'Analyzing',
+        'info $analyzerSeparator Avoid empty else statements',
+        'info $analyzerSeparator Avoid empty statements',
+        'info $analyzerSeparator The declaration \'_incrementCounter\' isn\'t',
+      ],
+      exitMessageContains: '3 issues found.',
+      toolExit: true,
+    );
+  });
+
+  // Analyze in the current directory - no arguments
+  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 = fileSystem.file(fileSystem.path.join(projectPath, 'analysis_options.yaml'));
+    try {
+      optionsFile.writeAsStringSync('''
+  include: package:flutter/analysis_options_user.yaml
+  linter:
+    rules:
+      - only_throw_errors
+  ''');
+      String source = libMain.readAsStringSync();
+      source = source.replaceFirst(
+        'onPressed: _incrementCounter,',
+        '// onPressed: _incrementCounter,',
+      );
+      source = source.replaceFirst(
+        '_counter++;',
+        '_counter++; throw "an error message";',
+      );
+      libMain.writeAsStringSync(source);
+
+      // Analyze in the current directory - no arguments
+      await runCommand(
+        command: AnalyzeCommand(
+          workingDirectory: fileSystem.directory(projectPath),
+          platform: platform,
+          fileSystem: fileSystem,
+          logger: logger,
+          processManager: processManager,
+          terminal: terminal,
+        ),
+        arguments: <String>['analyze', '--no-pub'],
+        statusTextContains: <String>[
+          'Analyzing',
+          'info $analyzerSeparator The declaration \'_incrementCounter\' isn\'t',
+          'info $analyzerSeparator Only throw instances of classes extending either Exception or Error',
+        ],
+        exitMessageContains: '2 issues found.',
+        toolExit: true,
+      );
+    } finally {
+      if (optionsFile.existsSync()) {
+        optionsFile.deleteSync();
+      }
     }
+  });
 
-    group('default libMain', () {
-      Directory tempDir;
-      String projectPath;
-      File libMain;
+  testUsingContext('analyze once no duplicate issues', () async {
+    final Directory tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analyze_once_test_2.').absolute;
+    _createDotPackages(tempDir.path);
 
-      setUpAll(() async {
-        tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_1.').absolute;
-        projectPath = globals.fs.path.join(tempDir.path, 'flutter_project');
-        globals.fs.file(globals.fs.path.join(projectPath, 'pubspec.yaml'))
-            ..createSync(recursive: true)
-            ..writeAsStringSync(pubspecYamlSrc);
-        _createDotPackages(projectPath);
-      });
-
-      setUp(() {
-        libMain = globals.fs.file(globals.fs.path.join(projectPath, 'lib', 'main.dart'))
-            ..createSync(recursive: true)
-            ..writeAsStringSync(mainDartSrc);
-      });
-
-      tearDownAll(() {
-        tryToDelete(tempDir);
-      });
-
-      // Analyze in the current directory - no arguments
-      testUsingContext('working directory', () async {
-        await runCommand(
-          command: AnalyzeCommand(workingDirectory: globals.fs.directory(projectPath)),
-          arguments: <String>['analyze', '--no-pub'],
-          statusTextContains: <String>['No issues found!'],
-        );
-      });
-
-      // Analyze a specific file outside the current directory
-      testUsingContext('passing one file throws', () async {
-        await runCommand(
-          command: AnalyzeCommand(),
-          arguments: <String>['analyze', '--no-pub', libMain.path],
-          toolExit: true,
-          exitMessageContains: 'is not a directory',
-        );
-      });
-
-      // Analyze in the current directory - no arguments
-      testUsingContext('working directory with errors', () async {
-        // Break the code to produce the "Avoid empty else" hint
-        // that is upgraded to a warning in package:flutter/analysis_options_user.yaml
-        // to assert that we are using the default Flutter analysis options.
-        // Also insert a statement that should not trigger a lint here
-        // but will trigger a lint later on when an analysis_options.yaml is added.
-        String source = await libMain.readAsString();
-        source = source.replaceFirst(
-          'return MaterialApp(',
-          'if (debugPrintRebuildDirtyWidgets) {} else ; return MaterialApp(',
-        );
-        source = source.replaceFirst(
-          'onPressed: _incrementCounter,',
-          '// onPressed: _incrementCounter,',
-        );
-        source = source.replaceFirst(
-            '_counter++;',
-            '_counter++; throw "an error message";',
-          );
-        libMain.writeAsStringSync(source);
-
-        // Analyze in the current directory - no arguments
-        await runCommand(
-          command: AnalyzeCommand(workingDirectory: globals.fs.directory(projectPath)),
-          arguments: <String>['analyze', '--no-pub'],
-          statusTextContains: <String>[
-            'Analyzing',
-            'info $analyzerSeparator Avoid empty else statements',
-            'info $analyzerSeparator Avoid empty statements',
-            "info $analyzerSeparator The declaration '_incrementCounter' isn't",
-          ],
-          exitMessageContains: '3 issues found.',
-          toolExit: true,
-        );
-      });
-
-      // Analyze in the current directory - no arguments
-      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 = globals.fs.file(globals.fs.path.join(projectPath, 'analysis_options.yaml'));
-        try {
-          optionsFile.writeAsStringSync('''
-      include: package:flutter/analysis_options_user.yaml
-      linter:
-        rules:
-          - only_throw_errors
-      ''');
-          String source = libMain.readAsStringSync();
-          source = source.replaceFirst(
-            'onPressed: _incrementCounter,',
-            '// onPressed: _incrementCounter,',
-          );
-          source = source.replaceFirst(
-            '_counter++;',
-            '_counter++; throw "an error message";',
-          );
-          libMain.writeAsStringSync(source);
-
-          // Analyze in the current directory - no arguments
-          await runCommand(
-            command: AnalyzeCommand(workingDirectory: globals.fs.directory(projectPath)),
-            arguments: <String>['analyze', '--no-pub'],
-            statusTextContains: <String>[
-              'Analyzing',
-              "info $analyzerSeparator The declaration '_incrementCounter' isn't",
-              'info $analyzerSeparator Only throw instances of classes extending either Exception or Error',
-            ],
-            exitMessageContains: '2 issues found.',
-            toolExit: true,
-          );
-        } finally {
-          if (optionsFile.existsSync()) {
-            optionsFile.deleteSync();
-          }
-        }
-      });
-    });
-
-    testUsingContext('no duplicate issues', () async {
-      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_2.').absolute;
-      _createDotPackages(tempDir.path);
-
-      try {
-        final File foo = globals.fs.file(globals.fs.path.join(tempDir.path, 'foo.dart'));
-        foo.writeAsStringSync('''
+    try {
+      final File foo = fileSystem.file(fileSystem.path.join(tempDir.path, 'foo.dart'));
+      foo.writeAsStringSync('''
 import 'bar.dart';
 
 void foo() => bar();
 ''');
 
-        final File bar = globals.fs.file(globals.fs.path.join(tempDir.path, 'bar.dart'));
-        bar.writeAsStringSync('''
+      final File bar = fileSystem.file(fileSystem.path.join(tempDir.path, 'bar.dart'));
+      bar.writeAsStringSync('''
 import 'dart:async'; // unused
 
 void bar() {
 }
 ''');
 
-        // Analyze in the current directory - no arguments
-        await runCommand(
-          command: AnalyzeCommand(workingDirectory: tempDir),
-          arguments: <String>['analyze', '--no-pub'],
-          statusTextContains: <String>[
-            'Analyzing',
-          ],
-          exitMessageContains: '1 issue found.',
-          toolExit: true,
-        );
-      } finally {
-        tryToDelete(tempDir);
-      }
-    });
+      // Analyze in the current directory - no arguments
+      await runCommand(
+        command: AnalyzeCommand(
+          workingDirectory: tempDir,
+          platform: platform,
+          fileSystem: fileSystem,
+          logger: logger,
+          processManager: processManager,
+          terminal: terminal,
+        ),
+        arguments: <String>['analyze', '--no-pub'],
+        statusTextContains: <String>[
+          'Analyzing',
+        ],
+        exitMessageContains: '1 issue found.',
+        toolExit: true,
+      );
+    } finally {
+      tryToDelete(tempDir);
+    }
+  });
 
-    testUsingContext('returns no issues when source is error-free', () async {
-      const String contents = '''
+  testUsingContext('analyze once returns no issues when source is error-free', () async {
+    const String contents = '''
 StringBuffer bar = StringBuffer('baz');
 ''';
-      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_3.');
-      _createDotPackages(tempDir.path);
+    final Directory tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analyze_once_test_3.');
+    _createDotPackages(tempDir.path);
 
-      tempDir.childFile('main.dart').writeAsStringSync(contents);
-      try {
-        await runCommand(
-          command: AnalyzeCommand(workingDirectory: globals.fs.directory(tempDir)),
-          arguments: <String>['analyze', '--no-pub'],
-          statusTextContains: <String>['No issues found!'],
-        );
-      } finally {
-        tryToDelete(tempDir);
-      }
-    }, overrides: <Type, Generator>{
-      ...noColorTerminalOverride
-    });
+    tempDir.childFile('main.dart').writeAsStringSync(contents);
+    try {
+      await runCommand(
+        command: AnalyzeCommand(
+          workingDirectory: fileSystem.directory(tempDir),
+          platform: _kNoColorTerminalPlatform,
+          fileSystem: fileSystem,
+          logger: logger,
+          processManager: processManager,
+          terminal: terminal,
+        ),
+        arguments: <String>['analyze', '--no-pub'],
+        statusTextContains: <String>['No issues found!'],
+      );
+    } finally {
+      tryToDelete(tempDir);
+    }
+  });
 
-    testUsingContext('returns no issues for todo comments', () async {
-      const String contents = '''
+  testUsingContext('analyze once returns no issues for todo comments', () async {
+    const String contents = '''
 // TODO(foobar):
 StringBuffer bar = StringBuffer('baz');
 ''';
-      final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_analyze_once_test_4.');
-      _createDotPackages(tempDir.path);
+    final Directory tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analyze_once_test_4.');
+    _createDotPackages(tempDir.path);
 
-      tempDir.childFile('main.dart').writeAsStringSync(contents);
-      try {
-        await runCommand(
-          command: AnalyzeCommand(workingDirectory: globals.fs.directory(tempDir)),
-          arguments: <String>['analyze', '--no-pub'],
-          statusTextContains: <String>['No issues found!'],
-        );
-      } finally {
-        tryToDelete(tempDir);
-      }
-    }, overrides: <Type, Generator>{
-      ...noColorTerminalOverride
-    });
+    tempDir.childFile('main.dart').writeAsStringSync(contents);
+    try {
+      await runCommand(
+        command: AnalyzeCommand(
+          workingDirectory: fileSystem.directory(tempDir),
+          platform: _kNoColorTerminalPlatform,
+          terminal: terminal,
+          processManager: processManager,
+          logger: logger,
+          fileSystem: fileSystem,
+        ),
+        arguments: <String>['analyze', '--no-pub'],
+        statusTextContains: <String>['No issues found!'],
+      );
+    } finally {
+      tryToDelete(tempDir);
+    }
   });
 }
 
@@ -265,33 +341,6 @@
   }
 }
 
-Future<void> runCommand({
-  FlutterCommand command,
-  List<String> arguments,
-  List<String> statusTextContains,
-  List<String> errorTextContains,
-  bool toolExit = false,
-  String exitMessageContains,
-}) async {
-  try {
-    arguments.insert(0, '--flutter-root=${Cache.flutterRoot}');
-    await createTestCommandRunner(command).run(arguments);
-    expect(toolExit, isFalse, reason: 'Expected ToolExit exception');
-  } on ToolExit catch (e) {
-    if (!toolExit) {
-      testLogger.clear();
-      rethrow;
-    }
-    if (exitMessageContains != null) {
-      expect(e.message, contains(exitMessageContains));
-    }
-  }
-  assertContains(testLogger.statusText, statusTextContains);
-  assertContains(testLogger.errorText, errorTextContains);
-
-  testLogger.clear();
-}
-
 const String mainDartSrc = r'''
 import 'package:flutter/material.dart';
 
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
deleted file mode 100644
index e91b4cc..0000000
--- a/packages/flutter_tools/test/general.shard/dart/sdk_validation_test.dart
+++ /dev/null
@@ -1,77 +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 'dart:async';
-
-import 'package:flutter_tools/src/base/file_system.dart';
-import 'package:flutter_tools/src/cache.dart';
-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';
-
-void main() {
-  testSampleProject('ui', 'Window');
-  testSampleProject('html', 'HttpStatus');
-  testSampleProject('js', 'allowInterop');
-  testSampleProject('js_util', 'jsify');
-}
-
-void testSampleProject(String lib, String member) {
-  testUsingContext('contains dart:$lib', () async {
-    Cache.disableLocking();
-    final Directory projectDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_sdk_validation_${lib}_test.').absolute;
-
-    try {
-      final File pubspecFile = globals.fs.file(globals.fs.path.join(projectDirectory.path, 'pubspec.yaml'));
-      pubspecFile.writeAsStringSync('''
-name: ${lib}_project
-dependencies:
-  flutter:
-    sdk: flutter
-''');
-
-      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;
-void main() {
-  // ignore: unnecessary_statements
-  $lib.$member;
-}
-''');
-
-      await pub.get(context: PubContext.flutterTests, directory: projectDirectory.path);
-      final AnalysisServer server = AnalysisServer(dartSdkPath, <String>[projectDirectory.path]);
-      try {
-        final int errorCount = await analyze(server);
-        expect(errorCount, 0);
-      } finally {
-        await server.dispose();
-      }
-    } finally {
-      tryToDelete(projectDirectory);
-      Cache.enableLocking();
-    }
-  }, skip: true);
-}
-
-Future<int> analyze(AnalysisServer server) async {
-  int errorCount = 0;
-  final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
-  server.onErrors.listen((FileAnalysisErrors result) {
-    for (final AnalysisError error in result.errors) {
-      print(error.toString().trim());
-    }
-    errorCount += result.errors.length;
-  });
-
-  await server.start();
-  await onDone;
-
-  return errorCount;
-}
