From 4d1a56813c7975c848631de331e424587054fd57 Mon Sep 17 00:00:00 2001 From: Matt Blagden Date: Tue, 11 Oct 2022 10:24:05 -0700 Subject: [PATCH] Add perftest dev support manager Summary: 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. With this change, if a developer opts into developer support in a release build (i.e. `enableOnCreate == true && ReactBuildConfig.DEBUG == false` in the `DevSupportManagerFactory`), the `PerfTestDevSupportManager` will be used, allowing use of things like heap size reporting and the sampling profiler. (`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: rubennorte Differential Revision: D39468561 fbshipit-source-id: cb3c82e7a8ee74316b23f57dc8d0cc6e5cdb18a7 --- .../DefaultDevSupportManagerFactory.java | 4 ++ .../devsupport/PerftestDevSupportManager.java | 56 +++++++++++++++++++ 2 files changed, 60 insertions(+) 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..2a55a36c5b0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.java @@ -10,6 +10,7 @@ package com.facebook.react.devsupport; import android.content.Context; import androidx.annotation.Nullable; import com.facebook.react.common.SurfaceDelegateFactory; +import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.devsupport.interfaces.RedBoxHandler; @@ -61,6 +62,9 @@ public class DefaultDevSupportManagerFactory implements DevSupportManagerFactory if (!enableOnCreate) { return new DisabledDevSupportManager(); } + if (!ReactBuildConfig.DEBUG) { + return new PerftestDevSupportManager(applicationContext); + } 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 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(); + } +}