Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45422
When `ReactNativeFeatureFlags.setAndroidLayoutDirection()` is set, we assume in components like ReactHorizontalScrolView that the Yoga contextual layout direction has been set on the underlying component, and skip using I18nManager global direction.
These native views are also used in Paper, so we need to make the change there as well to avoid regressions.
This change mechanically ports the change from Fabric to Paper, at the same layer as used in Fabric (applying ShadowNode layout to the Android view tree).
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D59708408
fbshipit-source-id: 52d6fa80c102250eae7ccccedd7184569f6a727f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45753
Let's turn this off, for clients where the feature flag isn't wired to a config, until the issue with `removeClippedSubviews` is resolved.
Changelog: [Internal]
Reviewed By: cortinico
Differential Revision: D60273063
fbshipit-source-id: 6302a7e1f204459ec7f5cbdb26a521e07e023458
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45690
ViewManager layer often uses `YogaConstants.UNDEFINED` (`NaN`) as null-state value. Teaching PixelUtil how to handle `NaN` values makes glue code around easier. I think this technically isn't needed, since the resultant operations would become `NaN`, but it seems like poor form/hard to reason about to propagate NaN into arithmetic or library functions.
Changelog: [Internal]
Reviewed By: cortinico
Differential Revision: D60265329
fbshipit-source-id: b2f4abaefb30ebd58c2644d072bb7e5bc4b3ee7b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45691
1. Add some accessors, so we can keep accessors and setters symetric
2. Use the shared BorderStyle enum added in last diff
3. Fix some missing invalidation on setting style
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D60252276
fbshipit-source-id: 3dde6ad5926f109cefc7247da4ba1894694b1867
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45687
This adds some more enums and data classes to encapsulate style values we are working with for border/background rendering. Right now, a lot of these are passed around as strings, or raw ints (of differing ordinals). These will be used as the public API of `BackgroundStyleApplicator` up the stack.
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D60252277
fbshipit-source-id: 0f8001869421ffffae9727c7904bf5e395505c08
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45685
We built these to be able to parse web style string values, but the types only allow object form, and the TypeScript type is wrong.
Changelog: [Internal]
Reviewed By: joevilches
Differential Revision: D60263730
fbshipit-source-id: 7a6e93924a92e8e62346645cb4f8ab1a37dca34f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45722
Splitting the ReactImageView convertion to another file, to see if this is causing further failures.
Changelog:
[Internal] [Changed] - Convert ReactImageManager to Kotlin
Reviewed By: rshest
Differential Revision: D60285050
fbshipit-source-id: 68415782a40c1eacf4e67fbdd2d70c962c0600c0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45711
Migrating this package in one go is proving harder than expected.
Let's split this through in smaller parts: I'm first marking the package as nullsafe.
Changelog:
[Internal] [Changed] - Make `com.facebook.react.views.image` nullsafe
Reviewed By: cipolleschi
Differential Revision: D60282604
fbshipit-source-id: 68879142a88bdc3c837dff91e53c5f5e891773f9
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45683
Changelog: [Internal]
this did not make any meaningful progress, let's clean it up and revisit it later.
Reviewed By: fkgozali
Differential Revision: D60219828
fbshipit-source-id: 89a283d7c572dfcd6ef16472e81f3dce1c2cd284
Summary:
## Context
Running manual tests when preparing a release, it's time consuming.
We have to do the cherry picks, wait for CI to finish, and then manually test 8 configurations.
Maestro is a tool that allow us to run E2E tests automatically, and we can wire it to CI.
## Change
Add a test flow for RNTester
## Changelog:
[Internal] - Exploration to integrate maestro
Pull Request resolved: https://github.com/facebook/react-native/pull/45574
Test Plan: GHA
Reviewed By: blakef
Differential Revision: D60282147
Pulled By: cipolleschi
fbshipit-source-id: 4ecba84f0b2c7186de2bb9938043e73a0bd9a6bd
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45735
This merges several 2 external libraries from .so to be included inside
libappmodules.so.
Changelog:
[Internal] [Changed] - Move react_codegen_* libraries for RNTester to OBJECT
Reviewed By: rozele, rshest
Differential Revision: D60290806
fbshipit-source-id: 6bfa40995d7538e075819d916e8a204464edb75b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45727
All instances mirror types which are already defined in the platform-independent base module. See snapshot changes.
Changelog: [Internal]
Reviewed By: GijsWeterings
Differential Revision: D60286148
fbshipit-source-id: 30665252ff5e449a2c10ff3a3e76d9337daecb80
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45640
Other two libraries that don't need to be dynamic libraries but can just be exposed via libreactnative.so
Changelog:
[Internal] [Changed] - Move react_featureflags and react_render_consistency inside libreactnative.so
Reviewed By: cipolleschi
Differential Revision: D55796945
fbshipit-source-id: be40b1523a560b2783fc7b6312326e20dc8cf595
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/43909
As we're moving towards a single `libreactnative.so` file, we need to remove several of our prefab targets. Here I'm cleaning up those that are not having an OnLoad.cpp file which needs to be loaded from SoLoader.
This is breaking for libraries using native dependencies via Prefab (i.e. search for `ReactAndroid::` in CMakeLists.txt files for your project).
If so, the CMakeLists.txt files should be updated as follows:
```diff
- ReactAndroid::react_render_debug
+ ReactAndroid::reactnative
```
This applies to every prefab dependencies (the example is just for `react_render_debug`
Changelog:
[General] [Breaking] - Remove several libs from default App CMake setup
Reviewed By: cipolleschi
Differential Revision: D55751683
fbshipit-source-id: 3aca7897852b5f323d60ede3c5036cae2f81e6c3
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/43908
This creates a new dynamic library that we want to be the only .so that is loaded from apps/libraries.
Changelog:
[Internal] [Changed] - Create the libreactnative.so dependency
Reviewed By: cipolleschi
Differential Revision: D55751682
fbshipit-source-id: 50f4167dc2f9953a8673b28dba3357e19fe88d6b
Summary:
https://github.com/facebook/react-native/issues/45596
Migrated all the assertions to use `assertThat()` function from AssertJ.
Also updated the `prepareBoostTask_withMissingConfiguration_fails` test to use `assertThatThrownBy` to check if the tested task throws a given exception.
## Changelog:
Migrate tests to assertj in these files:
- `packages/gradle-plugin/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/internal/PrepareBoostTaskTest.kt`
[INTERNAL] [CHANGED] - Migrated PrepareBoostTaskTest from junit.Assert to assertj.core.api.Assertions.
For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
Pull Request resolved: https://github.com/facebook/react-native/pull/45718
Test Plan:
All tests pass when `./gradlew -p packages/gradle-plugin test` command is ran.
<img width="454" alt="image" src="https://github.com/user-attachments/assets/9e954f7b-2208-48a9-ae15-ab642252e6da">
Reviewed By: GijsWeterings
Differential Revision: D60284566
Pulled By: cortinico
fbshipit-source-id: 11af0a0ca574f935e6aab3a7855b5daaeab1a718
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45701
# Changelog: [Internal]
One weird thing is that this test actually never runs for Android, so its only compiled. I am not sure why exactly this one produces an error during execution, given that the next test is almost identical.
Nothing valuable from logcat, just a `SIGSEGV`. Since its something with memory, I've tried calling `unsubscribe`, same as in the next test to free memory before the test tear down (which should not run, because this test doesn't run).
Reviewed By: dmytrorykun
Differential Revision: D60282464
fbshipit-source-id: 2c7760f02c1128083f28651fe8ecd0f3cee27715
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45578
# Changelog: [Internal]
Use previously introduced native module for managing the presence of warning notifications in LogBox:
- Don't display warnings and Fusebox migration message if there is an active debugging session
- If the session has just been started, clear warnings to hide Fusebox migration message
- If there is no active debugging session (even if there were some at some point of Host lifetime), display Fusebox migration message
See demo in test plan.
Reviewed By: huntie
Differential Revision: D59975265
fbshipit-source-id: 87d91b4d7f3c825dc795ec1b5b3073f969bc7b60
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45577
# Changelog: [Internal]
This diff adds new native module, which can be used from JavaScript.
The API includes:
1. `hasActiveSession`: returns a boolean flag, which can be used for determining if 1 or more debugging sessions are active for current HostTarget.
2. `subscribe`: receives a callback, which will be executed once the debugging state changes. To be more precise, this will only be called when state is changing from no active sessions to 1 session or the other way around. Callback should expect to receive one boolean argument, which can be used for determining if there is an active session.
Reviewed By: huntie
Differential Revision: D59975264
fbshipit-source-id: dd095954529f573f38e9fae1792465a59e639d23
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45670
**Motivation**
There is a special [code path](https://github.com/facebook/react-native/blob/bb23026daf1a853f4482be46d6f242712a6b7330/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/FrameBasedAnimationDriver.java#L98) for native driven looping animations that restarts the animation in native, never calling the "animation end" callback. This was designed for and works fine with the `Animated.loop(Animated.timing(...))` animations. Unfortunately, it doesn't work well with more complex animations.
Consider an `Animated.loop(Animated.sequence(Animated.timing(...)))` animation. It doesn't trigger this code path. Instead, its nested `Animated.timing` animations are continuously rescheduled from JS by the looping `Animated.sequence` as singular native driven animations. Each time they end, they fire their "animation end" callback.
This introduces a subtle breakage when those "animation end" callbacks trigger React to update its state. This in turn restarts the rendering. In case with long transitions such looping animations can restart the rendering multiple times. In worst cases it may render the app unresponsive.
**Solution**
We don't need to tell React to update its state when running looping animations. This diff introduces a mechanism, using which `Animated.loop` can tell its nested animations that they are in a loop, and and there's no need to send state updates when they finish. This is consistent with how `Animated.loop(Animated.timing(...))` behaves.
Changelog: [General][Breaking] - Looping animations will not send React state updates.
Facebook
This diff enables this new behaviour for IGVR and FBVR, it also set up the experiment for FBiOS and FB4a.
Reviewed By: javache
Differential Revision: D59970265
fbshipit-source-id: 4832ae05b82f6cc59f92f72305b68610fa422f0a
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45638
When looping a frame-based animation, we want to make sure to use the latest frame from the easing curve, which may not necessarily match `mToValue`.
Changelog: [Internal]
Differential Revision: D60143746
fbshipit-source-id: 68fa5421a958acc8291f396bc9f263fa110fdc54
Summary:
As explained in https://github.com/facebook/react-native/issues/45280, `TSan` picks up data races related to concurrent read/write to fields in `RCTCxxBridge`. See this report for reference:
```
WARNING: ThreadSanitizer: data race (pid=19983)
Write of size 1 at 0x00010af1dfd8 by thread T13:
#0 -[RCTCxxBridge _flushPendingCalls] <null> (RNTesterUnitTests:arm64+0x42b484)
https://github.com/facebook/react-native/issues/1 __53-[RCTCxxBridge executeSourceCode:withSourceURL:sync:]_block_invoke <null> (RNTesterUnitTests:arm64+0x426050)
https://github.com/facebook/react-native/issues/2 decltype(std::declval<void () block_pointer __strong&>()()) std::__1::__invoke[abi:ue170006]<void () block_pointer __strong&>(&&, decltype(std::declval<void () block_pointer __strong&>()())&&...) <null> (RNTesterUnitTests:arm64+0x456298)
https://github.com/facebook/react-native/issues/3 std::__1::__function::__func<void () block_pointer __strong, std::__1::allocator<std::__1::allocator>, void ()>::operator()() <null> (RNTesterUnitTests:arm64+0x455c6c)
https://github.com/facebook/react-native/issues/4 std::__1::__function::__value_func<void ()>::operator()[abi:ue170006]() const <null> (RNTesterUnitTests:arm64+0x3ce2e4)
https://github.com/facebook/react-native/issues/5 std::__1::function<void ()>::operator()() const <null> (RNTesterUnitTests:arm64+0x3cdfd0)
https://github.com/facebook/react-native/issues/6 facebook::react::tryAndReturnError(std::__1::function<void ()> const&) <null> (RNTesterUnitTests:arm64+0x4af18c)
https://github.com/facebook/react-native/issues/7 facebook::react::RCTMessageThread::tryFunc(std::__1::function<void ()> const&) <null> (RNTesterUnitTests:arm64+0x51595c)
https://github.com/facebook/react-native/issues/8 facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1::operator()() const <null> (RNTesterUnitTests:arm64+0x529df0)
https://github.com/facebook/react-native/issues/9 decltype(std::declval<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&>()()) std::__1::__invoke[abi:ue170006]<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&>(facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&) <null> (RNTesterUnitTests:arm64+0x529b54)
https://github.com/facebook/react-native/issues/10 void std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:ue170006]<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&>(facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1&) <null> (RNTesterUnitTests:arm64+0x529978)
https://github.com/facebook/react-native/issues/11 std::__1::__function::__alloc_func<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1, std::__1::allocator<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1>, void ()>::operator()[abi:ue170006]() <null> (RNTesterUnitTests:arm64+0x5298dc)
https://github.com/facebook/react-native/issues/12 std::__1::__function::__func<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1, std::__1::allocator<facebook::react::RCTMessageThread::runOnQueue(std::__1::function<void ()>&&)::$_1>, void ()>::operator()() <null> (RNTesterUnitTests:arm64+0x524518)
https://github.com/facebook/react-native/issues/13 std::__1::__function::__value_func<void ()>::operator()[abi:ue170006]() const <null> (RNTesterUnitTests:arm64+0x3ce2e4)
https://github.com/facebook/react-native/issues/14 std::__1::function<void ()>::operator()() const <null> (RNTesterUnitTests:arm64+0x3cdfd0)
https://github.com/facebook/react-native/issues/15 invocation function for block in facebook::react::RCTMessageThread::runAsync(std::__1::function<void ()>) <null> (RNTesterUnitTests:arm64+0x515384)
https://github.com/facebook/react-native/issues/16 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ <null> (CoreFoundation:arm64+0x8dc0c)
https://github.com/facebook/react-native/issues/17 __NSThread__start__ <null> (Foundation:arm64+0x645c60)
Previous read of size 1 at 0x00010af1dfd8 by main thread:
#0 -[RCTCxxBridge isLoading] <null> (RNTesterUnitTests:arm64+0x43236c)
https://github.com/facebook/react-native/issues/1 -[RCTBridge isLoading] <null> (RNTesterUnitTests:arm64+0x3c0170)
https://github.com/facebook/react-native/issues/2 -[RCTComponentPropsTests setUp] <null> (RNTesterUnitTests:arm64+0xe6f34)
https://github.com/facebook/react-native/issues/3 __70-[XCTestCase _shouldContinueAfterPerformingSetUpSequenceWithSelector:]_block_invoke.134 <null> (XCTestCore:arm64+0x540d8)
Location is heap block of size 384 at 0x00010af1de80 allocated by main thread:
#0 calloc <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x4fc30)
https://github.com/facebook/react-native/issues/1 _malloc_type_calloc_outlined <null> (libsystem_malloc.dylib:arm64+0xf488)
https://github.com/facebook/react-native/issues/2 -[RCTBridge initWithDelegate:bundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc540)
https://github.com/facebook/react-native/issues/3 -[RCTBridge initWithBundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc124)
https://github.com/facebook/react-native/issues/4 -[RCTComponentPropsTests setUp] <null> (RNTesterUnitTests:arm64+0xe6b3c)
https://github.com/facebook/react-native/issues/5 __70-[XCTestCase _shouldContinueAfterPerformingSetUpSequenceWithSelector:]_block_invoke.134 <null> (XCTestCore:arm64+0x540d8)
Thread T13 (tid=11290378, running) created by main thread at:
#0 pthread_create <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x2bee4)
https://github.com/facebook/react-native/issues/1 -[NSThread startAndReturnError:] <null> (Foundation:arm64+0x6458f0)
https://github.com/facebook/react-native/issues/2 -[RCTBridge setUp] <null> (RNTesterUnitTests:arm64+0x3bf748)
https://github.com/facebook/react-native/issues/3 -[RCTBridge initWithDelegate:bundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc540)
https://github.com/facebook/react-native/issues/4 -[RCTBridge initWithBundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x3bc124)
https://github.com/facebook/react-native/issues/5 -[RCTComponentPropsTests setUp] <null> (RNTesterUnitTests:arm64+0xe6b3c)
https://github.com/facebook/react-native/issues/6 __70-[XCTestCase _shouldContinueAfterPerformingSetUpSequenceWithSelector:]_block_invoke.134 <null> (XCTestCore:arm64+0x540d8)
```
In order to fix the data races, `std::atomic` instead of primitive boolean types.
In order to reproduce my findings and verify fix:
* Clone this branch
* Run setup code as described in README
* Execute `git revert -n 11c09fdc7c442dd694909bebbbc8f21c3e69edf2`.
* Enable TSan for both RNTester and its test scheme.
* Enable Runtime issue breakpoint for TSan
* Run unit tests
* Observe the TSan breakpoint is hit (possibly other places in the codebase as well) when accessing `_loading`, `_moduleRegistryCreated`, and `_valid`.. Continue execution if other breakpoints are hit before this breakpoint.
* Execute git revert --abort
* Run the tests again and observe the TSan breakpoint does not hit said code again.
NB! While this will fix data races, it will not fix potential race conditions. I have not encountered bugs related to race conditions in `RCTCxxBridge`, but given the nature of how it is made use of concurrently, it is, in my opinion, plausible.
## Changelog:
[iOS][Fixed] Use std::atomic for eliminating races in RCTCxxBridge.
Pull Request resolved: https://github.com/facebook/react-native/pull/45558
Test Plan: I believe there are existing Unit tests in place for verifying this fix.
Reviewed By: cipolleschi
Differential Revision: D60233758
Pulled By: dmytrorykun
fbshipit-source-id: 8aa124a0521ad43a5e17b42e0ce6d22ae6b4e667
Summary:
A previous commit (https://github.com/facebook/react-native/pull/45616) broke the ci in OSS.
It looks like that JSI is not working well in objective-c++ files when frameworks is enabled.
We need to look into it further but we need to have green CI
## Changelog:
[Internal] - Unblock CI
Reviewed By: blakef
Differential Revision: D60232011
fbshipit-source-id: b02ae163258786ce43cc11bc94420682661a6dd0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45634
This allows the Android runtime to pass additional options to Metro. Each app can
decide what to send based on the needs. The use case is to send
transform.xyz=somevalue to Metro.
Changelog: [Internal]
Reviewed By: javache
Differential Revision: D60155757
fbshipit-source-id: 006d5ff2e3f14634fb39d44b390f30da479b1faa
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45621
This allows the iOS runtime to pass additional options to Metro. Each app can
decide what to send based on the needs. The use case is to send
`transform.xyz=somevalue` to Metro.
Changelog: [Internal]
Reviewed By: cipolleschi
Differential Revision: D60143663
fbshipit-source-id: 3e35a01a0ee121096d3a5cf0547e8e0ebf77f8ce
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45624
Must have forgot to add this functionality in, since it was just using a Rect for the clear region. This uses the proper rounded path.
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60147035
fbshipit-source-id: 3eebb2c4a56e4dfc957213e54f3d2de2c966082b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45622
The rest of these props setters opts to use `needsInvalidateLayer`, not `_needsInvalidateLayer` the latter of which is a instance variable. This change no effect since we set `_needsInvalidateLayer` to the or of both below, but we should be consistent with the rest of the logic here.
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60144215
fbshipit-source-id: b4b863d964a688c1cb9f6fada626d390681d1542
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45620
This does not really depend on anything in the layer. It is just a prop on the layer itself, so we can just set it in place. This pattern already happens for things like transform: https://fburl.com/code/0bhsdlcy
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60142154
fbshipit-source-id: 52ee0e1e6eacf3bba005a727a5a4325a5cc6d338
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45613
We had a bug where box shadows were not getting cleaned up. The fix here is easy - just call `[_boxShadowLayer removeFromSuperView]`. Previously we were just setting this layer to nil, which does not do the job.
Changelog: [Internal]
Reviewed By: NickGerleman
Differential Revision: D60137528
fbshipit-source-id: 310df944f63ffc73ee5fe938cfb5a48674f997ab
Summary:
## Context
During TW Bloks testing, I frequently encounter the issue of a page not loading. After investigating further, I discovered that for one XOCReactNativeHost, there are multiple instances of ReactInstanceManager created. One of them is properly initialized with XOCLoginActivity, while the other one is not initialized and its activity is null.
When calling ReactContext onHostResume, there is a small chance that the ReactInstanceManager with a null activity will be used, resulting in a "no activity" issue.
After analyzing the construction call stack of ReactInstanceManager, it appears that there is a race condition in the function of ReactNativeHost.getReactInstanceManager https://fburl.com/code/kh6o84m9.
I noticed that two threads are calling this function simultaneously, which can lead to the creation of two instances despite the `mReactInstanceManager == null check`, as it is not within a synchronized statement.
An example of one ReactNativeHost with multiple ReactInstanceManagers can be found at https://fburl.com/code/kh6o84m9.
{F1768111631}
The following are the call stack to create the ReactInstanceManagers, the line number may have slightly shift from the prod code because of debugging info.
P1490866855
P1490869412
## About this diff
Added synchronized lock to the checking of `mReactInstanceManager == null` and make mReactInstanceManager as volatile to avoid creating duplicated instance.
## Changelog:
[Android] [Fixed] - Made several methods in ReactNativeHost.java thread-safe to avoid race conditions
bypass-github-export-checks
Reviewed By: javache
Differential Revision: D60088120
fbshipit-source-id: a4c1970bb54c7395dbfc3282d02bd66d9dc95df9