From 34b4ac246638c0a25226552c4d28135517794f8f Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 3 Feb 2026 13:11:12 -0800 Subject: [PATCH 1/6] Fix ReflectionMethodUse: Remove reflection in AnimationDriver error message (#55359) Summary: Fixed ReflectionMethodUse lint error in AnimationDriver.kt. Replaced `javaClass.simpleName` with a hardcoded string to avoid reflection which can cause issues with Redex obfuscation in production builds. changelog: [internal] internal Reviewed By: javache Differential Revision: D91736698 --- .../main/java/com/facebook/react/animated/AnimationDriver.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/AnimationDriver.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/AnimationDriver.kt index 66b7fe4c398..dad7f0519ce 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/AnimationDriver.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/AnimationDriver.kt @@ -34,8 +34,6 @@ internal abstract class AnimationDriver { * start animating with the new properties (different destination or spring settings) */ open fun resetConfig(config: ReadableMap) { - throw JSApplicationCausedNativeException( - "Animation config for ${javaClass.simpleName} cannot be reset" - ) + throw JSApplicationCausedNativeException("Animation config for AnimationDriver cannot be reset") } } From d8f7685dcae0b0692df1dcc52601e6f2b1059b76 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 3 Feb 2026 13:11:12 -0800 Subject: [PATCH 2/6] Fix lint issues in CatalystInstanceImpl.java (#55372) Summary: Fixed two lint warnings in CatalystInstanceImpl.java: - NotInvokedPrivateMethod: Removed unused native method `unregisterFromInspector()` - DeadVariable: Removed unused variable `wasIdle` while keeping the side effect of `mPendingJSCalls.getAndSet(0)` changelog: [internal] internal Reviewed By: javache Differential Revision: D91795470 --- .../java/com/facebook/react/bridge/CatalystInstanceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index 6485791b208..8d5907b76df 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -344,7 +344,7 @@ public void destroy() { if (mFabricUIManager != null) { mFabricUIManager.invalidate(); } - boolean wasIdle = (mPendingJSCalls.getAndSet(0) == 0); + mPendingJSCalls.getAndSet(0); getReactQueueConfiguration() .getJSQueueThread() From d06ad9d6f1cc908aee13ada20f6680afae8adb8c Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 3 Feb 2026 13:11:12 -0800 Subject: [PATCH 3/6] Fix FieldsBelowInit lint warnings in JavaMethodWrapper.kt (#55373) Summary: Fixed FieldsBelowInit lint warnings by reordering declarations to appear before init blocks: - Moved `signature` property above the class's init block - Moved all ARGUMENT_EXTRACTOR_* fields and DEBUG field above the companion object's init block In Kotlin, fields should be declared before init blocks to ensure proper initialization order. changelog: [internal] internal Reviewed By: javache Differential Revision: D91795927 --- .../react/bridge/JavaMethodWrapper.kt | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaMethodWrapper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaMethodWrapper.kt index dcb7005546d..139c93acbfc 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaMethodWrapper.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaMethodWrapper.kt @@ -53,6 +53,14 @@ internal class JavaMethodWrapper( private var arguments: Array? = null private var jsArgumentsNeeded = 0 + val signature: String? + get() { + if (!argumentsProcessed) { + processArguments() + } + return checkNotNull(internalSignature) + } + init { method.isAccessible = true parameterTypes = method.parameterTypes @@ -86,14 +94,6 @@ internal class JavaMethodWrapper( } } - val signature: String? - get() { - if (!argumentsProcessed) { - processArguments() - } - return checkNotNull(internalSignature) - } - private fun buildSignature(method: Method, paramTypes: Array>, isSync: Boolean): String = buildString(paramTypes.size + 2) { if (isSync) { @@ -249,13 +249,6 @@ internal class JavaMethodWrapper( } companion object { - init { - LegacyArchitectureLogger.assertLegacyArchitecture( - "JavaMethodWrapper", - LegacyArchitectureLogLevel.ERROR, - ) - } - private val ARGUMENT_EXTRACTOR_BOOLEAN: ArgumentExtractor = object : ArgumentExtractor() { @Suppress("DEPRECATION") @@ -388,6 +381,13 @@ internal class JavaMethodWrapper( private val DEBUG = PrinterHolder.printer.shouldDisplayLogMessage(ReactDebugOverlayTags.BRIDGE_CALLS) + init { + LegacyArchitectureLogger.assertLegacyArchitecture( + "JavaMethodWrapper", + LegacyArchitectureLogLevel.ERROR, + ) + } + private fun paramTypeToChar(paramClass: Class<*>): Char { val tryCommon = commonTypeToChar(paramClass) if (tryCommon != '\u0000') { From 9d98b23f22dde96643c428ab358e031d397ca9ae Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 3 Feb 2026 13:11:12 -0800 Subject: [PATCH 4/6] Fix SelfComparison lint errors in JavaOnlyMap.kt Summary: Rewrote the equals() method to avoid false-positive SelfComparison lint errors, using the same pattern as JavaOnlyArray.kt fix. changelog: [internal] internal Reviewed By: cortinico Differential Revision: D91802716 --- .../java/com/facebook/react/bridge/JavaOnlyMap.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyMap.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyMap.kt index 9818ea29334..4eab71e84c1 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyMap.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaOnlyMap.kt @@ -168,13 +168,15 @@ public class JavaOnlyMap() : ReadableMap, WritableMap { override fun toString(): String = backingMap.toString() override fun equals(other: Any?): Boolean { - return if (this === other) { - true - } else if (other == null || javaClass != other.javaClass) { - false - } else { - backingMap == (other as JavaOnlyMap).backingMap + if (this === other) { + return true } + if (other !is JavaOnlyMap) { + return false + } + val thisBackingMap = backingMap + val otherBackingMap = other.backingMap + return thisBackingMap == otherBackingMap } override fun hashCode(): Int = backingMap.hashCode() From cfb6303c2c3bb8fb19a26cda3c62fa556b198f24 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 3 Feb 2026 13:11:12 -0800 Subject: [PATCH 5/6] Fix FieldsBelowInit lint warning in ReactInstanceManagerBuilder.kt Summary: Moved TAG field above the companion object's init block to fix lint warning about fields declared below init blocks. changelog: [internal] internal Reviewed By: javache Differential Revision: D91814236 --- .../java/com/facebook/react/ReactInstanceManagerBuilder.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.kt index d814bd96cfe..31543e01630 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.kt @@ -387,13 +387,13 @@ public class ReactInstanceManagerBuilder { } private companion object { + private val TAG: String = ReactInstanceManagerBuilder::class.java.simpleName + init { LegacyArchitectureLogger.assertLegacyArchitecture( "ReactInstanceManagerBuilder", LegacyArchitectureLogLevel.ERROR, ) } - - private val TAG: String = ReactInstanceManagerBuilder::class.java.simpleName } } From 8876f3db1bb620ebc2276360e55966e4f90fefee Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 3 Feb 2026 13:11:12 -0800 Subject: [PATCH 6/6] Fix lint issues in ReactInstanceManager.java (#55375) Summary: Fixed multiple lint errors in ReactInstanceManager.java: - NonStaticNestedClass: Made ReactContextInitParams class static since it doesn't need to access instance members - ClownyBooleanExpression: Removed unnecessary `if (true)` wrapper around throw statement - DeadVariable: Removed unused devSettings variable - EmptyCatchBlock: Added explanatory comment for InterruptedException handling changelog: [internal] internal Reviewed By: javache Differential Revision: D91814708 --- .../facebook/react/ReactInstanceManager.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 2b1a65526f1..82dc2c8825c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -93,7 +93,6 @@ import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.core.ReactChoreographer; -import com.facebook.react.modules.debug.interfaces.DeveloperSettings; import com.facebook.react.packagerconnection.RequestHandler; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.ReactRoot; @@ -194,7 +193,7 @@ public interface ReactInstanceEventListener private boolean mUseFallbackBundle = true; private volatile boolean mInstanceManagerInvalidated = false; - private class ReactContextInitParams { + private static class ReactContextInitParams { private final JavaScriptExecutorFactory mJsExecutorFactory; private final JSBundleLoader mJsBundleLoader; @@ -301,14 +300,11 @@ public static ReactInstanceManagerBuilder builder() { mDevSupportManager.startInspector(); } - // Using `if (true)` just to prevent tests / lint errors. - if (true) { - // Legacy architecture of React Native is deprecated and can't be initialized anymore. - // More details on: - // https://github.com/react-native-community/discussions-and-proposals/blob/nc/legacy-arch-removal/proposals/0929-legacy-architecture-removal.md - throw new UnsupportedOperationException( - "ReactInstanceManager.createReactContext is unsupported."); - } + // Legacy architecture of React Native is deprecated and can't be initialized anymore. + // More details on: + // https://github.com/react-native-community/discussions-and-proposals/blob/nc/legacy-arch-removal/proposals/0929-legacy-architecture-removal.md + throw new UnsupportedOperationException( + "ReactInstanceManager.createReactContext is unsupported."); } private ReactInstanceDevHelper createDevHelperInterface() { @@ -450,7 +446,6 @@ private void recreateReactContextInBackgroundInner() { UiThreadUtil.assertOnUiThread(); if (mUseDeveloperSupport && mJSMainModulePath != null) { - final DeveloperSettings devSettings = mDevSupportManager.getDevSettings(); if (!Systrace.isTracing(TRACE_TAG_REACT)) { if (mBundleLoader == null) { mDevSupportManager.handleReloadJS(); @@ -1164,6 +1159,7 @@ private void runCreateReactContextOnNewThread(final ReactContextInitParams initP try { ReactInstanceManager.this.mHasStartedDestroying.wait(); } catch (InterruptedException e) { + // Interrupted while waiting for destruction to complete, just retry continue; } }