diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java index 0ad53f4f53c..6982604a09f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactHost.java @@ -54,6 +54,7 @@ import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.BlackHoleEventDispatcher; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -93,7 +94,7 @@ public class ReactHost { private final QueueThreadExceptionHandler mQueueThreadExceptionHandler; private final Set mAttachedSurfaces = Collections.synchronizedSet(new HashSet<>()); private final MemoryPressureRouter mMemoryPressureRouter; - private final MemoryPressureListener mMemoryPressureListener; + private MemoryPressureListener mMemoryPressureListener; private final boolean mAllowPackagerServerAccess; private final boolean mUseDevSupport; private final Collection mReactInstanceEventListeners = @@ -169,6 +170,19 @@ public class ReactHost { mUseDevSupport = useDevSupport; } + private MemoryPressureListener createMemoryPressureListener(ReactInstance reactInstance) { + WeakReference weakReactInstance = new WeakReference<>(reactInstance); + return (level) -> { + mBGExecutor.execute( + () -> { + @Nullable ReactInstance strongReactInstance = weakReactInstance.get(); + if (strongReactInstance != null) { + strongReactInstance.handleMemoryPressure(level); + } + }); + }; + } + public LifecycleState getLifecycleState() { return mReactLifecycleStateManager.getLifecycleState(); } @@ -772,6 +786,10 @@ public class ReactHost { mReactJsExceptionHandler, mUseDevSupport); + if (ReactFeatureFlags + .unstable_bridgelessArchitectureMemoryPressureHackyBoltsFix) { + mMemoryPressureListener = createMemoryPressureListener(instance); + } mMemoryPressureRouter.addMemoryPressureListener(mMemoryPressureListener); log(method, "Loading JS Bundle"); @@ -862,6 +880,10 @@ public class ReactHost { mReactJsExceptionHandler, mUseDevSupport); + if (ReactFeatureFlags + .unstable_bridgelessArchitectureMemoryPressureHackyBoltsFix) { + mMemoryPressureListener = createMemoryPressureListener(instance); + } mMemoryPressureRouter.addMemoryPressureListener(mMemoryPressureListener); log(method, "Loading JS Bundle"); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index fd479424f63..05eccce40f4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -56,6 +56,9 @@ public class ReactFeatureFlags { */ public static boolean enableBridgelessArchitecture = false; + /** Server-side gating for a hacky fix to an ANR in the bridgeless core, related to Bolts task. */ + public static boolean unstable_bridgelessArchitectureMemoryPressureHackyBoltsFix = false; + /** * Does the bridgeless architecture log soft exceptions. Could be useful for tracking down issues. */