Skip to content

Commit cdc4a8e

Browse files
huntiefacebook-github-bot
authored andcommitted
Wire up background tracing and actions in Perf Monitor (#53460)
Summary: Pull Request resolved: #53460 Completes the first pass of adding background performance trace controls in the V2 Perf Monitor UI. Key changes: - Initiates background trace on `PerfMonitorOverlayManager::init`. - Wires up background trace recording states in button dialog, and connects `pauseAndAnalyzeBackgroundTrace` and `resumeBackgroundTrace` actions. - Moves UI manager/view classes into `perfmonitor` subpackage. - Fixes `responsivenessScore` determination/UI coloring. - Adds tooltip UI to the overlay view. Changelog: [Internal] Reviewed By: javache Differential Revision: D80807554 fbshipit-source-id: 53360c2d454adfbba40fd795d400b28d90ff9e61
1 parent 226d2ba commit cdc4a8e

9 files changed

Lines changed: 236 additions & 126 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,6 @@ internal class BridgelessDevSupportManager(
8383
}
8484

8585
fun tracingState(): TracingState {
86-
return TracingState.DISABLED
86+
return TracingState.ENABLEDINCDPMODE
8787
}
8888
}

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import com.facebook.react.devsupport.interfaces.StackFrame
6868
import com.facebook.react.devsupport.interfaces.TracingState
6969
import com.facebook.react.devsupport.interfaces.TracingStateProvider
7070
import com.facebook.react.devsupport.perfmonitor.PerfMonitorDevHelper
71+
import com.facebook.react.devsupport.perfmonitor.PerfMonitorOverlayManager
7172
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
7273
import com.facebook.react.internal.featureflags.ReactNativeNewArchitectureFeatureFlags
7374
import com.facebook.react.modules.core.RCTNativeAppEventEmitter
@@ -77,6 +78,7 @@ import java.io.File
7778
import java.net.MalformedURLException
7879
import java.net.URL
7980
import java.util.Locale
81+
import javax.inject.Provider
8082

