Implement VmService instead of adding extension methods
diff --git a/packages/flutter_tools/lib/src/commands/screenshot.dart b/packages/flutter_tools/lib/src/commands/screenshot.dart
index 937dfe2..8f7d4d1 100644
--- a/packages/flutter_tools/lib/src/commands/screenshot.dart
+++ b/packages/flutter_tools/lib/src/commands/screenshot.dart
@@ -130,7 +130,7 @@
 
   Future<bool> runSkia(File outputFile) async {
     final Uri observatoryUri = Uri.parse(stringArg(_kObservatoryUri));
-    final vm_service.VmService vmService = await connectToVmService(observatoryUri);
+    final FlutterVmService vmService = await connectToVmService(observatoryUri);
     final vm_service.Response skp = await vmService.screenshotSkp();
     if (skp == null) {
       globals.printError(
@@ -154,7 +154,7 @@
 
   Future<bool> runRasterizer(File outputFile) async {
     final Uri observatoryUri = Uri.parse(stringArg(_kObservatoryUri));
-    final vm_service.VmService vmService = await connectToVmService(observatoryUri);
+    final FlutterVmService vmService = await connectToVmService(observatoryUri);
     final vm_service.Response response = await vmService.screenshot();
     if (response == null) {
       globals.printError(
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index 5c6f98e..5988151 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -224,7 +224,7 @@
 class _DevFSHttpWriter implements DevFSWriter {
   _DevFSHttpWriter(
     this.fsName,
-    vm_service.VmService serviceProtocol, {
+    FlutterVmService serviceProtocol, {
     @required OperatingSystemUtils osUtils,
     @required HttpClient httpClient,
     @required Logger logger,
@@ -370,7 +370,7 @@
   ///
   /// Failed uploads are retried after [uploadRetryThrottle] duration, defaults to 500ms.
   DevFS(
-    vm_service.VmService serviceProtocol,
+    FlutterVmService serviceProtocol,
     this.fsName,
     this.rootDirectory, {
     @required OperatingSystemUtils osUtils,
@@ -392,7 +392,7 @@
           : context.get<HttpClientFactory>()())
       );
 
-  final vm_service.VmService _vmService;
+  final FlutterVmService _vmService;
   final _DevFSHttpWriter _httpWriter;
   final Logger _logger;
   final FileSystem _fileSystem;
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index cbbf9e5..6057796 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -7,7 +7,6 @@
 
 import 'package:meta/meta.dart';
 import 'package:process/process.dart';
-import 'package:vm_service/vm_service.dart' as vm_service;
 
 import 'android/android_device_discovery.dart';
 import 'android/android_sdk.dart';
@@ -43,6 +42,7 @@
 import 'project.dart';
 import 'tester/flutter_tester.dart';
 import 'version.dart';
+import 'vmservice.dart';
 import 'web/web_device.dart';
 import 'windows/windows_device.dart';
 import 'windows/windows_workflow.dart';
@@ -1028,7 +1028,7 @@
 
   /// Some logs can be obtained from a VM service stream.
   /// Set this after the VM services are connected.
-  vm_service.VmService connectedVMService;
+  FlutterVmService connectedVMService;
 
   @override
   String toString() => name;
@@ -1058,7 +1058,7 @@
   int appPid;
 
   @override
-  vm_service.VmService connectedVMService;
+  FlutterVmService connectedVMService;
 
   @override
   Stream<String> get logLines => const Stream<String>.empty();
diff --git a/packages/flutter_tools/lib/src/drive/drive_service.dart b/packages/flutter_tools/lib/src/drive/drive_service.dart
index b9f7bff..9607bbe 100644
--- a/packages/flutter_tools/lib/src/drive/drive_service.dart
+++ b/packages/flutter_tools/lib/src/drive/drive_service.dart
@@ -125,7 +125,7 @@
   Device _device;
   ApplicationPackage _applicationPackage;
   String _vmServiceUri;
-  vm_service.VmService _vmService;
+  FlutterVmService _vmService;
 
   @override
   Future<void> start(
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 7824ebb..55f3fd8 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -5,7 +5,6 @@
 import 'dart:async';
 
 import 'package:meta/meta.dart';
-import 'package:vm_service/vm_service.dart' as vm_service;
 
 import '../application_package.dart';
 import '../artifacts.dart';
@@ -48,7 +47,7 @@
 final String _ipv6Loopback = InternetAddress.loopbackIPv6.address;
 
 // Enables testing the fuchsia isolate discovery
-Future<vm_service.VmService> _kDefaultFuchsiaIsolateDiscoveryConnector(Uri uri) {
+Future<FlutterVmService> _kDefaultFuchsiaIsolateDiscoveryConnector(Uri uri) {
   return connectToVmService(uri);
 }
 
@@ -695,7 +694,7 @@
         // netstat shows that the local port is actually being used on the IPv6
         // loopback (::1).
         final Uri uri = Uri.parse('http://[$_ipv6Loopback]:$port');
-        final vm_service.VmService vmService = await connectToVmService(uri);
+        final FlutterVmService vmService = await connectToVmService(uri);
         final List<FlutterView> flutterViews = await vmService.getFlutterViews();
         for (final FlutterView flutterView in flutterViews) {
           if (flutterView.uiIsolate == null) {
@@ -738,11 +737,11 @@
   ]);
 
   static const Duration _pollDuration = Duration(seconds: 10);
-  final Map<int, vm_service.VmService> _ports = <int, vm_service.VmService>{};
+  final Map<int, FlutterVmService> _ports = <int, FlutterVmService>{};
   final FuchsiaDevice _device;
   final String _isolateName;
   final Completer<Uri> _foundUri = Completer<Uri>();
-  final Future<vm_service.VmService> Function(Uri) _vmServiceConnector;
+  final Future<FlutterVmService> Function(Uri) _vmServiceConnector;
   final Future<void> Function(Device, Uri, bool) _ddsStarter;
   // whether to only poll once.
   final bool _pollOnce;
@@ -778,7 +777,7 @@
   Future<void> _findIsolate() async {
     final List<int> ports = await _device.servicePorts();
     for (final int port in ports) {
-      vm_service.VmService service;
+      FlutterVmService service;
       if (_ports.containsKey(port)) {
         service = _ports[port];
       } else {
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index 720e61b..dfa40cc 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -658,18 +658,18 @@
   Stream<String> get logLines => _linesController.stream;
 
   @override
-  vm_service.VmService get connectedVMService => _connectedVMService;
-  vm_service.VmService _connectedVMService;
+  FlutterVmService get connectedVMService => _connectedVMService;
+  FlutterVmService _connectedVMService;
 
   @override
-  set connectedVMService(vm_service.VmService connectedVmService) {
+  set connectedVMService(FlutterVmService connectedVmService) {
     _listenToUnifiedLoggingEvents(connectedVmService);
     _connectedVMService = connectedVmService;
   }
 
   static const int minimumUniversalLoggingSdkVersion = 13;
 
-  Future<void> _listenToUnifiedLoggingEvents(vm_service.VmService connectedVmService) async {
+  Future<void> _listenToUnifiedLoggingEvents(FlutterVmService connectedVmService) async {
     if (_majorSdkVersion < minimumUniversalLoggingSdkVersion) {
       return;
     }
diff --git a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart
index 2e1d911..98ac44c 100644
--- a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart
+++ b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart
@@ -120,8 +120,10 @@
   WipConnection _wipConnection;
   ChromiumLauncher _chromiumLauncher;
 
-  vmservice.VmService get _vmService =>
-      _connectionResult?.debugConnection?.vmService;
+  FlutterVmService get _vmService => _flutterVmService ??= FlutterVmService.fromVmService(
+    _connectionResult?.debugConnection?.vmService,
+  );
+  FlutterVmService _flutterVmService;
 
   @override
   bool get canHotRestart {
@@ -812,7 +814,7 @@
         _connectionResult.appConnection.runMain();
       } else {
         StreamSubscription<void> resumeSub;
-        resumeSub = _connectionResult.debugConnection.vmService.onDebugEvent
+        resumeSub = _vmService.onDebugEvent
             .listen((vmservice.Event event) {
           if (event.type == vmservice.EventKind.kResume) {
             _connectionResult.appConnection.runMain();
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 005ac07..ca348a1 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -192,7 +192,7 @@
 
   DevFSWriter devFSWriter;
   Stream<Uri> observatoryUris;
-  vm_service.VmService vmService;
+  FlutterVmService vmService;
   DevFS devFS;
   ApplicationPackage package;
   List<String> fileSystemRoots;
@@ -234,7 +234,7 @@
       globals.printTrace('Connecting to service protocol: $observatoryUri');
       isWaitingForVm = true;
       bool existingDds = false;
-      vm_service.VmService service;
+      FlutterVmService service;
       if (!disableDds) {
         void handleError(Exception e, StackTrace st) {
           globals.printTrace('Fail to connect to service protocol: $observatoryUri: $e');
@@ -300,7 +300,7 @@
             if (!existingDds)
               device.dds.done.whenComplete(() => throw Exception('DDS shut down too early')),
           ]
-        ) as vm_service.VmService;
+        ) as FlutterVmService;
       } on Exception catch (exception) {
         globals.printTrace('Fail to connect to service protocol: $observatoryUri: $exception');
         if (!completer.isCompleted && !_isListeningForObservatoryUri) {
@@ -366,12 +366,12 @@
           stackTrace: stackTrace,
          );
       })
-      .timeout(timeoutDelay, onTimeout: () {
+      .timeout(timeoutDelay, onTimeout: () async {
         // TODO(jonahwilliams): this only seems to fail on CI in the
         // flutter_attach_android_test. This log should help verify this
         // is where the tool is getting stuck.
         globals.logger.printTrace('error: vm service shutdown failed');
-        return device.stopApp(package, userIdentifier: userIdentifier);
+        await device.stopApp(package, userIdentifier: userIdentifier);
       });
   }
 
@@ -1324,7 +1324,7 @@
   }
 
   Future<void> _callConnectedVmServiceExtension(FlutterDevice device) async {
-    if (device.vmService.httpAddress != null || device.vmService.wsAddress != null) {
+    if (device.vmService?.httpAddress != null || device.vmService?.wsAddress != null) {
       final Uri uri = device.vmService.httpAddress ?? device.vmService.wsAddress;
       await waitForExtension(device.vmService, 'ext.flutter.connectedVmServiceUri');
       try {
@@ -1455,7 +1455,7 @@
 }
 
 @visibleForTesting
-Future<void> waitForExtension(vm_service.VmService vmService, String extension) async {
+Future<void> waitForExtension(FlutterVmService vmService, String extension) async {
   final Completer<void> completer = Completer<void>();
   try {
     await vmService.streamListen(vm_service.EventStreams.kExtension);
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index 5bc1af0..36461d8 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -832,7 +832,7 @@
     await _evictDirtyAssets();
 
     // Check if any isolates are paused and reassemble those that aren't.
-    final Map<FlutterView, vm_service.VmService> reassembleViews = <FlutterView, vm_service.VmService>{};
+    final Map<FlutterView, FlutterVmService> reassembleViews = <FlutterView, FlutterVmService>{};
     final List<Future<void>> reassembleFutures = <Future<void>>[];
     String serviceEventKind;
     int pausedIsolatesFound = 0;
diff --git a/packages/flutter_tools/lib/src/test/coverage_collector.dart b/packages/flutter_tools/lib/src/test/coverage_collector.dart
index c8beed6..1bd1612 100644
--- a/packages/flutter_tools/lib/src/test/coverage_collector.dart
+++ b/packages/flutter_tools/lib/src/test/coverage_collector.dart
@@ -192,7 +192,7 @@
   Future<void> handleTestTimedOut(ProcessEvent event) async { }
 }
 
-Future<vm_service.VmService> _defaultConnect(Uri serviceUri) {
+Future<FlutterVmService> _defaultConnect(Uri serviceUri) {
   return connectToVmService(
       serviceUri, compression: CompressionOptions.compressionOff);
 }
@@ -200,16 +200,16 @@
 Future<Map<String, dynamic>> collect(Uri serviceUri, bool Function(String) libraryPredicate, {
   bool waitPaused = false,
   String debugName,
-  Future<vm_service.VmService> Function(Uri) connector = _defaultConnect,
+  Future<FlutterVmService> Function(Uri) connector = _defaultConnect,
 }) async {
-  final vm_service.VmService vmService = await connector(serviceUri);
+  final FlutterVmService vmService = await connector(serviceUri);
   final Map<String, dynamic> result = await _getAllCoverage(
       vmService, libraryPredicate);
   vmService.dispose();
   return result;
 }
 
-Future<Map<String, dynamic>> _getAllCoverage(vm_service.VmService service, bool Function(String) libraryPredicate) async {
+Future<Map<String, dynamic>> _getAllCoverage(FlutterVmService service, bool Function(String) libraryPredicate) async {
   final vm_service.VM vm = await service.getVM();
   final List<Map<String, dynamic>> coverage = <Map<String, dynamic>>[];
   for (final vm_service.IsolateRef isolateRef in vm.isolates) {
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index be3b216..a972620 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -10,7 +10,6 @@
 import 'package:package_config/package_config.dart';
 import 'package:stream_channel/stream_channel.dart';
 import 'package:test_core/src/platform.dart'; // ignore: implementation_imports
-import 'package:vm_service/vm_service.dart' as vm_service;
 
 import '../base/common.dart';
 import '../base/file_system.dart';
@@ -501,9 +500,9 @@
           }
           {
             globals.printTrace('Connecting to service protocol: $processObservatoryUri');
-            final Future<vm_service.VmService> localVmService = connectToVmService(processObservatoryUri,
+            final Future<FlutterVmService> localVmService = connectToVmService(processObservatoryUri,
               compileExpression: _compileExpressionService);
-            unawaited(localVmService.then((vm_service.VmService vmservice) {
+            unawaited(localVmService.then((FlutterVmService vmservice) {
               globals.printTrace('Successfully connected to service protocol: $processObservatoryUri');
             }));
           }
diff --git a/packages/flutter_tools/lib/src/tracing.dart b/packages/flutter_tools/lib/src/tracing.dart
index 9c6a64a..dcd661e 100644
--- a/packages/flutter_tools/lib/src/tracing.dart
+++ b/packages/flutter_tools/lib/src/tracing.dart
@@ -28,7 +28,7 @@
 
   static const String firstUsefulFrameEventName = kFirstFrameRasterizedEventName;
 
-  final vm_service.VmService vmService;
+  final FlutterVmService vmService;
   final Logger _logger;
 
   Future<void> startTracing() async {
@@ -91,7 +91,7 @@
 
 /// Download the startup trace information from the given observatory client and
 /// store it to build/start_up_info.json.
-Future<void> downloadStartupTrace(vm_service.VmService vmService, {
+Future<void> downloadStartupTrace(FlutterVmService vmService, {
   bool awaitFirstFrame = true,
   @required Logger logger,
   @required Directory output,
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index 9e45e55..1050a0a 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -144,7 +144,7 @@
 
 /// Override `VMServiceConnector` in [context] to return a different VMService
 /// from [VMService.connect] (used by tests).
-typedef VMServiceConnector = Future<vm_service.VmService> Function(Uri httpUri, {
+typedef VMServiceConnector = Future<FlutterVmService> Function(Uri httpUri, {
   ReloadSources reloadSources,
   Restart restart,
   CompileExpression compileExpression,
@@ -154,33 +154,30 @@
   Device device,
 });
 
-final Expando<Uri> _httpAddressExpando = Expando<Uri>();
 
-final Expando<Uri> _wsAddressExpando = Expando<Uri>();
-
-void setHttpAddress(Uri uri, vm_service.VmService vmService) {
+void setHttpAddress(Uri uri, FlutterVmService vmService) {
   if(vmService == null) {
     return;
   }
-  _httpAddressExpando[vmService] = uri;
+  vmService._httpAddress = uri;
 }
 
-void setWsAddress(Uri uri, vm_service.VmService vmService) {
+void setWsAddress(Uri uri, FlutterVmService vmService) {
   if(vmService == null) {
     return;
   }
-  _wsAddressExpando[vmService] = uri;
+  vmService._wsAddress = uri;
 }
 
 /// A connection to the Dart VM Service.
-vm_service.VmService setUpVmService(
+FlutterVmService setUpVmService(
   ReloadSources reloadSources,
   Restart restart,
   CompileExpression compileExpression,
   Device device,
   GetSkSLMethod skSLMethod,
   PrintStructuredErrorLogMethod printStructuredErrorLogMethod,
-  vm_service.VmService vmService
+  FlutterVmService vmService
 ) {
   if (reloadSources != null) {
     vmService.registerServiceCallback('reloadSources', (Map<String, dynamic> params) async {
@@ -290,7 +287,7 @@
 /// protocol itself.
 ///
 /// See: https://github.com/dart-lang/sdk/commit/df8bf384eb815cf38450cb50a0f4b62230fba217
-Future<vm_service.VmService> connectToVmService(
+Future<FlutterVmService> connectToVmService(
   Uri httpUri, {
     ReloadSources reloadSources,
     Restart restart,
@@ -312,7 +309,7 @@
   );
 }
 
-Future<vm_service.VmService> _connect(
+Future<FlutterVmService> _connect(
   Uri httpUri, {
   ReloadSources reloadSources,
   Restart restart,
@@ -324,7 +321,7 @@
 }) async {
   final Uri wsUri = httpUri.replace(scheme: 'ws', path: globals.fs.path.join(httpUri.path, 'ws'));
   final io.WebSocket channel = await _openChannel(wsUri.toString(), compression: compression);
-  final vm_service.VmService delegateService = vm_service.VmService(
+  final FlutterVmService delegateService = FlutterVmService(
     channel,
     channel.add,
     log: null,
@@ -333,7 +330,7 @@
     },
   );
 
-  final vm_service.VmService service = setUpVmService(
+  final FlutterVmService service = setUpVmService(
     reloadSources,
     restart,
     compileExpression,
@@ -342,8 +339,8 @@
     printStructuredErrorLogMethod,
     delegateService,
   );
-  _httpAddressExpando[service] = httpUri;
-  _wsAddressExpando[service] = wsUri;
+  service._httpAddress = httpUri;
+  service._wsAddress = wsUri;
 
   // This call is to ensure we are able to establish a connection instead of
   // keeping on trucking and failing farther down the process.
@@ -412,10 +409,454 @@
 }
 
 /// Flutter specific VM Service functionality.
-extension FlutterVmService on vm_service.VmService {
-  Uri get wsAddress => this != null ? _wsAddressExpando[this] : null;
+class FlutterVmService implements vm_service.VmService {
 
-  Uri get httpAddress => this != null ? _httpAddressExpando[this] : null;
+  FlutterVmService(
+    Stream<dynamic> /*String|List<int>*/ inStream,
+    void writeMessage(String message), {
+    vm_service.Log log,
+    vm_service.DisposeHandler disposeHandler,
+    Future<void> streamClosed,
+  }) : _delegate = vm_service.VmService(
+    inStream,
+    writeMessage,
+    log: log,
+    disposeHandler: disposeHandler,
+    streamClosed: streamClosed,
+  );
+
+  FlutterVmService.fromVmService(vm_service.VmService delegate) :
+    _delegate = delegate;
+
+  final vm_service.VmService _delegate;
+
+  Uri _wsAddress;
+  Uri _httpAddress;
+
+  Uri get wsAddress => _wsAddress;
+
+  Uri get httpAddress => _httpAddress;
+
+  @override
+  Stream<vm_service.Event> onEvent(String streamId) => _delegate.onEvent(streamId);
+
+  @override
+  Stream<vm_service.Event> get onVMEvent => _delegate.onVMEvent;
+
+  @override
+  Stream<vm_service.Event> get onIsolateEvent => _delegate.onIsolateEvent;
+
+  @override
+  Stream<vm_service.Event> get onDebugEvent => _delegate.onDebugEvent;
+
+  @override
+  Stream<vm_service.Event> get onGCEvent => _delegate.onGCEvent;
+
+  @override
+  Stream<vm_service.Event> get onExtensionEvent => _delegate.onExtensionEvent;
+
+  @override
+  Stream<vm_service.Event> get onTimelineEvent => _delegate.onTimelineEvent;
+
+  @override
+  Stream<vm_service.Event> get onLoggingEvent => _delegate.onLoggingEvent;
+
+  @override
+  Stream<vm_service.Event> get onServiceEvent => _delegate.onServiceEvent;
+
+  @override
+  Stream<vm_service.Event> get onHeapSnapshotEvent => _delegate.onHeapSnapshotEvent;
+
+  @override
+  Stream<vm_service.Event> get onStdoutEvent => _delegate.onStdoutEvent;
+
+  @override
+  Stream<vm_service.Event> get onStderrEvent => _delegate.onStderrEvent;
+
+  @override
+  Future<vm_service.Breakpoint> addBreakpoint(
+    String isolateId,
+    String scriptId,
+    int line, {
+    int column,
+  }) => _delegate.addBreakpoint(isolateId, scriptId, line, column: column);
+
+  @override
+  Future<vm_service.Breakpoint> addBreakpointWithScriptUri(
+    String isolateId,
+    String scriptUri,
+    int line, {
+    int column,
+  }) => _delegate.addBreakpointWithScriptUri(
+    isolateId,
+    scriptUri,
+    line,
+    column: column,
+  );
+
+  @override
+  Future<vm_service.Breakpoint> addBreakpointAtEntry(
+    String isolateId,
+    String functionId,
+  ) => _delegate.addBreakpointAtEntry(isolateId, functionId);
+
+  @override
+  Future<vm_service.Success> clearCpuSamples(String isolateId) =>
+    _delegate.clearCpuSamples(isolateId);
+
+  @override
+  Future<vm_service.Success> clearVMTimeline() => _delegate.clearVMTimeline();
+
+  @override
+  Future<vm_service.Response> invoke(
+    String isolateId,
+    String targetId,
+    String selector,
+    List<String> argumentIds, {
+    bool disableBreakpoints,
+  }) => _delegate.invoke(
+    isolateId,
+    targetId,
+    selector,
+    argumentIds,
+    disableBreakpoints: disableBreakpoints,
+  );
+
+  @override
+  Future<vm_service.Response> evaluate(
+    String isolateId,
+    String targetId,
+    String expression, {
+    Map<String, String> scope,
+    bool disableBreakpoints,
+  }) => _delegate.evaluate(
+    isolateId,
+    targetId,
+    expression,
+    scope: scope,
+    disableBreakpoints: disableBreakpoints,
+  );
+
+  @override
+  Future<vm_service.Response> evaluateInFrame(
+    String isolateId,
+    int frameIndex,
+    String expression, {
+    Map<String, String> scope,
+    bool disableBreakpoints,
+  }) => _delegate.evaluateInFrame(
+    isolateId,
+    frameIndex,
+    expression,
+    scope: scope,
+    disableBreakpoints: disableBreakpoints,
+  );
+
+  @override
+  Future<vm_service.AllocationProfile> getAllocationProfile(
+    String isolateId, {
+    bool reset,
+    bool gc,
+  }) => _delegate.getAllocationProfile(
+    isolateId,
+    reset: reset,
+    gc: gc,
+  );
+
+  @override
+  Future<vm_service.ClassList> getClassList(String isolateId) =>
+    _delegate.getClassList(
+      isolateId,
+    );
+
+  @override
+  Future<vm_service.CpuSamples> getCpuSamples(
+    String isolateId,
+    int timeOriginMicros,
+    int timeExtentMicros,
+  ) => _delegate.getCpuSamples(
+    isolateId,
+    timeOriginMicros,
+    timeExtentMicros,
+  );
+
+  @override
+  Future<vm_service.FlagList> getFlagList() => _delegate.getFlagList();
+
+  @override
+  Future<vm_service.InboundReferences> getInboundReferences(
+    String isolateId,
+    String targetId,
+    int limit,
+  ) => _delegate.getInboundReferences(
+    isolateId,
+    targetId,
+    limit,
+  );
+
+
+  @override
+  Future<vm_service.InstanceSet> getInstances(
+    String isolateId,
+    String objectId,
+    int limit,
+  ) => _delegate.getInstances(
+    isolateId,
+    objectId,
+    limit,
+  );
+
+  @override
+  Future<vm_service.Isolate> getIsolate(
+    String isolateId,
+  ) => _delegate.getIsolate(
+    isolateId,
+  );
+
+  @override
+  Future<vm_service.IsolateGroup> getIsolateGroup(
+    String isolateGroupId,
+  ) => _delegate.getIsolateGroup(
+    isolateGroupId,
+  );
+
+  @override
+  Future<vm_service.MemoryUsage> getMemoryUsage(
+    String isolateId,
+  ) => _delegate.getMemoryUsage(
+    isolateId,
+  );
+
+  @override
+  Future<vm_service.MemoryUsage> getIsolateGroupMemoryUsage(
+    String isolateGroupId,
+  ) => _delegate.getIsolateGroupMemoryUsage(
+    isolateGroupId,
+  );
+
+  @override
+  Future<vm_service.ScriptList> getScripts(
+    String isolateId,
+  ) => _delegate.getScripts(isolateId);
+
+  @override
+  Future<vm_service.Obj> getObject(
+    String isolateId,
+    String objectId, {
+    int offset,
+    int count,
+  }) => _delegate.getObject(
+    isolateId,
+    objectId,
+    offset: offset,
+    count: count,
+  );
+
+  @override
+  Future<vm_service.PortList> getPorts(
+    String isolateId,
+  ) => _delegate.getPorts(
+    isolateId,
+  );
+
+  @override
+  Future<vm_service.RetainingPath> getRetainingPath(
+    String isolateId,
+    String targetId,
+    int limit,
+  ) => _delegate.getRetainingPath(
+    isolateId,
+    targetId,
+    limit,
+  );
+
+  @override
+  Future<vm_service.ProcessMemoryUsage> getProcessMemoryUsage() =>
+    _delegate.getProcessMemoryUsage();
+
+  @override
+  Future<vm_service.Stack> getStack(
+    String isolateId, {
+    int limit,
+  }) => _delegate.getStack(
+    isolateId,
+    limit: limit,
+  );
+
+  @override
+  Future<vm_service.ProtocolList> getSupportedProtocols() =>
+    _delegate.getSupportedProtocols();
+
+  @override
+  Future<vm_service.SourceReport> getSourceReport(
+    String isolateId,
+    /*List<SourceReportKind>*/
+    List<String> reports, {
+    String scriptId,
+    int tokenPos,
+    int endTokenPos,
+    bool forceCompile,
+  }) => _delegate.getSourceReport(
+    isolateId,
+    reports,
+    scriptId: scriptId,
+    tokenPos: tokenPos,
+    endTokenPos: endTokenPos,
+    forceCompile: forceCompile,
+  );
+
+  @override
+  Future<vm_service.Version> getVersion() => _delegate.getVersion();
+
+  @override
+  Future<vm_service.VM> getVM() => _delegate.getVM();
+
+  @override
+  Future<vm_service.Timeline> getVMTimeline({
+    int timeOriginMicros,
+    int timeExtentMicros,
+  }) => _delegate.getVMTimeline(
+    timeOriginMicros: timeOriginMicros,
+    timeExtentMicros: timeExtentMicros,
+  );
+
+  @override
+  Future<vm_service.TimelineFlags> getVMTimelineFlags() => _delegate.getVMTimelineFlags();
+
+  @override
+  Future<vm_service.Timestamp> getVMTimelineMicros() => _delegate.getVMTimelineMicros();
+
+  @override
+  Future<vm_service.Success> pause(String isolateId) => _delegate.pause(isolateId);
+
+  @override
+  Future<vm_service.Success> kill(String isolateId) => _delegate.kill(isolateId);
+
+  @override
+  Future<vm_service.Success> registerService(String service, String alias) =>
+    _delegate.registerService(service, alias);
+
+  @override
+  Future<vm_service.ReloadReport> reloadSources(
+    String isolateId, {
+    bool force,
+    bool pause,
+    String rootLibUri,
+    String packagesUri,
+  }) => _delegate.reloadSources(
+    isolateId,
+    force: force,
+    pause: pause,
+    rootLibUri: rootLibUri,
+    packagesUri: packagesUri,
+  );
+
+  @override
+  Future<vm_service.Success> removeBreakpoint(String isolateId, String breakpointId) =>
+    _delegate.removeBreakpoint(isolateId, breakpointId);
+
+  @override
+  Future<vm_service.Success> requestHeapSnapshot(String isolateId) =>
+    _delegate.requestHeapSnapshot(isolateId);
+
+  @override
+  Future<vm_service.Success> resume(
+    String isolateId, {
+    /*StepOption*/ String step,
+    int frameIndex,
+  }) => _delegate.resume(
+    isolateId,
+    step: step,
+    frameIndex: frameIndex,
+  );
+
+  @override
+  Future<vm_service.Success> setExceptionPauseMode(
+    String isolateId,
+    /*ExceptionPauseMode*/ String mode,
+  ) => _delegate.setExceptionPauseMode(
+    isolateId,
+    mode,
+  );
+
+  @override
+  Future<vm_service.Response> setFlag(String name, String value) =>
+    _delegate.setFlag(name, value);
+
+  @override
+  Future<vm_service.Success> setLibraryDebuggable(
+    String isolateId,
+    String libraryId,
+    bool isDebuggable,
+  ) => _delegate.setLibraryDebuggable(
+    isolateId,
+    libraryId,
+    isDebuggable,
+  );
+
+  @override
+  Future<vm_service.Success> setName(String isolateId, String name) =>
+    _delegate.setName(isolateId, name);
+
+  @override
+  Future<vm_service.Success> setVMName(String name) => _delegate.setVMName(name);
+
+  @override
+  Future<vm_service.Success> setVMTimelineFlags(List<String> recordedStreams) =>
+    _delegate.setVMTimelineFlags(recordedStreams);
+
+  @override
+  Future<vm_service.Success> streamCancel(String streamId) =>
+    _delegate.streamCancel(streamId);
+
+  @override
+  Future<vm_service.Success> streamListen(String streamId) =>
+    _delegate.streamListen(streamId);
+
+  @override
+  Future<vm_service.Response> callMethod(
+    String method, {
+    String isolateId,
+    Map<dynamic, dynamic> args,
+  }) => _delegate.callMethod(
+    method,
+    isolateId: isolateId,
+    args: args,
+  );
+
+  /// Invoke a specific service protocol extension method.
+  ///
+  /// See https://api.dart.dev/stable/dart-developer/dart-developer-library.html.
+  @override
+  Future<vm_service.Response> callServiceExtension(
+    String method, {
+    String isolateId,
+    Map<dynamic, dynamic> args,
+  }) => _delegate.callServiceExtension(
+    method,
+    isolateId: isolateId,
+    args: args,
+  );
+
+  @override
+  Stream<String> get onSend => _delegate.onSend;
+
+  @override
+  Stream<String> get onReceive => _delegate.onReceive;
+
+  @override
+  void dispose() => _delegate.dispose();
+
+  @override
+  Future<void> get onDone => _delegate.onDone;
+
+  @override
+  void registerServiceCallback(String service, vm_service.ServiceCallback cb) =>
+    _delegate.registerServiceCallback(service, cb);
+
+
+  // Flutter specific methods follow.
+
 
   Future<vm_service.Response> callMethodWrapper(
     String method, {
diff --git a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart
index 24265fb..e15cda7 100644
--- a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart
+++ b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart
@@ -362,7 +362,7 @@
 FlutterDriverService setUpDriverService({
   Logger logger,
   ProcessManager processManager,
-  vm_service.VmService vmService,
+  FlutterVmService vmService,
 }) {
   logger ??= BufferLogger.test();
   return FlutterDriverService(
diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart
index f866c85..cb7c7d6 100644
--- a/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart
@@ -12,6 +12,7 @@
 import 'package:flutter_tools/src/ios/devices.dart';
 import 'package:flutter_tools/src/ios/ios_deploy.dart';
 import 'package:flutter_tools/src/ios/mac.dart';
+import 'package:flutter_tools/src/vmservice.dart';
 import 'package:mockito/mockito.dart';
 import 'package:vm_service/vm_service.dart';
 
@@ -325,5 +326,5 @@
   });
 }
 
-class MockVmService extends Mock implements VmService {}
+class MockVmService extends Mock implements FlutterVmService {}
 class MockIOSDeployDebugger extends Mock implements IOSDeployDebugger {}
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 85fb96c..8ff03fb 100644
--- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -3126,7 +3126,7 @@
 
 class MockFlutterDevice extends Mock implements FlutterDevice {}
 class MockDartDevelopmentService extends Mock implements DartDevelopmentService {}
-class MockVMService extends Mock implements vm_service.VmService {}
+class MockVMService extends Mock implements FlutterVmService {}
 class MockDevFS extends Mock implements DevFS {}
 class MockDevice extends Mock implements Device {}
 class MockDeviceLogReader extends Mock implements DeviceLogReader {}
diff --git a/packages/flutter_tools/test/general.shard/vmservice_test.dart b/packages/flutter_tools/test/general.shard/vmservice_test.dart
index 2edce09..70de59e 100644
--- a/packages/flutter_tools/test/general.shard/vmservice_test.dart
+++ b/packages/flutter_tools/test/general.shard/vmservice_test.dart
@@ -218,7 +218,7 @@
 
   testWithoutContext('setAssetDirectory forwards arguments correctly', () async {
     final Completer<String> completer = Completer<String>();
-    final vm_service.VmService  vmService = vm_service.VmService(
+    final FlutterVmService  vmService = FlutterVmService(
       const Stream<String>.empty(),
       completer.complete,
     );
@@ -243,7 +243,7 @@
 
   testWithoutContext('getSkSLs forwards arguments correctly', () async {
     final Completer<String> completer = Completer<String>();
-    final vm_service.VmService  vmService = vm_service.VmService(
+    final FlutterVmService  vmService = FlutterVmService(
       const Stream<String>.empty(),
       completer.complete,
     );
@@ -264,7 +264,7 @@
 
   testWithoutContext('flushUIThreadTasks forwards arguments correctly', () async {
     final Completer<String> completer = Completer<String>();
-    final vm_service.VmService  vmService = vm_service.VmService(
+    final FlutterVmService  vmService = FlutterVmService(
       const Stream<String>.empty(),
       completer.complete,
     );
@@ -447,13 +447,6 @@
     expect(fakeVmServiceHost.hasRemainingExpectations, false);
   });
 
-  testWithoutContext('expandos are null safe', () {
-    vm_service.VmService vmService;
-
-    expect(vmService.httpAddress, null);
-    expect(vmService.wsAddress, null);
-  });
-
   testWithoutContext('Can process log events from the vm service', () {
     final vm_service.Event event = vm_service.Event(
       bytes: base64.encode(utf8.encode('Hello There\n')),
@@ -466,7 +459,7 @@
 }
 
 class MockDevice extends Mock implements Device {}
-class MockVMService extends Mock implements vm_service.VmService {}
+class MockVMService extends Mock implements FlutterVmService {}
 class MockFlutterVersion extends Mock implements FlutterVersion {
   @override
   Map<String, Object> toJson() => const <String, Object>{'Mock': 'Version'};
diff --git a/packages/flutter_tools/test/src/common.dart b/packages/flutter_tools/test/src/common.dart
index 53a8419..f36b4b7 100644
--- a/packages/flutter_tools/test/src/common.dart
+++ b/packages/flutter_tools/test/src/common.dart
@@ -23,6 +23,7 @@
 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:flutter_tools/src/vmservice.dart';
 import 'package:meta/meta.dart';
 import 'package:fake_async/fake_async.dart';
 import 'package:test_api/test_api.dart' as test_package show TypeMatcher, test; // ignore: deprecated_member_use
@@ -285,7 +286,7 @@
   FakeVmServiceHost({
     @required List<VmServiceExpectation> requests,
   }) : _requests = requests {
-    _vmService = vm_service.VmService(
+    _vmService = FlutterVmService(
       _input.stream,
       _output.add,
     );
@@ -328,8 +329,8 @@
   final StreamController<String> _input = StreamController<String>();
   final StreamController<String> _output = StreamController<String>();
 
-  vm_service.VmService get vmService => _vmService;
-  vm_service.VmService _vmService;
+  FlutterVmService get vmService => _vmService;
+  FlutterVmService _vmService;
 
   bool get hasRemainingExpectations => _requests.isNotEmpty;