introduce globals scoped to the app's context
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 460ade4..7c865b3 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -7,33 +7,48 @@
 import 'android/device_android.dart';
 import 'application_package.dart';
 import 'base/common.dart';
-import 'base/context.dart';
+import 'base/globals.dart';
 import 'build_configuration.dart';
 import 'ios/device_ios.dart';
 import 'toolchain.dart';
 
 /// A class to get all available devices.
 class DeviceManager {
+  /// Constructing DeviceManagers is cheap; they only do expensive work if some
+  /// of their methods are invoked.
   DeviceManager() {
-    // Init the known discoverers.
+    // Register the known discoverers.
     _deviceDiscoverers.add(new AndroidDeviceDiscovery());
     _deviceDiscoverers.add(new IOSDeviceDiscovery());
     _deviceDiscoverers.add(new IOSSimulatorDiscovery());
+  }
 
-    Future.forEach(_deviceDiscoverers, (DeviceDiscovery discoverer) {
-      if (!discoverer.supportsPlatform)
-        return null;
-      return discoverer.init();
-    }).then((_) {
-      _initedCompleter.complete();
-    }).catchError((error, stackTrace) {
-      _initedCompleter.completeError(error, stackTrace);
-    });
+  Future _init() {
+    if (_initedCompleter == null) {
+      _initedCompleter = new Completer();
+
+      Future.forEach(_deviceDiscoverers, (DeviceDiscovery discoverer) {
+        if (!discoverer.supportsPlatform)
+          return null;
+        return discoverer.init();
+      }).then((_) {
+        _initedCompleter.complete();
+      }).catchError((error, stackTrace) {
+        _initedCompleter.completeError(error, stackTrace);
+      });
+    }
+
+    return _initedCompleter.future;
   }
 
   List<DeviceDiscovery> _deviceDiscoverers = <DeviceDiscovery>[];
 
-  Completer _initedCompleter = new Completer();
+  /// A user-specified device ID.
+  String specifiedDeviceId;
+
+  Completer _initedCompleter;
+
+  bool get hasSpecifiedDeviceId => specifiedDeviceId != null;
 
   /// Return the device with the matching ID; else, complete the Future with
   /// `null`.
@@ -41,15 +56,26 @@
   /// This does a case insentitive compare with `deviceId`.
   Future<Device> getDeviceById(String deviceId) async {
     deviceId = deviceId.toLowerCase();
-    List<Device> devices = await getDevices();
+    List<Device> devices = await getAllConnectedDevices();
     return devices.firstWhere(
       (Device device) => device.id.toLowerCase() == deviceId,
       orElse: () => null
     );
   }
 
+  /// Return the list of connected devices, filtered by any user-specified device id.
   Future<List<Device>> getDevices() async {
-    await _initedCompleter.future;
+    if (specifiedDeviceId == null) {
+      return getAllConnectedDevices();
+    } else {
+      Device device = await getDeviceById(specifiedDeviceId);
+      return device == null ? <Device>[] : <Device>[device];
+    }
+  }
+
+  /// Return the list of all connected devices.
+  Future<List<Device>> getAllConnectedDevices() async {
+    await _init();
 
     return _deviceDiscoverers
       .where((DeviceDiscovery discoverer) => discoverer.supportsPlatform)