8183
public abstract class DevSupportManagerBase(
8284
protected val applicationContext: Context,
@@ -182,7 +184,7 @@ public abstract class DevSupportManagerBase(
182184
null
183185
}
184186

185-
private var perfMonitorOverlayManager: PerfMonitorOverlayViewManager? = null
187+
private var perfMonitorOverlayManager: PerfMonitorOverlayManager? = null
186188
private var tracingStateProvider: TracingStateProvider? = null
187189

188190
init {
@@ -215,19 +217,19 @@ public abstract class DevSupportManagerBase(
215217
if (
216218
ReactNativeNewArchitectureFeatureFlags.enableBridgelessArchitecture() &&
217219
ReactNativeFeatureFlags.perfMonitorV2Enabled() &&
218-
reactInstanceDevHelper is PerfMonitorDevHelper &&
219-
perfMonitorOverlayManager == null
220+
reactInstanceDevHelper is PerfMonitorDevHelper
220221
) {
221222
perfMonitorOverlayManager =
222-
PerfMonitorOverlayViewManager(
223-
Supplier {
223+
PerfMonitorOverlayManager(
224+
reactInstanceDevHelper,
225+
Provider {
224226
val context = reactInstanceDevHelper.currentActivity
225227
if (context == null || context.isFinishing) {
226-
return@Supplier null
228+
return@Provider null
227229
}
228230
context
229231
},
230-
reactInstanceDevHelper.inspectorTarget,
232+
{ openDebugger(DebuggerFrontendPanelName.PERFORMANCE.toString()) },
231233
)
232234
}
233235
}
@@ -548,10 +550,11 @@ public abstract class DevSupportManagerBase(
548550
override fun onNewReactContextCreated(reactContext: ReactContext) {
549551
resetCurrentContext(reactContext)
550552

551-
if (perfMonitorOverlayManager != null && reactInstanceDevHelper is PerfMonitorDevHelper) {
553+
if (reactInstanceDevHelper is PerfMonitorDevHelper) {
552554
perfMonitorOverlayManager?.let { manager ->
553555
reactInstanceDevHelper.inspectorTarget?.addPerfMonitorListener(manager)
554556
}
557+
perfMonitorOverlayManager?.enable()
555558
}
556559
}
557560

@@ -882,6 +885,7 @@ public abstract class DevSupportManagerBase(
882885

883886
override fun onPackagerDisconnected() {
884887
isPackagerConnected = false
888+
perfMonitorOverlayManager?.disable()
885889
}
886890

887891
override fun onPackagerReloadCommand() {

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

Lines changed: 0 additions & 20 deletions
This file was deleted.

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77

88
package com.facebook.react.devsupport.perfmonitor
99

10+
import com.facebook.react.devsupport.interfaces.TracingState
11+
1012
/**
1113
* [Experimental] Interface implemented by [com.facebook.react.runtime.ReactHostInspectorTarget]
1214
* exposing actions for the V2 Perf Monitor.
1315
*/
1416
internal interface PerfMonitorInspectorTargetBinding {
17+
/** Get the current CDP or background performance tracing state. */
18+
public fun getTracingState(): TracingState
19+
1520
/** Attempt to pause the current background performance trace, and open in DevTools. */
1621
public fun pauseAndAnalyzeBackgroundTrace()
1722

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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+
import android.content.Context
11+
import com.facebook.react.bridge.UiThreadUtil
12+
import com.facebook.react.devsupport.interfaces.TracingState
13+
import javax.inject.Provider
14+
15+
internal class PerfMonitorOverlayManager(
16+
private val devHelper: PerfMonitorDevHelper,
17+
private val contextProvider: Provider<Context?>,
18+
private val onRequestOpenDevTools: () -> Unit,
19+
) : PerfMonitorUpdateListener {
20+
private var enabled: Boolean = false
21+
private var initialized: Boolean = false
22+
private var view: PerfMonitorOverlayView? = null
23+
private var tracingState: TracingState = TracingState.ENABLEDINCDPMODE
24+
25+
private fun init() {
26+
if (initialized || !enabled) {
27+
return
28+
}
29+
30+
UiThreadUtil.runOnUiThread {
31+
val context = contextProvider.get() ?: return@runOnUiThread
32+
view = PerfMonitorOverlayView(context, ::handleRecordingButtonPress)
33+
34+
// Start background tracing
35+
devHelper.inspectorTarget?.resumeBackgroundTrace()
36+
37+
view?.show()
38+
initialized = true
39+
}
40+
}
41+
42+
/** Enable the Perf Monitor overlay. Will be shown when updates are received. */
43+
fun enable() {
44+
enabled = true
45+
init()
46+
UiThreadUtil.runOnUiThread { view?.show() }
47+
}
48+
49+
/** Disable the Perf Monitor overlay. Will remain hidden when updates are received. */
50+
fun disable() {
51+
UiThreadUtil.runOnUiThread { view?.hide() }
52+
enabled = false
53+
}
54+
55+
/** Reset the Perf Monitor overlay, e.g. after a reload. */
56+
fun reset() {
57+
UiThreadUtil.runOnUiThread { view?.resetState() }
58+
59+
// Update with current recording state
60+
onRecordingStateChanged(
61+
devHelper.inspectorTarget?.getTracingState() ?: TracingState.ENABLEDINCDPMODE
62+
)
63+
}
64+
65+
override fun onNewFocusedEvent(data: PerfMonitorUpdateListener.LongTaskEventData) {
66+
view?.updateFocusedEvent(data)
67+
}
68+
69+
override fun onRecordingStateChanged(state: TracingState) {
70+
tracingState = state
71+
view?.updateRecordingState(state)
72+
}
73+
74+
private fun handleRecordingButtonPress() {
75+
when (tracingState) {
76+
TracingState.ENABLEDINBACKGROUNDMODE -> {
77+
devHelper.inspectorTarget?.pauseAndAnalyzeBackgroundTrace()
78+
onRequestOpenDevTools()
79+
}
80+
TracingState.DISABLED -> {
81+
devHelper.inspectorTarget?.resumeBackgroundTrace()
82+
}
83+
TracingState.ENABLEDINCDPMODE -> Unit
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)