simplify toolchain setup
diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart
index e918a63..8533090 100644
--- a/packages/flutter_tools/lib/src/application_package.dart
+++ b/packages/flutter_tools/lib/src/application_package.dart
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:async';
 import 'dart:io';
 
 import 'package:path/path.dart' as path;
@@ -118,7 +117,7 @@
     }
   }
 
-  static Future<ApplicationPackageStore> forConfigs(List<BuildConfiguration> configs) async {
+  static ApplicationPackageStore forConfigs(List<BuildConfiguration> configs) {
     AndroidApk android;
     IOSApp iOS;
 
diff --git a/packages/flutter_tools/lib/src/commands/build_apk.dart b/packages/flutter_tools/lib/src/commands/build_apk.dart
index 7847789..016ca6c 100644
--- a/packages/flutter_tools/lib/src/commands/build_apk.dart
+++ b/packages/flutter_tools/lib/src/commands/build_apk.dart
@@ -185,8 +185,6 @@
       return 1;
     }
 
-    await downloadToolchain();
-
     // TODO(devoncarew): This command should take an arg for the output type (arm / x64).
 
     return await buildAndroid(
diff --git a/packages/flutter_tools/lib/src/commands/build_flx.dart b/packages/flutter_tools/lib/src/commands/build_flx.dart
index f47a210..9d4cf2f 100644
--- a/packages/flutter_tools/lib/src/commands/build_flx.dart
+++ b/packages/flutter_tools/lib/src/commands/build_flx.dart
@@ -40,10 +40,7 @@
   @override
   Future<int> runInProject() async {
     String compilerPath = argResults['compiler'];
-
-    if (compilerPath == null)
-      await downloadToolchain();
-    else
+    if (compilerPath != null)
       toolchain = new Toolchain(compiler: new SnapshotCompiler(compilerPath));
 
     String outputPath = argResults['output-file'];
diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart
index 6db8a43..85e1922 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios.dart
@@ -31,13 +31,6 @@
       return 1;
     }
 
-    printTrace('Ensuring toolchains are up to date.');
-
-    await Future.wait([
-      downloadToolchain(),
-      downloadApplicationPackages(),
-    ], eagerError: true);
-
     IOSApp app = applicationPackages.iOS;
 
     if (app == null) {
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index 5784cc4..12582f8 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -262,11 +262,6 @@
     Directory.current = new Directory(projectDirectory);
 
     try {
-      await Future.wait([
-        command.downloadToolchain(),
-        command.downloadApplicationPackages(),
-      ], eagerError: true);
-
       int result = await startApp(
         device,
         command.applicationPackages,
@@ -304,11 +299,6 @@
     Directory.current = new Directory(projectDirectory);
 
     try {
-      await Future.wait([
-        command.downloadToolchain(),
-        command.downloadApplicationPackages(),
-      ], eagerError: true);
-
       ApplicationPackage app = command.applicationPackages.getPackageForPlatform(device.platform);
       return device.stopApp(app);
     } finally {
diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart
index 0d8c703..142f410 100644
--- a/packages/flutter_tools/lib/src/commands/drive.dart
+++ b/packages/flutter_tools/lib/src/commands/drive.dart
@@ -80,8 +80,6 @@
 
   @override
   Future<int> runInProject() async {
-    await toolchainDownloader(this);
-
     String testFile = _getTestFile();
     if (testFile == null) {
       return 1;
@@ -311,18 +309,3 @@
   bool stopped = await command.device.stopApp(package);
   return stopped ? 0 : 1;
 }
-
-/// Downloads Flutter toolchain.
-typedef Future<Null> ToolchainDownloader(DriveCommand command);
-ToolchainDownloader toolchainDownloader = downloadToolchain;
-void restoreToolchainDownloader() {
-  toolchainDownloader = downloadToolchain;
-}
-
-Future<Null> downloadToolchain(DriveCommand command) async {
-  printTrace('Downloading toolchain.');
-  await Future.wait([
-    command.downloadToolchain(),
-    command.downloadApplicationPackages(),
-  ], eagerError: true);
-}
diff --git a/packages/flutter_tools/lib/src/commands/install.dart b/packages/flutter_tools/lib/src/commands/install.dart
index 3e68041..c3ae09c 100644
--- a/packages/flutter_tools/lib/src/commands/install.dart
+++ b/packages/flutter_tools/lib/src/commands/install.dart
@@ -21,8 +21,6 @@
 
   @override
   Future<int> runInProject() async {
-    await downloadApplicationPackages();
-
     Device device = deviceForCommand;
     ApplicationPackage package = applicationPackages.getPackageForPlatform(device.platform);
 
diff --git a/packages/flutter_tools/lib/src/commands/listen.dart b/packages/flutter_tools/lib/src/commands/listen.dart
index 420441b..68fdfa9 100644
--- a/packages/flutter_tools/lib/src/commands/listen.dart
+++ b/packages/flutter_tools/lib/src/commands/listen.dart
@@ -32,9 +32,6 @@
 
   @override
   Future<int> runInProject() async {
-    await downloadApplicationPackages();
-    await downloadToolchain();
-
     Iterable<String> directories = () sync* {
       yield* argResults.rest;
       yield '.';
diff --git a/packages/flutter_tools/lib/src/commands/refresh.dart b/packages/flutter_tools/lib/src/commands/refresh.dart
index aa875bc..cef5a1b 100644
--- a/packages/flutter_tools/lib/src/commands/refresh.dart
+++ b/packages/flutter_tools/lib/src/commands/refresh.dart
@@ -34,13 +34,6 @@
 
   @override
   Future<int> runInProject() async {
-    printTrace('Downloading toolchain.');
-
-    await Future.wait([
-      downloadToolchain(),
-      downloadApplicationPackages(),
-    ], eagerError: true);
-
     Directory tempDir = await Directory.systemTemp.createTemp('flutter_tools');
     try {
       String snapshotPath = path.join(tempDir.path, 'snapshot_blob.bin');
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index aff777a..3d4699b 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -94,13 +94,6 @@
 
   @override
   Future<int> runInProject() async {
-    printTrace('Downloading toolchain.');
-
-    await Future.wait([
-      downloadToolchain(),
-      downloadApplicationPackages(),
-    ], eagerError: true);
-
     bool clearLogs = argResults['clear-logs'];
 
     int debugPort;
diff --git a/packages/flutter_tools/lib/src/commands/run_mojo.dart b/packages/flutter_tools/lib/src/commands/run_mojo.dart
index c1e4034..916bc43 100644
--- a/packages/flutter_tools/lib/src/commands/run_mojo.dart
+++ b/packages/flutter_tools/lib/src/commands/run_mojo.dart
@@ -162,8 +162,6 @@
       return 1;
     }
 
-    await downloadToolchain();
-
     String targetApp = argResults['app'];
     if (targetApp == null) {
       targetApp = _kDefaultBundlePath;
diff --git a/packages/flutter_tools/lib/src/commands/stop.dart b/packages/flutter_tools/lib/src/commands/stop.dart
index 9a4ad86..630ecb1 100644
--- a/packages/flutter_tools/lib/src/commands/stop.dart
+++ b/packages/flutter_tools/lib/src/commands/stop.dart
@@ -21,7 +21,6 @@
 
   @override
   Future<int> runInProject() async {
-    await downloadApplicationPackages();
     Device device = deviceForCommand;
     ApplicationPackage app = applicationPackages.getPackageForPlatform(device.platform);
     printStatus('Stopping apps on ${device.name}.');
diff --git a/packages/flutter_tools/lib/src/commands/trace.dart b/packages/flutter_tools/lib/src/commands/trace.dart
index aa630a4..15aeced 100644
--- a/packages/flutter_tools/lib/src/commands/trace.dart
+++ b/packages/flutter_tools/lib/src/commands/trace.dart
@@ -38,8 +38,6 @@
 
   @override
   Future<int> runInProject() async {
-    await downloadApplicationPackages();
-
     ApplicationPackage androidApp = applicationPackages.android;
     AndroidDevice device = deviceForCommand;
 
diff --git a/packages/flutter_tools/lib/src/ios/plist_utils.dart b/packages/flutter_tools/lib/src/ios/plist_utils.dart
index 3916a29..3b36af4 100644
--- a/packages/flutter_tools/lib/src/ios/plist_utils.dart
+++ b/packages/flutter_tools/lib/src/ios/plist_utils.dart
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:io';
+
 import 'package:path/path.dart' as path;
 
 import '../base/process.dart';
@@ -9,21 +11,22 @@
 const String kCFBundleIdentifierKey = "CFBundleIdentifier";
 
 String getValueFromFile(String plistFilePath, String key) {
-  // TODO(chinmaygarde): For now, we only need to read from plist files on a
-  // mac host. If this changes, we will need our own Dart plist reader.
+  // TODO(chinmaygarde): For now, we only need to read from plist files on a mac
+  // host. If this changes, we will need our own Dart plist reader.
 
   // Don't use PlistBuddy since that is not guaranteed to be installed.
   // 'defaults' requires the path to be absolute and without the 'plist'
   // extension.
+
+  if (!FileSystemEntity.isFileSync(plistFilePath))
+    return null;
+
   String normalizedPlistPath = path.withoutExtension(path.absolute(plistFilePath));
 
   try {
     String value = runCheckedSync(<String>[
-      '/usr/bin/defaults',
-      'read',
-      normalizedPlistPath,
-      key
-    ]).trim();
+      '/usr/bin/defaults', 'read', normalizedPlistPath, key
+    ]);
     return value.isEmpty ? null : value;
   } catch (error) {
     return null;
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index 9aa4d3a..f604bb0 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -58,12 +58,12 @@
     _usesPubOption = true;
   }
 
-  Future<Null> downloadToolchain() async {
-    toolchain ??= await Toolchain.forConfigs(buildConfigurations);
+  void _setupToolchain() {
+    toolchain ??= Toolchain.forConfigs(buildConfigurations);
   }
 
-  Future<Null> downloadApplicationPackages() async {
-    applicationPackages ??= await ApplicationPackageStore.forConfigs(buildConfigurations);
+  void _setupApplicationPackages() {
+    applicationPackages ??= ApplicationPackageStore.forConfigs(buildConfigurations);
   }
 
   @override
@@ -126,6 +126,9 @@
         return exitCode;
     }
 
+    _setupToolchain();
+    _setupApplicationPackages();
+
     return await runInProject();
   }
 
diff --git a/packages/flutter_tools/lib/src/toolchain.dart b/packages/flutter_tools/lib/src/toolchain.dart
index 25015d4..db8679b 100644
--- a/packages/flutter_tools/lib/src/toolchain.dart
+++ b/packages/flutter_tools/lib/src/toolchain.dart
@@ -57,7 +57,7 @@
 
   final SnapshotCompiler compiler;
 
-  static Future<Toolchain> forConfigs(List<BuildConfiguration> configs) async {
+  static Toolchain forConfigs(List<BuildConfiguration> configs) {
     for (BuildConfiguration config in configs) {
       String compilerPath = _getCompilerPath(config);
       if (compilerPath != null)
diff --git a/packages/flutter_tools/test/drive_test.dart b/packages/flutter_tools/test/drive_test.dart
index e28fde1..4f20623c 100644
--- a/packages/flutter_tools/test/drive_test.dart
+++ b/packages/flutter_tools/test/drive_test.dart
@@ -35,7 +35,6 @@
       command = new DriveCommand();
       applyMocksToCommand(command);
       useInMemoryFileSystem(cwd: '/some/app');
-      toolchainDownloader = (_) async { };
       targetDeviceFinder = () {
         throw 'Unexpected call to targetDeviceFinder';
       };