From 7d2f48c97d0dce602fc7fa06546060f4aa3aef17 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Thu, 6 Oct 2022 09:13:12 -0700 Subject: [PATCH] Let RNGP set buildConfigFields for New Architecture and Hermes Summary: This diff further simplifies the New App Template by removing the buildConfigFields for both Hermes and New Architecture with the React Native Gradle Plugin. Changelog: [Android] [Changed] - Let RNGP set buildConfigFields for New Architecture and Hermes Reviewed By: cipolleschi Differential Revision: D40139559 fbshipit-source-id: 202b6ac9c4c036a026a2ff3e8279087ffd363eaa --- .../kotlin/com/facebook/react/ReactPlugin.kt | 2 + .../react/utils/AgpConfiguratorUtils.kt | 32 ++++++++++ .../com/facebook/react/utils/ProjectUtils.kt | 18 ++++++ .../facebook/react/utils/ProjectUtilsTest.kt | 59 +++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt index ab24aa43a4..0c0f47132c 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt @@ -15,6 +15,7 @@ import com.android.build.gradle.internal.tasks.factory.dependsOn import com.facebook.react.tasks.BuildCodegenCLITask import com.facebook.react.tasks.GenerateCodegenArtifactsTask import com.facebook.react.tasks.GenerateCodegenSchemaTask +import com.facebook.react.utils.AgpConfiguratorUtils.configureBuildConfigFields import com.facebook.react.utils.JsonUtils import com.facebook.react.utils.NdkConfiguratorUtils.configureReactNativeNdk import com.facebook.react.utils.findPackageJsonFile @@ -55,6 +56,7 @@ class ReactPlugin : Plugin { private fun applyAppPlugin(project: Project, config: ReactExtension) { configureReactNativeNdk(project, config) + configureBuildConfigFields(project) project.afterEvaluate { if (config.applyAppPlugin.getOrElse(false)) { val androidConfiguration = project.extensions.getByType(BaseExtension::class.java) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt new file mode 100644 index 0000000000..541338c847 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/AgpConfiguratorUtils.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.utils + +import com.android.build.api.variant.AndroidComponentsExtension +import com.facebook.react.utils.ProjectUtils.isHermesEnabled +import com.facebook.react.utils.ProjectUtils.isNewArchEnabled +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.api.plugins.AppliedPlugin + +internal object AgpConfiguratorUtils { + @Suppress("UnstableApiUsage") + fun configureBuildConfigFields(project: Project) { + val action = + Action { + project.extensions.getByType(AndroidComponentsExtension::class.java).finalizeDsl { ext -> + ext.defaultConfig.buildConfigField( + "boolean", "IS_NEW_ARCHITECTURE_ENABLED", project.isNewArchEnabled.toString()) + ext.defaultConfig.buildConfigField( + "boolean", "IS_HERMES_ENABLED", project.isHermesEnabled.toString()) + } + } + project.pluginManager.withPlugin("com.android.application", action) + project.pluginManager.withPlugin("com.android.library", action) + } +} diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt index 2a4a51467b..17a0982ad8 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/ProjectUtils.kt @@ -14,4 +14,22 @@ internal object ProjectUtils { get() = project.hasProperty("newArchEnabled") && project.property("newArchEnabled").toString().toBoolean() + + const val HERMES_FALLBACK = true + + internal val Project.isHermesEnabled: Boolean + get() = + if (project.hasProperty("enableHermes")) { + project.property("enableHermes").toString().lowercase().toBooleanStrictOrNull() ?: true + } else if (project.extensions.extraProperties.has("react")) { + @Suppress("UNCHECKED_CAST") + val reactMap = project.extensions.extraProperties.get("react") as? Map + when (val enableHermesKey = reactMap?.get("enableHermes")) { + is Boolean -> enableHermesKey + is String -> enableHermesKey.lowercase().toBooleanStrictOrNull() ?: true + else -> HERMES_FALLBACK + } + } else { + HERMES_FALLBACK + } } diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt index 8b86ba56bb..495715416f 100644 --- a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/utils/ProjectUtilsTest.kt @@ -8,6 +8,7 @@ package com.facebook.react.utils import com.facebook.react.tests.createProject +import com.facebook.react.utils.ProjectUtils.isHermesEnabled import com.facebook.react.utils.ProjectUtils.isNewArchEnabled import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -40,4 +41,62 @@ class ProjectUtilsTest { project.extensions.extraProperties.set("newArchEnabled", "¯\\_(ツ)_/¯") assertFalse(project.isNewArchEnabled) } + + @Test + fun isHermesEnabled_returnsTrueByDefault() { + assertTrue(createProject().isHermesEnabled) + } + + @Test + fun isNewArchEnabled_withDisabledViaProperty_returnsFalse() { + val project = createProject() + project.extensions.extraProperties.set("enableHermes", "false") + assertFalse(project.isHermesEnabled) + } + + @Test + fun isHermesEnabled_withEnabledViaProperty_returnsTrue() { + val project = createProject() + project.extensions.extraProperties.set("enableHermes", "true") + assertTrue(project.isHermesEnabled) + } + + @Test + fun isHermesEnabled_withInvalidViaProperty_returnsTrue() { + val project = createProject() + project.extensions.extraProperties.set("enableHermes", "¯\\_(ツ)_/¯") + assertTrue(project.isHermesEnabled) + } + + @Test + fun isHermesEnabled_withDisabledViaExt_returnsFalse() { + val project = createProject() + val extMap = mapOf("enableHermes" to false) + project.extensions.extraProperties.set("react", extMap) + assertFalse(project.isHermesEnabled) + } + + @Test + fun isHermesEnabled_withEnabledViaExt_returnsTrue() { + val project = createProject() + val extMap = mapOf("enableHermes" to true) + project.extensions.extraProperties.set("react", extMap) + assertTrue(project.isHermesEnabled) + } + + @Test + fun isHermesEnabled_withDisabledViaExtAsString_returnsFalse() { + val project = createProject() + val extMap = mapOf("enableHermes" to "false") + project.extensions.extraProperties.set("react", extMap) + assertFalse(project.isHermesEnabled) + } + + @Test + fun isHermesEnabled_withInvalidViaExt_returnsTrue() { + val project = createProject() + val extMap = mapOf("enableHermes" to "¯\\_(ツ)_/¯") + project.extensions.extraProperties.set("react", extMap) + assertTrue(project.isHermesEnabled) + } }