From 2361e6161a1b374e408e16485ae89cee051ce32f Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Tue, 24 Mar 2026 18:57:38 +0800 Subject: [PATCH 1/2] fix: propagate resolved port to build when default port is unavailable When the default port (8081) is busy and the user accepts an alternative port, the resolved port was only used to start Metro but not propagated to args.port. This caused the iOS build (via RCT_METRO_PORT env var) and Android build (via -PreactNativeDevServerPort and adb reverse) to still use the original port, so the app would fail to connect to Metro. --- .../cli-platform-android/src/commands/runAndroid/index.ts | 4 ++++ .../cli-platform-apple/src/commands/runCommand/createRun.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/cli-platform-android/src/commands/runAndroid/index.ts b/packages/cli-platform-android/src/commands/runAndroid/index.ts index 3961954c9..7e43d2d22 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/index.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/index.ts @@ -70,6 +70,10 @@ async function runAndroid(_argv: Array, config: Config, args: Flags) { args.terminal, ); } + + if (newPort !== port) { + args.port = newPort; + } } if (config.reactNativeVersion !== 'unknown') { diff --git a/packages/cli-platform-apple/src/commands/runCommand/createRun.ts b/packages/cli-platform-apple/src/commands/runCommand/createRun.ts index 0eaeea389..fa16ebe53 100644 --- a/packages/cli-platform-apple/src/commands/runCommand/createRun.ts +++ b/packages/cli-platform-apple/src/commands/runCommand/createRun.ts @@ -124,6 +124,10 @@ const createRun = args.terminal, ); } + + if (newPort !== port) { + args.port = newPort; + } } if (ctx.reactNativeVersion !== 'unknown') { From 88742636bbdbd1f560592c696d5659d3676fc572 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Tue, 24 Mar 2026 19:58:25 +0800 Subject: [PATCH 2/2] fix: return discovered port when packager is already running on a different port When the default port is unavailable and `getNextPort` finds a packager already running on a different port for the same project, `handlePortUnavailable` correctly logs the discovered port but returns the original (unavailable) port. This causes the build to pass the wrong port to gradle/xcodebuild. --- packages/cli-tools/src/handlePortUnavailable.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli-tools/src/handlePortUnavailable.ts b/packages/cli-tools/src/handlePortUnavailable.ts index 0048355f9..9c8e27d04 100644 --- a/packages/cli-tools/src/handlePortUnavailable.ts +++ b/packages/cli-tools/src/handlePortUnavailable.ts @@ -18,6 +18,7 @@ const handlePortUnavailable = async ( if (!start) { packager = false; + port = nextPort; logAlreadyRunningBundler(nextPort); } else { const {change} = await askForPortChange(port, nextPort);