diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt index c29044beef66..67969f64e870 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt @@ -381,8 +381,8 @@ public abstract class DevSupportManagerBase( DevOptionHandler { UiThreadUtil.runOnUiThread { if (reactInstanceDevHelper is PerfMonitorDevHelper) { - reactInstanceDevHelper.inspectorTarget?.let { - if (it.pauseAndAnalyzeBackgroundTrace()) { + reactInstanceDevHelper.inspectorTarget?.let { target -> + if (!target.pauseAndAnalyzeBackgroundTrace()) { openDebugger(DebuggerFrontendPanelName.PERFORMANCE.toString()) } } @@ -567,8 +567,10 @@ public abstract class DevSupportManagerBase( perfMonitorOverlayManager?.let { manager -> reactInstanceDevHelper.inspectorTarget?.addPerfMonitorListener(manager) } - perfMonitorOverlayManager?.enable() - perfMonitorOverlayManager?.startBackgroundTrace() + if (isPackagerConnected) { + perfMonitorOverlayManager?.enable() + perfMonitorOverlayManager?.startBackgroundTrace() + } perfMonitorInitialized = true } @@ -896,11 +898,13 @@ public abstract class DevSupportManagerBase( override fun onPackagerConnected() { isPackagerConnected = true perfMonitorOverlayManager?.enable() + perfMonitorOverlayManager?.startBackgroundTrace() } override fun onPackagerDisconnected() { isPackagerConnected = false perfMonitorOverlayManager?.disable() + perfMonitorOverlayManager?.stopBackgroundTrace() } override fun onPackagerReloadCommand() { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorInspectorTargetBinding.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorInspectorTargetBinding.kt index e1d98bf6e64c..6df3bdeda737 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorInspectorTargetBinding.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorInspectorTargetBinding.kt @@ -25,4 +25,7 @@ internal interface PerfMonitorInspectorTargetBinding { /** Attempt to start a new background performance trace. */ public fun resumeBackgroundTrace() + + /** Attempt to stop the current performance trace. */ + public fun stopBackgroundTrace() } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt index f093c0b92df7..b44dae91d1a5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt @@ -58,6 +58,18 @@ internal class PerfMonitorOverlayManager( } } + /** Stop background trace recording. */ + fun stopBackgroundTrace() { + if (!enabled) { + return + } + + devHelper.inspectorTarget?.let { target -> + target.stopBackgroundTrace() + onRecordingStateChanged(target.getTracingState()) + } + } + override fun onRecordingStateChanged(state: TracingState) { tracingState = state UiThreadUtil.runOnUiThread { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt index cfc5e32eaabf..63b61177a846 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt @@ -67,6 +67,13 @@ internal class ReactHostInspectorTarget(reactHostImpl: ReactHostImpl) : } } + override fun stopBackgroundTrace() { + stopAndDiscardBackgroundTrace() + perfMonitorListeners.forEach { listener -> + listener.onRecordingStateChanged(TracingState.DISABLED) + } + } + override fun close() { mHybridData.resetNative() }