Skip to content

Commit 8dddde4

Browse files
cortinicomdvaccarozele
authored
[0.82] Ensure legacy architecture can't be initialized (#53843)
* Ensure legacy architecture can't be initialized in Android (#53806) Summary: Pull Request resolved: #53806 The Legacy architecture of React Native is not supported anymore, let's ensure nobody can initialize it anymore changelog: [internal] internal Reviewed By: cortinico Differential Revision: D82465004 fbshipit-source-id: 099764fb59d906b11cf6ad0cc6208f56df029d19 * Runtime check that NewArchitecture is enabled in DefaultNewArchitectureEntryPoint (#53780) Summary: Pull Request resolved: #53780 This is a commit we're going to pick in 0.82 as we want to make sure users cannot invoke `load()` from `DefaultNewArchitectureEntryPoint` with flags that are not true,true,true. Changelog: [Android] [Changed] - Runtime check that NewArchitecture is enabled in DefaultNewArchitectureEntryPoint Reviewed By: mdvacca Differential Revision: D82456975 fbshipit-source-id: 749996a3491913cfe400173608218077c3ffbc10 * Fix DefaultNewArchitectureEntryPoint config validation (#53807) Summary: Pull Request resolved: #53807 We need to read the values off feature flags before checking them. ## Changelog [Internal] Reviewed By: javache Differential Revision: D82572898 fbshipit-source-id: 09fbc09570c78b41d9c25fb03c5557e390da7cae * Fix incorrect validation of feature flags in DefaultNewArchitectureEntryPoint.loadWithFeatureFlags() method (#53863) Summary: Pull Request resolved: #53863 In this diff I'm fixing an incorrect validation of feature flags in DefaultNewArchitectureEntryPoint.loadWithFeatureFlags() method. changelog: [internal] internal Reviewed By: cortinico Differential Revision: D82841006 fbshipit-source-id: 6f50f2475255d7b841d9224bc8808119dcc68aec --------- Co-authored-by: David Vacca <dvacca@meta.com> Co-authored-by: Eric Rozell <ericroz@meta.com>
1 parent 3a0a736 commit 8dddde4

3 files changed

Lines changed: 52 additions & 20 deletions

File tree

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,15 @@ public void invokeDefaultOnBackPressed() {
328328
}
329329

330330
registerCxxErrorHandlerFunc();
331+
332+
// Using `if (true)` just to prevent tests / lint errors.
333+
if (true) {
334+
// Legacy architecture of React Native is deprecated and can't be initialized anymore.
335+
// More details on:
336+
// https://github.com/react-native-community/discussions-and-proposals/blob/nc/legacy-arch-removal/proposals/0929-legacy-architecture-removal.md
337+
throw new UnsupportedOperationException(
338+
"ReactInstanceManager.createReactContext is unsupported.");
339+
}
331340
}
332341

