From f0b7cbe22e2d67c102149d6d118b563b71a7fbb5 Mon Sep 17 00:00:00 2001 From: Michael Anthony Leon Date: Fri, 4 Nov 2022 14:47:19 -0700 Subject: [PATCH] Add perftest dev support manager Summary: This is the 2nd iteration of D39468561 (https://github.com/facebook/react-native/commit/4d1a56813c7975c848631de331e424587054fd57). We first check if the `BridgeDevSupportManager` can be used before we return the `PerfTestDevSupportManager`. This is to avoid a breakage of Quantum that happened on the previous diff. Add a `DevSupportManager` that can be used for performance testing. This `DevSupportManager` allows the inspector connection to be established, but leaves everything else disabled. Previously, if Developer Support was enabled on a release build, the application would present an error as it unsuccessfully attempted to use the bridge dev support manager. This is now conceptually the new flow for deciding what DevSupportManager to choose. ``` if (developerSupportEnabled) { if (full support available) { use full support (i.e. bridge) } else { use profiling-only support (i.e. perftest) } } else { disable dev support } ``` The first attempt at this diff erroneously used this logic: ``` if (developerSupportEnabled) { if (debug build) { use full support (i.e. bridge) } else { use profiling-only support (i.e. perftest) } } else { disable dev support } ``` So now we are always checking to see if the `BridgeDevSupportManager` is available, and if it is, we use it. (`enableOnCrease` indicates the development mode setting: https://www.internalfb.com/code/fbsource/[6b8a941fdf2a0fd58d9db36f5a59fa5fb53ad2df]/xplat/js/react-native-github/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java?lines=259) Changelog: [internal] Reviewed By: makovkastar Differential Revision: D40948243 fbshipit-source-id: 50c6b6b905f5b9c5b5ecc090b36edbd6090ea774 --- .../DefaultDevSupportManagerFactory.java | 9 +-- .../devsupport/PerftestDevSupportManager.java | 56 +++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/devsupport/PerftestDevSupportManager.java diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.java index 97862539f42..d25dc60eec2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.java @@ -61,6 +61,10 @@ public class DefaultDevSupportManagerFactory implements DevSupportManagerFactory if (!enableOnCreate) { return new DisabledDevSupportManager(); } + // Developer support is enabled, we now must choose whether to return a DevSupportManager, + // or a more lean profiling-only PerftestDevSupportManager. We make the choice by first + // trying to return the full support DevSupportManager and if it fails, then just + // return PerftestDevSupportManager. try { // ProGuard is surprisingly smart in this case and will keep a class if it detects a call to // Class.forName() with a static string. So instead we generate a quasi-dynamic string to @@ -94,10 +98,7 @@ public class DefaultDevSupportManagerFactory implements DevSupportManagerFactory customPackagerCommandHandlers, surfaceDelegateFactory); } catch (Exception e) { - throw new RuntimeException( - "Requested enabled DevSupportManager, but BridgeDevSupportManager class was not found" - + " or could not be created", - e); + return new PerftestDevSupportManager(applicationContext); } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/PerftestDevSupportManager.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/PerftestDevSupportManager.java new file mode 100644 index 00000000000..2be621fc38f --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/PerftestDevSupportManager.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.devsupport; + +import android.content.Context; + +/** + * Interface for accessing and interacting with development features related to performance testing. + * Communication is enabled via the Inspector, but everything else is disabled. + */ +public final class PerftestDevSupportManager extends DisabledDevSupportManager { + private final DevServerHelper mDevServerHelper; + private final DevInternalSettings mDevSettings; + private final InspectorPackagerConnection.BundleStatus mBundleStatus; + + public PerftestDevSupportManager(Context applicationContext) { + mDevSettings = + new DevInternalSettings( + applicationContext, + new DevInternalSettings.Listener() { + @Override + public void onInternalSettingsChanged() {} + }); + mBundleStatus = new InspectorPackagerConnection.BundleStatus(); + mDevServerHelper = + new DevServerHelper( + mDevSettings, + applicationContext.getPackageName(), + new InspectorPackagerConnection.BundleStatusProvider() { + @Override + public InspectorPackagerConnection.BundleStatus getBundleStatus() { + return mBundleStatus; + } + }); + } + + @Override + public DevInternalSettings getDevSettings() { + return mDevSettings; + } + + @Override + public void startInspector() { + mDevServerHelper.openInspectorConnection(); + } + + @Override + public void stopInspector() { + mDevServerHelper.closeInspectorConnection(); + } +}