Stop leaking iproxy processes (#42026)

diff --git a/packages/flutter_tools/lib/src/protocol_discovery.dart b/packages/flutter_tools/lib/src/protocol_discovery.dart
index 81789ee..33768ed 100644
--- a/packages/flutter_tools/lib/src/protocol_discovery.dart
+++ b/packages/flutter_tools/lib/src/protocol_discovery.dart
@@ -48,7 +48,13 @@
   StreamSubscription<String> _deviceLogSubscription;
 
   /// The discovered service URI.
-  Future<Uri> get uri => _completer.future;
+  ///
+  /// Port forwarding is only attempted when this is invoked, in case we never
+  /// need to port forward.
+  Future<Uri> get uri async {
+    final Uri rawUri = await _completer.future;
+    return await _forwardPort(rawUri);
+  }
 
   Future<void> cancel() => _stopScrapingLogs();
 
@@ -74,9 +80,8 @@
     if (uri != null) {
       assert(!_completer.isCompleted);
       _stopScrapingLogs();
-      _completer.complete(_forwardPort(uri));
+      _completer.complete(uri);
     }
-
   }
 
   Future<Uri> _forwardPort(Uri deviceUri) async {