[ VM Service ] Remove dynamic callsites from VM service

Fixes https://github.com/dart-lang/sdk/issues/48405

TEST=N/A

Change-Id: I975d713d27fac6221e3a06dce0cddaf1f5019b7d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239583
Reviewed-by: Devon Carew <devoncarew@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index 370e042..16be023 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -14,13 +14,7 @@
     ;
 [@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:4] [@vm.unboxing-info.metadata=(b)->d]  operator []([@vm.inferred-type.metadata=!] core::int i) → core::double
     return [@vm.direct-call.metadata=dart.typed_data::_Float64List.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double>}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int}){(core::num) → core::int}){(core::int) → core::double};
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
-    block {
-      [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double>};
-      [@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int};
-    } =>throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
-  }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6] [@vm.unboxing-info.metadata=(b)->d]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5] [@vm.unboxing-info.metadata=(b)->d]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
     core::double result = 0.0;
     for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector._length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}{core::int}){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int})
       result = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double.*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i){(core::int) → core::double}.{core::double::*}([@vm.direct-call.metadata=#lib::_Vector.[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i){(core::int) → core::double}){(core::num) → core::double}){(core::num) → core::double};
diff --git a/sdk/lib/_internal/vm/bin/vmservice_io.dart b/sdk/lib/_internal/vm/bin/vmservice_io.dart
index 033a9cf..f70166e 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_io.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_io.dart
@@ -108,7 +108,7 @@
       mode: ProcessStartMode.detachedWithStdio,
     );
     final completer = Completer<void>();
-    late StreamSubscription stderrSub;
+    late StreamSubscription<String> stderrSub;
     stderrSub = _process!.stderr.transform(utf8.decoder).listen((event) {
       final result = json.decode(event) as Map<String, dynamic>;
       final state = result['state'];
@@ -145,7 +145,7 @@
   Process? _process;
 }
 
-Future cleanupCallback() async {
+Future<void> cleanupCallback() async {
   // Cancel the sigquit subscription.
   if (_signalSubscription != null) {
     await _signalSubscription.cancel();
@@ -191,7 +191,7 @@
   return fsUri;
 }
 
-Future deleteDirCallback(Uri path) async =>
+Future<void> deleteDirCallback(Uri path) async =>
     await Directory.fromUri(path).delete(recursive: true);
 
 class PendingWrite {
@@ -200,7 +200,7 @@
   final Uri uri;
   final List<int> bytes;
 
-  Future write() async {
+  Future<void> write() async {
     final file = File.fromUri(uri);
     final parent_directory = file.parent;
     await parent_directory.create(recursive: true);
@@ -221,7 +221,7 @@
   static const kMaxOpenWrites = 16;
   static int openWrites = 0;
 
-  static Future scheduleWrite(Uri path, List<int> bytes) async {
+  static Future<void> scheduleWrite(Uri path, List<int> bytes) async {
     // Create a new pending write.
     final pw = PendingWrite(path, bytes);
     pendingWrites.add(pw);
@@ -229,7 +229,7 @@
     return pw.completer.future;
   }
 
-  static _maybeWriteFiles() {
+  static void _maybeWriteFiles() {
     while (openWrites < kMaxOpenWrites) {
       if (pendingWrites.length > 0) {
         final pw = pendingWrites.removeLast();
@@ -241,14 +241,14 @@
     }
   }
 
-  static _writeCompleted() {
+  static void _writeCompleted() {
     openWrites--;
     assert(openWrites >= 0);
     _maybeWriteFiles();
   }
 }
 
-Future writeFileCallback(Uri path, List<int> bytes) async =>
+Future<void> writeFileCallback(Uri path, List<int> bytes) async =>
     WriteLimiter.scheduleWrite(path, bytes);
 
 Future<void> writeStreamFileCallback(Uri path, Stream<List<int>> bytes) async {
@@ -336,7 +336,7 @@
 
 Timer? _registerSignalHandlerTimer;
 
-_registerSignalHandler() {
+void _registerSignalHandler() {
   if (VMService().isExiting) {
     // If the VM started shutting down we don't want to register this signal
     // handler, otherwise we'll cause the VM to hang after killing the service
diff --git a/sdk/lib/_internal/vm/bin/vmservice_server.dart b/sdk/lib/_internal/vm/bin/vmservice_server.dart
index 129e237..03ea982 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_server.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_server.dart
@@ -28,40 +28,33 @@
     socket.done.then((_) => close());
   }
 
-  Future<void> disconnect() async {
-    if (socket != null) {
-      await socket.close();
-    }
-  }
+  Future<void> disconnect() => socket.close();
 
   void onWebSocketMessage(message) {
     if (message is String) {
-      Map map;
+      dynamic jsonObj;
       try {
-        map = json.decode(message);
+        jsonObj = json.decode(message);
       } catch (e) {
         socket.close(parseErrorCode, 'Message parse error: $e');
         return;
       }
-      if (map is! Map) {
+      if (jsonObj is! Map<String, dynamic>) {
         socket.close(notMapErrorCode, 'Message must be a JSON map.');
         return;
       }
-      try {
-        final rpc = Message.fromJsonRpc(this, map);
-        switch (rpc.type) {
-          case MessageType.Request:
-            onRequest(rpc);
-            break;
-          case MessageType.Notification:
-            onNotification(rpc);
-            break;
-          case MessageType.Response:
-            onResponse(rpc);
-            break;
-        }
-      } on dynamic catch (e) {
-        socket.close(idErrorCode, e.message);
+      final Map<String, dynamic> map = jsonObj;
+      final rpc = Message.fromJsonRpc(this, map);
+      switch (rpc.type) {
+        case MessageType.Request:
+          onRequest(rpc);
+          break;
+        case MessageType.Notification:
+          onNotification(rpc);
+          break;
+        case MessageType.Response:
+          onResponse(rpc);
+          break;
       }
     } else {
       socket.close(binaryMessageErrorCode, 'Message must be a string.');
@@ -80,7 +73,7 @@
           socket.add(result.payload);
           break;
         case ResponsePayloadKind.Utf8String:
-          socket.addUtf8Text(result.payload);
+          socket.addUtf8Text(result.payload as List<int>);
           break;
       }
     } on StateError catch (_) {
@@ -272,7 +265,7 @@
         : '/${requestPathSegments.sublist(1).join('/')}';
   }
 
-  Future _requestHandler(HttpRequest request) async {
+  Future<void> _requestHandler(HttpRequest request) async {
     if (!_originCheck(request)) {
       // This is a cross origin attempt to connect
       request.response.statusCode = HttpStatus.forbidden;
@@ -283,10 +276,10 @@
     if (request.method == 'PUT') {
       // PUT requests are forwarded to DevFS for processing.
 
-      List fsNameList;
-      List? fsPathList;
-      List? fsPathBase64List;
-      List? fsUriBase64List;
+      List<String> fsNameList;
+      List<String>? fsPathList;
+      List<String>? fsPathBase64List;
+      List<String>? fsUriBase64List;
       Object? fsName;
       Object? fsPath;
       Uri? fsUri;
@@ -327,11 +320,8 @@
         return;
       }
 
-      if (result != null) {
-        request.response.headers.contentType =
-            HttpRequestClient.jsonContentType;
-        request.response.write(result);
-      }
+      request.response.headers.contentType = HttpRequestClient.jsonContentType;
+      request.response.write(result);
       request.response.close();
       return;
     }
@@ -398,12 +388,12 @@
     client.onRequest(message); // exception free, no need to try catch
   }
 
-  Future<void> _dumpServiceInfoToFile(String serviceInfoFilenameLocal) async {
+  Future<File> _dumpServiceInfoToFile(String serviceInfoFilenameLocal) async {
     final serviceInfo = <String, dynamic>{
       'uri': serverAddress.toString(),
     };
     final file = File.fromUri(Uri.parse(serviceInfoFilenameLocal));
-    return file.writeAsString(json.encode(serviceInfo)) as Future<void>;
+    return file.writeAsString(json.encode(serviceInfo));
   }
 
   Future<Server> startup() async {
diff --git a/sdk/lib/vmservice/asset.dart b/sdk/lib/vmservice/asset.dart
index b42df32..985c905 100644
--- a/sdk/lib/vmservice/asset.dart
+++ b/sdk/lib/vmservice/asset.dart
@@ -42,10 +42,10 @@
     if (tarBytes == null) {
       return null;
     }
-    List assetList = _decodeAssets(tarBytes);
-    Map<String, Asset> assets = new HashMap<String, Asset>();
+    final assetList = _decodeAssets(tarBytes);
+    final assets = <String, Asset>{};
     for (int i = 0; i < assetList.length; i += 2) {
-      final a = Asset(assetList[i], assetList[i + 1]);
+      final a = Asset(assetList[i] as String, assetList[i + 1] as Uint8List);
       assets[a.name] = a;
     }
     return assets;
@@ -55,7 +55,7 @@
 }
 
 @pragma("vm:external-name", "VMService_DecodeAssets")
-external List _decodeAssets(Uint8List data);
+external List<Object> _decodeAssets(Uint8List data);
 
 Map<String, Asset>? _assets;
 Map<String, Asset> get assets {
diff --git a/sdk/lib/vmservice/devfs.dart b/sdk/lib/vmservice/devfs.dart
index 3463d6c..2815b06 100644
--- a/sdk/lib/vmservice/devfs.dart
+++ b/sdk/lib/vmservice/devfs.dart
@@ -84,7 +84,7 @@
     if (deleteDir == null) {
       return;
     }
-    final deletions = <Future>[
+    final deletions = <Future<void>>[
       for (final fs in _fsMap.values) deleteDir(fs.uri),
     ];
     Future.wait(deletions);
@@ -350,7 +350,7 @@
             details: "${message.method}: invalid 'files' parameter "
                 "at index ${i}: ${fileInfo}");
       }
-      final uri = fs.resolvePath(fileInfo[0]);
+      final uri = fs.resolvePath(fileInfo[0] as String);
       if (uri == null) {
         return encodeRpcError(message, kInvalidParams,
             details: "${message.method}: invalid 'files' parameter "
@@ -358,9 +358,10 @@
       }
       uris.add(uri);
     }
-    final pendingWrites = <Future>[];
+    final pendingWrites = <Future<void>>[];
     for (int i = 0; i < uris.length; i++) {
-      final decodedFileContents = base64.decode(files[i][1]);
+      final file = files[i].cast<String>();
+      final decodedFileContents = base64.decode(file[1]);
       pendingWrites.add(writeFile(uris[i], decodedFileContents));
     }
     await Future.wait(pendingWrites);
@@ -386,7 +387,7 @@
     final fileList = await listFiles(fs.uri);
     // Remove any url-encoding in the filenames.
     for (int i = 0; i < fileList.length; i++) {
-      fileList[i]['name'] = Uri.decodeFull(fileList[i]['name']);
+      fileList[i]['name'] = Uri.decodeFull(fileList[i]['name'] as String);
     }
     final result = <String, dynamic>{'type': 'FSFileList', 'files': fileList};
     return encodeResult(message, result);
diff --git a/sdk/lib/vmservice/message.dart b/sdk/lib/vmservice/message.dart
index e1164e5..a0b1fbf 100644
--- a/sdk/lib/vmservice/message.dart
+++ b/sdk/lib/vmservice/message.dart
@@ -18,15 +18,15 @@
   final MessageType type;
 
   // Client-side identifier for this message.
-  final serial;
+  final Object? serial;
 
   final String? method;
 
   final params = <String, dynamic>{};
-  final result = {};
-  final error = {};
+  final result = <String, dynamic>{};
+  final error = <String, dynamic>{};
 
-  factory Message.fromJsonRpc(Client? client, Map map) {
+  factory Message.fromJsonRpc(Client? client, Map<String, dynamic> map) {
     if (map.containsKey('id')) {
       final id = map['id'];
       if (id != null && id is! num && id is! String) {
@@ -48,47 +48,47 @@
   }
 
   // http://www.jsonrpc.org/specification#request_object
-  Message._fromJsonRpcRequest(Client? client, Map map)
+  Message._fromJsonRpcRequest(Client? client, Map<String, dynamic> map)
       : client = client,
         type = MessageType.Request,
         serial = map['id'],
-        method = map['method'] {
+        method = (map['method'] as String?) {
     if (map['params'] != null) {
-      params.addAll(map['params']);
+      params.addAll(map['params'] as Map<String, dynamic>);
     }
   }
 
   // http://www.jsonrpc.org/specification#notification
-  Message._fromJsonRpcNotification(Client? client, Map map)
+  Message._fromJsonRpcNotification(Client? client, Map<String, dynamic> map)
       : client = client,
         type = MessageType.Notification,
-        method = map['method'],
+        method = (map['method'] as String?),
         serial = null {
     if (map['params'] != null) {
-      params.addAll(map['params']);
+      params.addAll(map['params'] as Map<String, dynamic>);
     }
   }
 
   // http://www.jsonrpc.org/specification#response_object
-  Message._fromJsonRpcResult(Client? client, Map map)
+  Message._fromJsonRpcResult(Client? client, Map<String, dynamic> map)
       : client = client,
         type = MessageType.Response,
         serial = map['id'],
         method = null {
-    result.addAll(map['result']);
+    result.addAll(map['result'] as Map<String, dynamic>);
   }
 
   // http://www.jsonrpc.org/specification#response_object
-  Message._fromJsonRpcError(Client? client, Map map)
+  Message._fromJsonRpcError(Client? client, Map<String, dynamic> map)
       : client = client,
         type = MessageType.Response,
         serial = map['id'],
         method = null {
-    error.addAll(map['error']);
+    error.addAll(map['error'] as Map<String, dynamic>);
   }
 
   static String _methodNameFromUri(Uri uri) {
-    if (uri == null || uri.pathSegments.length == 0) {
+    if (uri.pathSegments.length == 0) {
       return '';
     }
     return uri.pathSegments[0];
@@ -147,7 +147,7 @@
   // elements in the list are strings, making consumption by C++ simpler.
   // This has a side effect that boolean literal values like true become 'true'
   // and thus indistinguishable from the string literal 'true'.
-  List<String> _makeAllString(List list) {
+  List<String> _makeAllString(List<Object> list) {
     var new_list = List<String>.filled(list.length, "");
     for (var i = 0; i < list.length; i++) {
       new_list[i] = list[i].toString();
@@ -167,8 +167,9 @@
       _setResponseFromPort(value);
     };
     final keys = _makeAllString(params.keys.toList(growable: false));
-    final values = _makeAllString(params.values.toList(growable: false));
-    final request = List<dynamic>.filled(6, null)
+    final values =
+        _makeAllString(params.values.cast<Object>().toList(growable: false));
+    final request = List<Object?>.filled(6, null)
       ..[0] = 0 // Make room for OOB message type.
       ..[1] = receivePort.sendPort
       ..[2] = serial
@@ -212,7 +213,7 @@
       _setResponseFromPort(value);
     };
     var keys = params.keys.toList(growable: false);
-    var values = params.values.toList(growable: false);
+    var values = params.values.cast<Object>().toList(growable: false);
     if (!_methodNeedsObjectParameters(method!)) {
       keys = _makeAllString(keys);
       values = _makeAllString(values);
@@ -235,7 +236,7 @@
     return _completer.future;
   }
 
-  void _setResponseFromPort(dynamic response) {
+  void _setResponseFromPort(Object? response) {
     if (response == null) {
       // We should only have a null response for Notifications.
       assert(type == MessageType.Notification);
@@ -252,10 +253,10 @@
 }
 
 @pragma("vm:external-name", "VMService_SendIsolateServiceMessage")
-external bool sendIsolateServiceMessage(SendPort sp, List m);
+external bool sendIsolateServiceMessage(SendPort sp, List<Object?> m);
 
 @pragma("vm:external-name", "VMService_SendRootServiceMessage")
-external void sendRootServiceMessage(List m);
+external void sendRootServiceMessage(List<Object?> m);
 
 @pragma("vm:external-name", "VMService_SendObjectRootServiceMessage")
-external void sendObjectRootServiceMessage(List m);
+external void sendObjectRootServiceMessage(List<Object?> m);
diff --git a/sdk/lib/vmservice/message_router.dart b/sdk/lib/vmservice/message_router.dart
index 2ca8d4f..fb5adac 100644
--- a/sdk/lib/vmservice/message_router.dart
+++ b/sdk/lib/vmservice/message_router.dart
@@ -74,9 +74,9 @@
   dynamic decodeJson() {
     switch (kind) {
       case ResponsePayloadKind.String:
-        return json.decode(payload);
+        return json.decode(payload as String);
       case ResponsePayloadKind.Utf8String:
-        return json.fuse(utf8).decode(payload);
+        return json.fuse(utf8).decode(payload as List<int>);
       case ResponsePayloadKind.Binary:
         throw 'Binary responses can not be decoded';
     }
diff --git a/sdk/lib/vmservice/named_lookup.dart b/sdk/lib/vmservice/named_lookup.dart
index 0c0a5a8..8431ccf 100644
--- a/sdk/lib/vmservice/named_lookup.dart
+++ b/sdk/lib/vmservice/named_lookup.dart
@@ -48,7 +48,7 @@
 
   /// Returns a new Id (possibly recycled)
   String newId() {
-    var id;
+    String id;
     if (_free.isEmpty) {
       id = prologue + (_next++).toString();
     } else {
diff --git a/sdk/lib/vmservice/running_isolate.dart b/sdk/lib/vmservice/running_isolate.dart
index 3902193..de8bf87 100644
--- a/sdk/lib/vmservice/running_isolate.dart
+++ b/sdk/lib/vmservice/running_isolate.dart
@@ -14,7 +14,7 @@
 
   void onIsolateExit() {
     pendingMessagesReceivePorts.forEach((port) {
-      (port as RawReceivePort).close();
+      port.close();
     });
   }
 
diff --git a/sdk/lib/vmservice/running_isolates.dart b/sdk/lib/vmservice/running_isolates.dart
index e699cb3..09f2f55 100644
--- a/sdk/lib/vmservice/running_isolates.dart
+++ b/sdk/lib/vmservice/running_isolates.dart
@@ -27,7 +27,7 @@
 
   @override
   Future<Response> routeRequest(VMService service, Message message) {
-    String isolateParam = message.params['isolateId']!;
+    String isolateParam = message.params['isolateId']! as String;
     int isolateId;
     if (!isolateParam.startsWith('isolates/')) {
       message.setErrorResponse(
@@ -76,16 +76,20 @@
 
   Future<Response> run() async {
     final buildScopeResponse = await _buildScope();
-    final responseJson = buildScopeResponse.decodeJson();
+    final responseJson =
+        buildScopeResponse.decodeJson() as Map<String, dynamic>;
 
     if (responseJson.containsKey('error')) {
-      return Response.from(encodeCompilationError(
-          _message, responseJson['error']['data']['details']));
+      final error = responseJson['error'] as Map<String, dynamic>;
+      final data = error['data'] as Map<String, dynamic>;
+      return Response.from(
+          encodeCompilationError(_message, data['details'] as String));
     }
 
     String kernelBase64;
     try {
-      kernelBase64 = await _compileExpression(responseJson['result']);
+      kernelBase64 = await _compileExpression(
+          responseJson['result'] as Map<String, dynamic>);
     } catch (e) {
       return Response.from(encodeCompilationError(_message, e.toString()));
     }
@@ -105,7 +109,8 @@
       'params': params,
     };
     if (_message.params['scope'] != null) {
-      buildScopeParams['params']['scope'] = _message.params['scope'];
+      (buildScopeParams['params'] as Map<String, dynamic>)['scope'] =
+          _message.params['scope'];
     }
     final buildScope =
         Message._fromJsonRpcRequest(_message.client!, buildScopeParams);
@@ -157,11 +162,12 @@
       externalClient.post(Response.json(compileExpression
           .forwardToJson({'id': id, 'method': 'compileExpression'})));
       return completer.future.then((s) => jsonDecode(s)).then((json) {
-        final Map<String, dynamic> jsonMap = json;
+        final jsonMap = json as Map<String, dynamic>;
         if (jsonMap.containsKey('error')) {
-          throw jsonMap['error'];
+          throw jsonMap['error'] as Object;
         }
-        return jsonMap['result']['kernelBytes'];
+        return (jsonMap['result'] as Map<String, dynamic>)['kernelBytes']
+            as String;
       });
     } else {
       // fallback to compile using kernel service
@@ -177,10 +183,14 @@
           .routeRequest(_service, compileExpression)
           .then((response) => response.decodeJson())
           .then((json) {
-        if (json['result'] != null) {
-          return json['result']['kernelBytes'];
+        final response = json as Map<String, dynamic>;
+        if (response['result'] != null) {
+          return (response['result'] as Map<String, dynamic>)['kernelBytes']
+              as String;
         }
-        throw json['error']['data']['details'];
+        final error = response['error'] as Map<String, dynamic>;
+        final data = error['data'] as Map<String, dynamic>;
+        throw data['details'] as Object;
       });
     }
   }
@@ -197,7 +207,8 @@
         'params': params,
       };
       if (_message.params['scope'] != null) {
-        runParams['params']['scope'] = _message.params['scope'];
+        (runParams['params'] as Map<String, dynamic>)['scope'] =
+            _message.params['scope'];
       }
       final runExpression =
           Message._fromJsonRpcRequest(_message.client!, runParams);
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index ae16c86..eac4597 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -102,7 +102,7 @@
     },
   };
   if (details != null) {
-    response['error']['data'] = <String, String>{
+    (response['error'] as Map<String, dynamic>)['data'] = <String, String>{
       'details': details,
     };
   }
@@ -122,7 +122,8 @@
 String encodeCompilationError(Message message, String diagnostic) =>
     encodeRpcError(message, kExpressionCompilationError, details: diagnostic);
 
-String encodeResult(Message message, Map result) => json.encode({
+String encodeResult(Message message, Map<String, dynamic> result) =>
+    json.encode({
       'jsonrpc': '2.0',
       'id': message.serial,
       'result': result,
@@ -134,10 +135,10 @@
 const shortDelay = Duration(milliseconds: 10);
 
 /// Called when the server should be started.
-typedef Future ServerStartCallback();
+typedef Future<void> ServerStartCallback();
 
 /// Called when the server should be stopped.
-typedef Future ServerStopCallback();
+typedef Future<void> ServerStopCallback();
 
 /// Called when DDS has connected.
 typedef Future<void> DdsConnectedCallback();
@@ -146,19 +147,19 @@
 typedef Future<void> DdsDisconnectedCallback();
 
 /// Called when the service is exiting.
-typedef Future CleanupCallback();
+typedef Future<void> CleanupCallback();
 
 /// Called to create a temporary directory
 typedef Future<Uri> CreateTempDirCallback(String base);
 
 /// Called to delete a directory
-typedef Future DeleteDirCallback(Uri path);
+typedef Future<void> DeleteDirCallback(Uri path);
 
 /// Called to write a file.
-typedef Future WriteFileCallback(Uri path, List<int> bytes);
+typedef Future<void> WriteFileCallback(Uri path, List<int> bytes);
 
 /// Called to write a stream into a file.
-typedef Future WriteStreamFileCallback(Uri path, Stream<List<int>> bytes);
+typedef Future<void> WriteStreamFileCallback(Uri path, Stream<List<int>> bytes);
 
 /// Called to read a file.
 typedef Future<List<int>> ReadFileCallback(Uri path);
@@ -269,7 +270,7 @@
           details: 'A DDS instance is already connected at ${_ddsUri!}.');
     }
 
-    final uri = message.params['uri'];
+    final uri = message.params['uri'] as String?;
     if (uri == null) {
       return encodeMissingParamError(message, 'uri');
     }
@@ -340,13 +341,15 @@
 
   void _profilerEventMessageHandler(Client client, Response event) {
     final eventJson = event.decodeJson() as Map<String, dynamic>;
-    final eventData = eventJson['params']!['event']!;
+    final params = eventJson['params']! as Map<String, dynamic>;
+    final eventData = params['event']! as Map<String, dynamic>;
     if (eventData['kind']! != 'CpuSamples') {
       client.post(event);
       return;
     }
-    final cpuSamplesEvent = eventData['cpuSamples']!;
-    final updatedSamples = cpuSamplesEvent['samples']!
+    final cpuSamplesEvent = eventData['cpuSamples']! as Map<String, dynamic>;
+    final samples = cpuSamplesEvent['samples']!.cast<Map<String, dynamic>>();
+    final updatedSamples = samples
         .where(
           (s) => client.profilerUserTagFilters.contains(s['userTag']),
         )
@@ -407,13 +410,14 @@
     }
   }
 
-  Future<void> _handleNativeRpcCall(message, SendPort replyPort) async {
+  Future<void> _handleNativeRpcCall(
+      List<int> message, SendPort replyPort) async {
     // Keep in sync with 'runtime/vm/service_isolate.cc:InvokeServiceRpc'.
     Response response;
 
     try {
       final rpc = Message.fromJsonRpc(
-          null, json.decode(utf8.decode(message as List<int>)));
+          null, json.decode(utf8.decode(message)) as Map<String, dynamic>);
       if (rpc.type != MessageType.Request) {
         response = Response.internalError(
             'The client sent a non-request json-rpc message.');
@@ -427,7 +431,7 @@
     late List<int> bytes;
     switch (response.kind) {
       case ResponsePayloadKind.String:
-        bytes = utf8.encode(response.payload);
+        bytes = utf8.encode(response.payload as String);
         bytes = bytes is Uint8List ? bytes : Uint8List.fromList(bytes);
         break;
       case ResponsePayloadKind.Binary:
@@ -448,7 +452,7 @@
     devfs.cleanup();
   }
 
-  Future _exit() async {
+  Future<void> _exit() async {
     isExiting = true;
 
     final serverStop = VMServiceEmbedderHooks.serverStop;
@@ -474,7 +478,8 @@
     if (message is List) {
       if (message.length == 2) {
         // This is an event.
-        _eventMessageHandler(message[0], Response.from(message[1]));
+        _eventMessageHandler(
+            message[0] as String, Response.from(message[1] as Object));
         return;
       }
       if (message.length == 1) {
@@ -485,20 +490,25 @@
       }
       final opcode = message[0];
       if (message.length == 3 && opcode == Constants.METHOD_CALL_FROM_NATIVE) {
-        _handleNativeRpcCall(message[1], message[2]);
+        _handleNativeRpcCall(message[1] as List<int>, message[2] as SendPort);
         return;
       }
       if (message.length == 4) {
         if ((opcode == Constants.WEB_SERVER_CONTROL_MESSAGE_ID) ||
             (opcode == Constants.SERVER_INFO_MESSAGE_ID)) {
           // This is a message interacting with the web server.
-          _serverMessageHandler(message[0], message[1], message[2], message[3]);
+          _serverMessageHandler(
+            message[0] as int,
+            message[1] as SendPort,
+            message[2] as bool,
+            message[3] as bool?,
+          );
           return;
         } else {
           // This is a message informing us of the birth or death of an
           // isolate.
-          _controlMessageHandler(
-              message[0], message[1], message[2], message[3]);
+          _controlMessageHandler(message[0] as int, message[1] as int,
+              message[2] as SendPort, message[3] as String);
           return;
         }
       }
@@ -543,7 +553,7 @@
 
   Future<String> _streamListen(Message message) async {
     final client = message.client!;
-    final streamId = message.params['streamId']!;
+    final streamId = message.params['streamId']! as String;
 
     if (client.streams.contains(streamId)) {
       return encodeRpcError(message, kStreamAlreadySubscribed);
@@ -576,7 +586,7 @@
 
   Future<String> _streamCancel(Message message) async {
     final client = message.client!;
-    final streamId = message.params['streamId']!;
+    final streamId = message.params['streamId']! as String;
 
     if (!client.streams.contains(streamId)) {
       return encodeRpcError(message, kStreamNotSubscribed);
@@ -676,11 +686,12 @@
   }
 
   Future<String> _getSupportedProtocols(Message message) async {
-    final version = json.decode(
+    final payload = json.decode(
       utf8.decode(
-        (await Message.forMethod('getVersion').sendToVM()).payload,
+        (await Message.forMethod('getVersion').sendToVM()).payload as List<int>,
       ),
-    )['result'];
+    ) as Map<String, dynamic>;
+    final version = payload['result'] as Map<String, dynamic>;
     final protocols = {
       'type': 'ProtocolList',
       'protocols': [
@@ -722,7 +733,8 @@
 
     // TODO(bkonyi): handle "subscribe all" case.
     final client = message.client!;
-    final tags = message.params['userTags']!.cast<String>().toSet();
+    final userTags = message.params['userTags']!.cast<String>();
+    final tags = userTags.toSet();
     final newTags = tags.difference(_profilerUserTagSubscriptions);
 
     // Clear the previously set user tag subscriptions for the client and
@@ -755,7 +767,7 @@
     return Response.from(response);
   }
 
-  Future _routeRequestImpl(Message message) async {
+  Future<Object?> _routeRequestImpl(Message message) async {
     try {
       if (message.completed) {
         return await message.response;
@@ -798,7 +810,7 @@
     final client = message.client!;
     if (client.serviceHandles.containsKey(message.serial)) {
       client.serviceHandles.remove(message.serial)!(message);
-      _serviceRequests.release(message.serial);
+      _serviceRequests.release(message.serial as String);
     }
   }
 }
@@ -841,7 +853,7 @@
 
 /// Get the bytes to the tar archive.
 @pragma("vm:external-name", "VMService_RequestAssets")
-external Uint8List _requestAssets();
+external Uint8List? _requestAssets();
 
 @pragma("vm:external-name", "VMService_AddUserTagsToStreamableSampleList")
 external void _addUserTagsToStreamableSampleList(List<String> userTags);