Skip to content

Commit 3d1d81c

Browse files
huntiefacebook-github-bot
authored andcommitted
Remove Perf Monitor hooks from DevSupport API (#53349)
Summary: Pull Request resolved: #53349 Follows feedback on D78904767, refactoring how we pass data to `PerfMonitorOverlayViewManager` to avoid API additions on `DevSupport`. New interfaces under `com.facebook.react.devsupport.perfmonitor`: - `PerfMonitorUpdateListener` is implemented by the view class to receive updates from the C++ `HostTargetDelegate`. - `PerfMonitorInspectorTargetBinding` exposes an API on `ReactHostInspectorTarget` to send CDP actions down to C++ (stub for now). - `PerfMonitorDevHelper` allows us to use the internal `ReactHostImplDevHelper` to expose the `ReactHostInspectorTarget` instance from the runtime. Changelog: [Internal] Reviewed By: cortinico, rshest Differential Revision: D80464093 fbshipit-source-id: b88e270c0211e4adf52c015ac700df7f44945a5a
1 parent 62b8a7b commit 3d1d81c

15 files changed

Lines changed: 147 additions & 85 deletions

packages/react-native/ReactAndroid/api/ReactAndroid.api

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,7 +1973,7 @@ public abstract interface class com/facebook/react/devsupport/DevServerHelper$Pa
19731973
public abstract fun onPackagerReloadCommand ()V
19741974
}
19751975

