Description
New Version
0.67.2
Old Version
0.63.4
Build Target(s)
Android
Output of react-native info
System:
OS: macOS 11.5.1
CPU: (12) x64 Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Memory: 2.89 GB / 16.00 GB
Shell: 5.8 - /bin/zsh
Binaries:
Node: 17.0.1 - /path
Yarn: 1.22.17 - /path
npm: 6.14.16 - ~/path
Watchman: 2021.10.18.00 - /path
CocoaPods: 1.11.2 - /path
SDKs:
iOS SDK:
Platforms: iOS 15.0, DriverKit 20.4, macOS 11.3, tvOS 15.0, watchOS 8.0
Android SDK:
API Levels: 26, 28, 29, 30, 31
Build Tools: 29.0.2, 30.0.2, 30.0.3, 31.0.0, 32.0.0, 32.0.0
System Images: android-28 | Google APIs Intel x86 Atom, android-29 | Google APIs Intel x86 Atom, android-30 | Google APIs Intel x86 Atom, android-31 | Google APIs ARM 64 v8a, android-31 | Google APIs Intel x86 Atom_64
Android NDK: 21.4.7075529
Languages:
Java: 1.8.0_292 - /path
npmPackages:
@react-native-community/cli: 7.0.1
react: 17.0.2
react-native: 0.67.2
react-native-macos: Not Found
npmGlobalPackages:
react-native: Not Found
Issue and Reproduction Steps
On upgrading to React Native 0.67.2, we have started getting com.facebook.react.uimanager.IllegalViewOperationException crash on a Native Android Screen that registers a React Root View to run a react-native screen on top of it as a fragment.
Our app is a hybrid app that runs on both native android and react-native using ReactInstanceManager for linking packages across the app. This was working fine in 0.63.4
The stack trace for the crash is:
com.facebook.react.uimanager.IllegalViewOperationException: Trying to attach a ReactRootView with an explicit id already set to [2131363921]. React Native uses the id field to track react tags and will overwrite this field. If that is fine, explicitly overwrite the id field to View.NO_ID.
at com.facebook.react.ReactRootView.attachToReactInstanceManager(SourceFile:14)
at com.facebook.react.ReactRootView.onMeasure(SourceFile:27)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1204)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:723)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(SourceFile:1)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(SourceFile:35)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:21)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25671)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6987)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:776)
at android.view.View.measure(View.java:25671)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3742)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2520)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2795)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2206)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8759)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1352)
at android.view.Choreographer.doCallbacks(Choreographer.java:1149)
at android.view.Choreographer.doFrame(Choreographer.java:1049)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1333)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8063)
at java.lang.reflect.Method.invoke(Method.java:-2)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
On investigating, I found the culprit to be this commit: 4f3b174
This commit has no PR related to it and no explanation of why was it added. On removing the code from this commit and running forked version of react-native, the crash disappears.
Can someone please let me know why is this happening and if the commit is important, then what was the idea behind it and how can we debug this issue in our app as I did not find any line that is accessing the reactRootView and changing its id as per the crash message.