Ensure errors launching emulators are exposed to the daemon (#18446)

diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart
index 0379655..adb1ee7 100644
--- a/packages/flutter_tools/lib/src/android/android_emulator.dart
+++ b/packages/flutter_tools/lib/src/android/android_emulator.dart
@@ -11,7 +11,6 @@
 import '../base/file_system.dart';
 import '../base/process.dart';
 import '../emulator.dart';
-import '../globals.dart';
 import 'android_sdk.dart';
 
 class AndroidEmulators extends EmulatorDiscovery {
@@ -41,22 +40,20 @@
   String get label => _properties['avd.ini.displayname'];
 
   @override
-  Future<bool> launch() async {
-    final Future<bool> launchResult =
+  Future<void> launch() async {
+    final Future<void> launchResult =
         runAsync(<String>[getEmulatorPath(), '-avd', id])
             .then((RunResult runResult) {
               if (runResult.exitCode != 0) {
-                printError('$runResult');
-                return false;
+                throw '$runResult';
               }
-              return true;
             });
     // emulator continues running on a successful launch so if we
     // haven't quit within 3 seconds we assume that's a success and just
     // return.
-    return Future.any<bool>(<Future<bool>>[
+    return Future.any<void>(<Future<void>>[
       launchResult,
-      new Future<void>.delayed(const Duration(seconds: 3)).then((_) => true)
+      new Future<void>.delayed(const Duration(seconds: 3))
     ]);
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/emulators.dart b/packages/flutter_tools/lib/src/commands/emulators.dart
index 4909748..78b1284 100644
--- a/packages/flutter_tools/lib/src/commands/emulators.dart
+++ b/packages/flutter_tools/lib/src/commands/emulators.dart
@@ -49,7 +49,7 @@
     }
   }
 
-  Future<Null> _launchEmulator(String id) async {
+  Future<void> _launchEmulator(String id) async {
     final List<Emulator> emulators =
         await emulatorManager.getEmulatorsMatching(id);
 
@@ -61,11 +61,16 @@
         "More than one emulator matches '$id':",
       );
     } else {
-      await emulators.first.launch();
+      try {
+        await emulators.first.launch();
+      }
+      catch (e) {
+        printError(e);
+      }
     }
   }
 
-  Future<Null> _listEmulators(String searchText) async {
+  Future<void> _listEmulators(String searchText) async {
     final List<Emulator> emulators = searchText == null
         ? await emulatorManager.getAllAvailableEmulators()
         : await emulatorManager.getEmulatorsMatching(searchText);
diff --git a/packages/flutter_tools/lib/src/emulator.dart b/packages/flutter_tools/lib/src/emulator.dart
index d899210..81bbe2a 100644
--- a/packages/flutter_tools/lib/src/emulator.dart
+++ b/packages/flutter_tools/lib/src/emulator.dart
@@ -95,7 +95,7 @@
     return id == other.id;
   }
 
-  Future<bool> launch();
+  Future<void> launch();
 
   @override
   String toString() => name;
diff --git a/packages/flutter_tools/lib/src/ios/ios_emulators.dart b/packages/flutter_tools/lib/src/ios/ios_emulators.dart
index c18bd71..cd85c2f 100644
--- a/packages/flutter_tools/lib/src/ios/ios_emulators.dart
+++ b/packages/flutter_tools/lib/src/ios/ios_emulators.dart
@@ -36,8 +36,8 @@
   String get label => null;
 
   @override
-  Future<bool> launch() async {
-    Future<bool> launchSimulator(List<String> additionalArgs) async {
+  Future<void> launch() async {
+    Future<void> launchSimulator(List<String> additionalArgs) async {
       final List<String> args = <String>['open']
           .followedBy(additionalArgs)
           .followedBy(<String>['-a', getSimulatorPath()]);
diff --git a/packages/flutter_tools/test/emulator_test.dart b/packages/flutter_tools/test/emulator_test.dart
index 30b411a..be36d5f 100644
--- a/packages/flutter_tools/test/emulator_test.dart
+++ b/packages/flutter_tools/test/emulator_test.dart
@@ -62,7 +62,7 @@
   final String label;
 
   @override
-  Future<bool> launch() {
+  Future<void> launch() {
     throw new UnimplementedError('Not implemented in Mock');
   }
 }