333342
private ReactInstanceDevHelper createDevHelperInterface() {
@@ -1446,6 +1455,7 @@ private void tearDownReactContext(ReactContext reactContext) {
14461455
*/
14471456
private ReactApplicationContext createReactContext(
14481457
JavaScriptExecutor jsExecutor, JSBundleLoader jsBundleLoader) {
1458+
14491459
FLog.d(ReactConstants.TAG, "ReactInstanceManager.createReactContext()");
14501460
ReactMarker.logMarker(CREATE_REACT_CONTEXT_START, jsExecutor.getName());
14511461

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ public object DefaultNewArchitectureEntryPoint {
125125
privateConcurrentReactEnabled = featureFlags.enableFabricRenderer()
126126
privateBridgelessEnabled = featureFlags.enableBridgelessArchitecture()
127127

128+
val (isValid, errorMessage) =
129+
isConfigurationValid(
130+
privateTurboModulesEnabled,
131+
privateFabricEnabled,
132+
privateBridgelessEnabled,
133+
)
134+
if (!isValid) {
135+
error(errorMessage)
136+
}
137+
128138
DefaultSoLoader.maybeLoadSoLibrary()
129139
}
130140

@@ -158,13 +168,13 @@ public object DefaultNewArchitectureEntryPoint {
158168
fabricEnabled: Boolean,
159169
bridgelessEnabled: Boolean,
160170
): Pair<Boolean, String> =
161-
when {
162-
fabricEnabled && !turboModulesEnabled ->
163-
false to
164-
"fabricEnabled=true requires turboModulesEnabled=true (is now false) - Please update your DefaultNewArchitectureEntryPoint.load() parameters."
165-
bridgelessEnabled && (!turboModulesEnabled || !fabricEnabled) ->
166-
false to
167-
"bridgelessEnabled=true requires (turboModulesEnabled=true AND fabricEnabled=true) - Please update your DefaultNewArchitectureEntryPoint.load() parameters."
168-
else -> true to ""
171+
if (!turboModulesEnabled || !fabricEnabled || !bridgelessEnabled) {
172+
false to
173+
"You cannot load React Native with the New Architecture disabled. " +
174+
"Please use DefaultNewArchitectureEntryPoint.load() instead of " +
175+
"DefaultNewArchitectureEntryPoint.load(turboModulesEnabled=$turboModulesEnabled, " +
176+
"fabricEnabled=$fabricEnabled, bridgelessEnabled=$bridgelessEnabled)"
177+
} else {
178+
true to ""
169179
}
170180
}

packages/react-native/ReactAndroid/src/test/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPointTest.kt

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,48 @@ import org.junit.Test
1313
class DefaultNewArchitectureEntryPointTest {
1414

1515
@Test
16-
fun isConfigurationValid_withEverythingOff_returnsTrue() {
17-
val (isValid, _) =
16+
fun isConfigurationValid_withEverythingOff_returnsFalse() {
17+
val (isValid, errorMessage) =
1818
DefaultNewArchitectureEntryPoint.isConfigurationValid(
1919
turboModulesEnabled = false,
2020
fabricEnabled = false,
2121
bridgelessEnabled = false,
2222
)
23-
assertThat(isValid).isTrue()
23+
assertThat(isValid).isFalse()
24+
assertThat(errorMessage)
25+
.isEqualTo(
26+
"You cannot load React Native with the New Architecture disabled. Please use DefaultNewArchitectureEntryPoint.load() instead of DefaultNewArchitectureEntryPoint.load(turboModulesEnabled=false, fabricEnabled=false, bridgelessEnabled=false)"
27+
)
2428
}
2529

2630
@Test
27-
fun isConfigurationValid_withNewArchOn_returnsTrue() {
28-
val (isValid, _) =
31+
fun isConfigurationValid_withNewArchOnlyOn_returnsFalse() {
32+
val (isValid, errorMessage) =
2933
DefaultNewArchitectureEntryPoint.isConfigurationValid(
3034
turboModulesEnabled = true,
3135
fabricEnabled = true,
3236
bridgelessEnabled = false,
3337
)
34-
assertThat(isValid).isTrue()
38+
assertThat(isValid).isFalse()
39+
assertThat(errorMessage)
40+
.isEqualTo(
41+
"You cannot load React Native with the New Architecture disabled. Please use DefaultNewArchitectureEntryPoint.load() instead of DefaultNewArchitectureEntryPoint.load(turboModulesEnabled=true, fabricEnabled=true, bridgelessEnabled=false)"
42+
)
3543
}
3644

3745
@Test
38-
fun isConfigurationValid_withTurboModulesOnlyOn_returnsTrue() {
39-
val (isValid, _) =
46+
fun isConfigurationValid_withTurboModulesOnlyOn_returnsFalse() {
47+
val (isValid, errorMessage) =
4048
DefaultNewArchitectureEntryPoint.isConfigurationValid(
4149
turboModulesEnabled = true,
4250
fabricEnabled = false,
4351
bridgelessEnabled = false,
4452
)
45-
assertThat(isValid).isTrue()
53+
assertThat(isValid).isFalse()
54+
assertThat(errorMessage)
55+
.isEqualTo(
56+
"You cannot load React Native with the New Architecture disabled. Please use DefaultNewArchitectureEntryPoint.load() instead of DefaultNewArchitectureEntryPoint.load(turboModulesEnabled=true, fabricEnabled=false, bridgelessEnabled=false)"
57+
)
4658
}
4759

4860
@Test
@@ -67,7 +79,7 @@ class DefaultNewArchitectureEntryPointTest {
6779
assertThat(isValid).isFalse()
6880
assertThat(errorMessage)
6981
.isEqualTo(
70-
"fabricEnabled=true requires turboModulesEnabled=true (is now false) - Please update your DefaultNewArchitectureEntryPoint.load() parameters."
82+
"You cannot load React Native with the New Architecture disabled. Please use DefaultNewArchitectureEntryPoint.load() instead of DefaultNewArchitectureEntryPoint.load(turboModulesEnabled=false, fabricEnabled=true, bridgelessEnabled=false)"
7183
)
7284
}
7385

@@ -82,7 +94,7 @@ class DefaultNewArchitectureEntryPointTest {
8294
assertThat(isValid).isFalse()
8395
assertThat(errorMessage)
8496
.isEqualTo(
85-
"fabricEnabled=true requires turboModulesEnabled=true (is now false) - Please update your DefaultNewArchitectureEntryPoint.load() parameters."
97+
"You cannot load React Native with the New Architecture disabled. Please use DefaultNewArchitectureEntryPoint.load() instead of DefaultNewArchitectureEntryPoint.load(turboModulesEnabled=false, fabricEnabled=true, bridgelessEnabled=true)"
8698
)
8799
}
88100

@@ -97,7 +109,7 @@ class DefaultNewArchitectureEntryPointTest {
97109
assertThat(isValid).isFalse()
98110
assertThat(errorMessage)
99111
.isEqualTo(
100-
"bridgelessEnabled=true requires (turboModulesEnabled=true AND fabricEnabled=true) - Please update your DefaultNewArchitectureEntryPoint.load() parameters."
112+
"You cannot load React Native with the New Architecture disabled. Please use DefaultNewArchitectureEntryPoint.load() instead of DefaultNewArchitectureEntryPoint.load(turboModulesEnabled=true, fabricEnabled=false, bridgelessEnabled=true)"
101113
)
102114
}
103115
}

0 commit comments

Comments
 (0)