@@ -121,9 +121,12 @@ def jscFlavor = 'org.webkit:android-jsc:+'
121121def enableHermes = project. ext. react. get(" enableHermes" , false );
122122
123123/**
124- * Architectures to build native code for in debug .
124+ * Architectures to build native code for.
125125 */
126- def nativeArchitectures = project. getProperties(). get(" reactNativeDebugArchitectures" )
126+ def reactNativeArchitectures () {
127+ def value = project. getProperties(). get(" reactNativeArchitectures" )
128+ return value ? value. split(" ," ) : [" armeabi-v7a" , " x86" , " x86_64" , " arm64-v8a" ]
129+ }
127130
128131android {
129132 ndkVersion rootProject. ext. ndkVersion
@@ -134,15 +137,84 @@ android {
134137 applicationId " github.funnyzak.v2ex"
135138 minSdkVersion rootProject. ext. minSdkVersion
136139 targetSdkVersion rootProject. ext. targetSdkVersion
137- versionCode 30
138- versionName " 0.6.5"
140+ versionCode 31
141+ versionName " 0.6.6"
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 " rntest_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+ }
139210 }
211+
140212 splits {
141213 abi {
142214 reset()
143215 enable enableSeparateBuildPerCPUArchitecture
144216 universalApk false // If true, also generate a universal APK
145- include " armeabi-v7a " , " x86 " , " arm64-v8a " , " x86_64 "
217+ include ( * reactNativeArchitectures())
146218 }
147219 }
148220 signingConfigs {
@@ -165,11 +237,6 @@ android {
165237 buildTypes {
166238 debug {
167239 signingConfig signingConfigs. debug
168- if (nativeArchitectures) {
169- ndk {
170- abiFilters nativeArchitectures. split(' ,' )
171- }
172- }
173240 }
174241 release {
175242 // Caution! In production, you need to generate your own keystore file.
@@ -218,14 +285,31 @@ dependencies {
218285 }
219286
220287 if (enableHermes) {
221- def hermesPath = " ../../node_modules/hermes-engine/android/" ;
222- debugImplementation files(hermesPath + " hermes-debug.aar" )
223- releaseImplementation files(hermesPath + " hermes-release.aar" )
288+ // noinspection GradleDynamicVersion
289+ implementation(" com.facebook.react:hermes-engine:+" ) { // From node_modules
290+ exclude group :' com.facebook.fbjni'
291+ }
224292 } else {
225293 implementation jscFlavor
226294 }
227295}
228296
297+ if (isNewArchitectureEnabled()) {
298+ // If new architecture is enabled, we let you build RN from source
299+ // Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
300+ // This will be applied to all the imported transtitive dependency.
301+ configurations. all {
302+ resolutionStrategy. dependencySubstitution {
303+ substitute(module(" com.facebook.react:react-native" ))
304+ .using(project(" :ReactAndroid" ))
305+ .because(" On New Architecture we're building React Native from source" )
306+ substitute(module(" com.facebook.react:hermes-engine" ))
307+ .using(project(" :ReactAndroid:hermes-engine" ))
308+ .because(" On New Architecture we're building Hermes from source" )
309+ }
310+ }
311+ }
312+
229313// Run this once to be able to run the application with BUCK
230314// puts all compile dependencies into folder libs for BUCK to use
231315task copyDownloadableDepsToLibs (type : Copy ) {
@@ -234,3 +318,11 @@ task copyDownloadableDepsToLibs(type: Copy) {
234318}
235319
236320apply from : file(" ../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle" ); applyNativeModulesAppBuildGradle(project)
321+
322+ def isNewArchitectureEnabled () {
323+ // To opt-in for the New Architecture, you can either:
324+ // - Set `newArchEnabled` to true inside the `gradle.properties` file
325+ // - Invoke gradle with `-newArchEnabled=true`
326+ // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
327+ return project. hasProperty(" newArchEnabled" ) && project. newArchEnabled == " true"
328+ }
0 commit comments