1976-
public abstract class com/facebook/react/devsupport/DevSupportManagerBase : com/facebook/react/devsupport/interfaces/DevSupportManager, com/facebook/react/devsupport/interfaces/PerfMonitorV2Handler {
1976+
public abstract class com/facebook/react/devsupport/DevSupportManagerBase : com/facebook/react/devsupport/interfaces/DevSupportManager {
19771977
public static final field Companion Lcom/facebook/react/devsupport/DevSupportManagerBase$Companion;
19781978
public fun <init> (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;Lcom/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager;)V
19791979
public fun addCustomDevOption (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevOptionHandler;)V
@@ -2031,7 +2031,6 @@ public abstract class com/facebook/react/devsupport/DevSupportManagerBase : com/
20312031
public fun startInspector ()V
20322032
public fun stopInspector ()V
20332033
public fun toggleElementInspector ()V
2034-
public fun unstable_updatePerfMonitor (III)V
20352034
}
20362035

20372036
public abstract interface class com/facebook/react/devsupport/DevSupportManagerBase$CallbackWithBundleLoader {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,9 @@ import com.facebook.react.devsupport.interfaces.ErrorCustomizer
6262
import com.facebook.react.devsupport.interfaces.ErrorType
6363
import com.facebook.react.devsupport.interfaces.PackagerStatusCallback
6464
import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager
65-
import com.facebook.react.devsupport.interfaces.PerfMonitorOverlayManager
66-
import com.facebook.react.devsupport.interfaces.PerfMonitorV2Handler
6765
import com.facebook.react.devsupport.interfaces.RedBoxHandler
6866
import com.facebook.react.devsupport.interfaces.StackFrame
67+
import com.facebook.react.devsupport.perfmonitor.PerfMonitorDevHelper
6968
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
7069
import com.facebook.react.internal.featureflags.ReactNativeNewArchitectureFeatureFlags
7170
import com.facebook.react.modules.core.RCTNativeAppEventEmitter
@@ -92,7 +91,7 @@ public abstract class DevSupportManagerBase(
9291
private val surfaceDelegateFactory: SurfaceDelegateFactory?,
9392
public var devLoadingViewManager: DevLoadingViewManager?,
9493
private var pausedInDebuggerOverlayManager: PausedInDebuggerOverlayManager?,
95-
) : DevSupportManager, PerfMonitorV2Handler {
94+
) : DevSupportManager {
9695

9796
public interface CallbackWithBundleLoader {
9897
public fun onSuccess(bundleLoader: JSBundleLoader)
@@ -184,7 +183,7 @@ public abstract class DevSupportManagerBase(
184183
null
185184
}
186185

187-
private var perfMonitorOverlayManager: PerfMonitorOverlayManager? = null
186+
private var perfMonitorOverlayManager: PerfMonitorOverlayViewManager? = null
188187

189188
init {
190189
// We store JS bundle loaded from dev server in a single destination in app's data dir.
@@ -216,6 +215,7 @@ public abstract class DevSupportManagerBase(
216215
if (
217216
ReactNativeNewArchitectureFeatureFlags.enableBridgelessArchitecture() &&
218217
ReactNativeFeatureFlags.perfMonitorV2Enabled() &&
218+
reactInstanceDevHelper is PerfMonitorDevHelper &&
219219
perfMonitorOverlayManager == null
220220
) {
221221
perfMonitorOverlayManager =
@@ -227,7 +227,7 @@ public abstract class DevSupportManagerBase(
227227
}
228228
context
229229
},
230-
{ openDebugger() },
230+
reactInstanceDevHelper.inspectorTarget,
231231
)
232232
}
233233
}
@@ -507,6 +507,12 @@ public abstract class DevSupportManagerBase(
507507

508508
override fun onNewReactContextCreated(reactContext: ReactContext) {
509509
resetCurrentContext(reactContext)
510+
511+
if (perfMonitorOverlayManager != null && reactInstanceDevHelper is PerfMonitorDevHelper) {
512+
perfMonitorOverlayManager?.let { manager ->
513+
reactInstanceDevHelper.inspectorTarget?.addPerfMonitorListener(manager)
514+
}
515+
}
510516
}
511517

512518
override fun onReactInstanceDestroyed(reactContext: ReactContext) {
@@ -936,16 +942,6 @@ public abstract class DevSupportManagerBase(
936942
pausedInDebuggerOverlayManager?.hidePausedInDebuggerOverlay()
937943
}
938944

939-
override fun unstable_updatePerfMonitor(
940-
longTaskDuration: Int,
941-
responsivenessScore: Int,
942-
ttl: Int,
943-
) {
944-
perfMonitorOverlayManager?.update(
945-
PerfMonitorOverlayManager.PerfMonitorUpdateData(longTaskDuration, responsivenessScore, ttl)
946-
)
947-
}
948-
949945
override fun setAdditionalOptionForPackager(name: String, value: String) {
950946
devSettings.packagerConnectionSettings.setAdditionalOptionForPackager(name, value)
951947
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/PerfMonitorOverlayViewManager.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@ import androidx.core.view.WindowInsetsCompat
2626
import com.facebook.react.R
2727
import com.facebook.react.bridge.UiThreadUtil
2828
import com.facebook.react.devsupport.interfaces.PerfMonitorOverlayManager
29+
import com.facebook.react.devsupport.perfmonitor.PerfMonitorInspectorTargetBinding
30+
import com.facebook.react.devsupport.perfmonitor.PerfMonitorUpdateListener
2931
import com.facebook.react.uimanager.DisplayMetricsHolder
3032
import com.facebook.react.uimanager.PixelUtil
3133
import java.util.Locale
3234

3335
internal class PerfMonitorOverlayViewManager(
3436
private val contextSupplier: Supplier<Context?>,
35-
private val onRequestAnalyzeTrace: () -> Unit,
36-
) : PerfMonitorOverlayManager {
37+
private val inspectorTarget: PerfMonitorInspectorTargetBinding?,
38+
) : PerfMonitorOverlayManager, PerfMonitorUpdateListener {
3739
private var initialized: Boolean = false
3840
private var enabled: Boolean = false
3941
private var hasInteractionData: Boolean = false
@@ -66,13 +68,13 @@ internal class PerfMonitorOverlayViewManager(
6668
}
6769
}
6870

69-
override fun update(data: PerfMonitorOverlayManager.PerfMonitorUpdateData) {
71+
override fun onNewFocusedEvent(data: PerfMonitorUpdateListener.LongTaskEventData) {
7072
UiThreadUtil.runOnUiThread {
7173
ensureInitialized()
7274
durationLabel?.text = String.format(Locale.US, "%d ms", data.durationMs)
7375
durationLabel?.setTextColor(getDurationHighlightColor(data.responsivenessScore))
7476
hasInteractionData = true
75-
this.ttl = data.ttl
77+
ttl = data.ttl
7678

7779
hideAfterTimeoutHandler?.removeCallbacksAndMessages(null)
7880

@@ -175,7 +177,7 @@ internal class PerfMonitorOverlayViewManager(
175177
dpToPx(8f).toInt(),
176178
)
177179
addView(buttonInner)
178-
setOnClickListener { onRequestAnalyzeTrace() }
180+
setOnClickListener { inspectorTarget?.pauseAndAnalyzeTrace() }
179181
}
180182
val dialog =
181183
createAnchoredDialog(context, dpToPx(0f), dpToPx(0f)).apply { setContentView(buttonView) }

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/PerfMonitorOverlayManager.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ package com.facebook.react.devsupport.interfaces
99

1010
/** [Experimental] Interface to manage the V2 Perf Monitor overlay. */
1111
internal interface PerfMonitorOverlayManager {
12-
data class PerfMonitorUpdateData(val durationMs: Int, val responsivenessScore: Int, val ttl: Int)
13-
1412
/** Enable the Perf Monitor overlay. Will be shown when updates are received. */
1513
public fun enable()
1614

@@ -19,7 +17,4 @@ internal interface PerfMonitorOverlayManager {
1917

2018
/** Reset the Perf Monitor overlay, e.g. after a reload. */
2119
public fun reset()
22-
23-
/** Update the state of the Perf Monitor overlay. */
24-
public fun update(data: PerfMonitorUpdateData)
2520
}

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/PerfMonitorV2Handler.kt

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.devsupport.perfmonitor
9+
10+
/**
11+
* Interface implemented by [com.facebook.react.runtime.ReactHostImplDevHelper] exposing additional
12+
* hooks used to implement the V2 Perf Monitor overlay (experimental).
13+
*/
14+
internal interface PerfMonitorDevHelper {
15+
/**
16+
* The inspector target object. Matches the lifetime of the ReactHost. May be null if modern JS
17+
* debugging is disabled.
18+
*/
19+
public val inspectorTarget: PerfMonitorInspectorTarget?
20+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.devsupport.perfmonitor
9+
10+
internal interface PerfMonitorEventDispatcher {
11+
public fun addPerfMonitorListener(listener: PerfMonitorUpdateListener)
12+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.devsupport.perfmonitor
9+
10+
internal interface PerfMonitorInspectorTarget :
11+
PerfMonitorEventDispatcher, PerfMonitorInspectorTargetBinding {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.devsupport.perfmonitor
9+
10+
/**
11+
* [Experimental] Interface implemented by [com.facebook.react.runtime.ReactHostInspectorTarget]
12+
* exposing actions for the V2 Perf Monitor.
13+
*/
14+
internal interface PerfMonitorInspectorTargetBinding {
15+
public fun pauseAndAnalyzeTrace()
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.devsupport.perfmonitor
9+
10+
/** [Experimental] An interface for subscribing to updates for the V2 Perf Monitor. */
11+
internal interface PerfMonitorUpdateListener {
12+
data class LongTaskEventData(
13+
val durationMs: Int,
14+
val responsivenessScore: Int,
15+
val ttl: Int,
16+
)
17+
18+
/** Called when a new active performance event should be displayed. */
19+
fun onNewFocusedEvent(data: LongTaskEventData)
20+
}

0 commit comments

Comments
 (0)