@@ -114,13 +114,23 @@ def jscFlavor = 'org.webkit:android-jsc:+'
114
114
/**
115
115
* Whether to enable the Hermes VM.
116
116
*
117
- * This should be set on project.ext.react and mirrored here. If it is not set
117
+ * This should be set on project.ext.react and that value will be read here. If it is not set
118
118
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
119
119
* and the benefits of using Hermes will therefore be sharply reduced.
120
120
*/
121
121
def enableHermes = project. ext. react. get(" enableHermes" , false );
122
122
123
+ /**
124
+ * Architectures to build native code for.
125
+ */
126
+ def reactNativeArchitectures () {
127
+ def value = project. getProperties(). get(" reactNativeArchitectures" )
128
+ return value ? value. split(" ," ) : [" armeabi-v7a" , " x86" , " x86_64" , " arm64-v8a" ]
129
+ }
130
+
123
131
android {
132
+ ndkVersion rootProject. ext. ndkVersion
133
+
124
134
compileSdkVersion rootProject. ext. compileSdkVersion
125
135
126
136
defaultConfig {
@@ -129,13 +139,82 @@ android {
129
139
targetSdkVersion rootProject. ext. targetSdkVersion
130
140
versionCode 1
131
141
versionName " 1.0"
142
+ buildConfigField " boolean" , " IS_NEW_ARCHITECTURE_ENABLED" , isNewArchitectureEnabled(). toString()
143
+
144
+ if (isNewArchitectureEnabled()) {
145
+ // We configure the NDK build only if you decide to opt-in for the New Architecture.
146
+ externalNativeBuild {
147
+ ndkBuild {
148
+ arguments " APP_PLATFORM=android-21" ,
149
+ " APP_STL=c++_shared" ,
150
+ " NDK_TOOLCHAIN_VERSION=clang" ,
151
+ " GENERATED_SRC_DIR=$buildDir /generated/source" ,
152
+ " PROJECT_BUILD_DIR=$buildDir " ,
153
+ " REACT_ANDROID_DIR=$rootDir /../node_modules/react-native/ReactAndroid" ,
154
+ " REACT_ANDROID_BUILD_DIR=$rootDir /../node_modules/react-native/ReactAndroid/build" ,
155
+ " NODE_MODULES_DIR=$rootDir /../node_modules"
156
+ cFlags " -Wall" , " -Werror" , " -fexceptions" , " -frtti" , " -DWITH_INSPECTOR=1"
157
+ cppFlags " -std=c++17"
158
+ // Make sure this target name is the same you specify inside the
159
+ // src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
160
+ targets " example_appmodules"
161
+ }
162
+ }
163
+ if (! enableSeparateBuildPerCPUArchitecture) {
164
+ ndk {
165
+ abiFilters (* reactNativeArchitectures())
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+ if (isNewArchitectureEnabled()) {
172
+ // We configure the NDK build only if you decide to opt-in for the New Architecture.
173
+ externalNativeBuild {
174
+ ndkBuild {
175
+ path " $projectDir /src/main/jni/Android.mk"
176
+ }
177
+ }
178
+ def reactAndroidProjectDir = project(' :ReactAndroid' ). projectDir
179
+ def packageReactNdkDebugLibs = tasks. register(" packageReactNdkDebugLibs" , Copy ) {
180
+ dependsOn(" :ReactAndroid:packageReactNdkDebugLibsForBuck" )
181
+ from(" $reactAndroidProjectDir /src/main/jni/prebuilt/lib" )
182
+ into(" $buildDir /react-ndk/exported" )
183
+ }
184
+ def packageReactNdkReleaseLibs = tasks. register(" packageReactNdkReleaseLibs" , Copy ) {
185
+ dependsOn(" :ReactAndroid:packageReactNdkReleaseLibsForBuck" )
186
+ from(" $reactAndroidProjectDir /src/main/jni/prebuilt/lib" )
187
+ into(" $buildDir /react-ndk/exported" )
188
+ }
189
+ afterEvaluate {
190
+ // If you wish to add a custom TurboModule or component locally,
191
+ // you should uncomment this line.
192
+ // preBuild.dependsOn("generateCodegenArtifactsFromSchema")
193
+ preDebugBuild. dependsOn(packageReactNdkDebugLibs)
194
+ preReleaseBuild. dependsOn(packageReactNdkReleaseLibs)
195
+
196
+ // Due to a bug inside AGP, we have to explicitly set a dependency
197
+ // between configureNdkBuild* tasks and the preBuild tasks.
198
+ // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
199
+ configureNdkBuildRelease. dependsOn(preReleaseBuild)
200
+ configureNdkBuildDebug. dependsOn(preDebugBuild)
201
+ reactNativeArchitectures(). each { architecture ->
202
+ tasks. findByName(" configureNdkBuildDebug[${ architecture} ]" )?. configure {
203
+ dependsOn(" preDebugBuild" )
204
+ }
205
+ tasks. findByName(" configureNdkBuildRelease[${ architecture} ]" )?. configure {
206
+ dependsOn(" preReleaseBuild" )
207
+ }
208
+ }
209
+ }
132
210
}
211
+
133
212
splits {
134
213
abi {
135
214
reset()
136
215
enable enableSeparateBuildPerCPUArchitecture
137
216
universalApk false // If true, also generate a universal APK
138
- include " armeabi-v7a " , " x86 " , " arm64-v8a " , " x86_64 "
217
+ include ( * reactNativeArchitectures())
139
218
}
140
219
}
141
220
signingConfigs {
@@ -164,11 +243,12 @@ android {
164
243
variant. outputs. each { output ->
165
244
// For each separate APK per architecture, set a unique version code as described here:
166
245
// https://developer.android.com/studio/build/configure-apk-splits.html
246
+ // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
167
247
def versionCodes = [" armeabi-v7a" : 1 , " x86" : 2 , " arm64-v8a" : 3 , " x86_64" : 4 ]
168
248
def abi = output. getFilter(OutputFile . ABI )
169
249
if (abi != null ) { // null for the universal-debug, universal-release variants
170
250
output. versionCodeOverride =
171
- versionCodes . get(abi) * 1048576 + defaultConfig . versionCode
251
+ defaultConfig . versionCode * 1000 + versionCodes . get(abi)
172
252
}
173
253
174
254
}
@@ -177,15 +257,14 @@ android {
177
257
178
258
dependencies {
179
259
implementation fileTree(dir : " libs" , include : [" *.jar" ])
260
+
180
261
// noinspection GradleDynamicVersion
181
262
implementation " com.facebook.react:react-native:+" // From node_modules
182
263
183
- implementation project (" :react-native-maps" )
184
-
185
264
implementation " androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
186
265
187
266
debugImplementation(" com.facebook.flipper:flipper:${ FLIPPER_VERSION} " ) {
188
- exclude group :' com.facebook.fbjni'
267
+ exclude group :' com.facebook.fbjni'
189
268
}
190
269
191
270
debugImplementation(" com.facebook.flipper:flipper-network-plugin:${ FLIPPER_VERSION} " ) {
@@ -198,14 +277,31 @@ dependencies {
198
277
}
199
278
200
279
if (enableHermes) {
201
- def hermesPath = " ../../node_modules/hermes-engine/android/" ;
202
- debugImplementation files(hermesPath + " hermes-debug.aar" )
203
- releaseImplementation files(hermesPath + " hermes-release.aar" )
280
+ // noinspection GradleDynamicVersion
281
+ implementation(" com.facebook.react:hermes-engine:+" ) { // From node_modules
282
+ exclude group :' com.facebook.fbjni'
283
+ }
204
284
} else {
205
285
implementation jscFlavor
206
286
}
207
287
}
208
288
289
+ if (isNewArchitectureEnabled()) {
290
+ // If new architecture is enabled, we let you build RN from source
291
+ // Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
292
+ // This will be applied to all the imported transtitive dependency.
293
+ configurations. all {
294
+ resolutionStrategy. dependencySubstitution {
295
+ substitute(module(" com.facebook.react:react-native" ))
296
+ .using(project(" :ReactAndroid" ))
297
+ .because(" On New Architecture we're building React Native from source" )
298
+ substitute(module(" com.facebook.react:hermes-engine" ))
299
+ .using(project(" :ReactAndroid:hermes-engine" ))
300
+ .because(" On New Architecture we're building Hermes from source" )
301
+ }
302
+ }
303
+ }
304
+
209
305
// Run this once to be able to run the application with BUCK
210
306
// puts all compile dependencies into folder libs for BUCK to use
211
307
task copyDownloadableDepsToLibs (type : Copy ) {
@@ -214,3 +310,11 @@ task copyDownloadableDepsToLibs(type: Copy) {
214
310
}
215
311
216
312
apply from : file(" ../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle" ); applyNativeModulesAppBuildGradle(project)
313
+
314
+ def isNewArchitectureEnabled () {
315
+ // To opt-in for the New Architecture, you can either:
316
+ // - Set `newArchEnabled` to true inside the `gradle.properties` file
317
+ // - Invoke gradle with `-newArchEnabled=true`
318
+ // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
319
+ return project. hasProperty(" newArchEnabled" ) && project. newArchEnabled == " true"
320
+ }
0 commit comments