diff --git a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/plugin/RNSourceSets.kt b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/plugin/RNSourceSets.kt index 9e5de002..8b12ffda 100644 --- a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/plugin/RNSourceSets.kt +++ b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/plugin/RNSourceSets.kt @@ -96,7 +96,6 @@ object RNSourceSets { } private fun configureTasks() { - val projectName = project.name val appProjectName = appProject.name project.tasks.register("copyAutolinkingSources", Copy::class.java) { @@ -108,33 +107,19 @@ object RNSourceSets { patchRNEntryPoint(it, path) } - androidExtension.buildTypes.forEach { buildType -> - val capitalisedBuildType = buildType.name.replaceFirstChar { it.titlecase() } - val codegenTaskName = "generateCodegenSchemaFromJavaScript" - val strippedNativeLibsPath = "$appBuildDir/intermediates/stripped_native_libs" - val strippedDebugSymbolsPath = "strip${capitalisedBuildType}DebugSymbols/out/lib" - - val copyLibTask = - project.tasks.register("copy${capitalisedBuildType}LibSources", Copy::class.java) { - it.dependsOn(":$appProjectName:$codegenTaskName") - it.dependsOn(":$appProjectName:strip${capitalisedBuildType}DebugSymbols") - it.dependsOn(":$projectName:$codegenTaskName") - - it.from( - "$strippedNativeLibsPath/${buildType.name}/$strippedDebugSymbolsPath", - ) - it.into(project.rootProject.file("$projectName/libs$capitalisedBuildType")) - it.include("**/libappmodules.so", "**/libreact_codegen_*.so") - extension.dynamicLibs.forEach { lib -> it.include("**/$lib") } - } - - project.tasks.named("preBuild").configure { - it.dependsOn("copyAutolinkingSources") - it.dependsOn(copyLibTask) - if (capitalisedBuildType == "Release") { - it.dependsOn(":${appProject.name}:createBundleReleaseJsAndAssets") - } - } + project.tasks.named("preBuild").configure { + /** + * Ensure auto-generated sources are available before compilation. + * + * This hooks into the global `preBuild` task, so the dependency runs + * regardless of build variant. Use this only when the generated sources + * are identical for all variants (debug/release). + * + * If variant-specific + * files are needed, prefer `preDebugBuild` / `preReleaseBuild` under + * `VariantProcessor.processVariant` + */ + it.dependsOn("copyAutolinkingSources") } } } diff --git a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/JNILibsProcessor.kt b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/JNILibsProcessor.kt index a4bbcfba..d398d3e7 100644 --- a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/JNILibsProcessor.kt +++ b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/JNILibsProcessor.kt @@ -16,7 +16,10 @@ import com.callstack.react.brownfield.exceptions.TaskNotFound import com.callstack.react.brownfield.shared.BaseProject import com.callstack.react.brownfield.shared.Logging import com.callstack.react.brownfield.utils.AndroidArchiveLibrary +import com.callstack.react.brownfield.utils.Extension import org.gradle.api.Task +import org.gradle.api.tasks.Copy +import org.gradle.api.tasks.TaskProvider import java.io.File class JNILibsProcessor : BaseProject() { @@ -34,8 +37,11 @@ class JNILibsProcessor : BaseProject() { } val androidExtension = project.extensions.getByName("android") as LibraryExtension + val copyTask = copySoLibsTask(variant) + mergeJniLibsTask.configure { it.dependsOn(explodeTasks) + it.dependsOn(copyTask) it.doFirst { for (archiveLibrary in aarLibraries) { @@ -50,6 +56,36 @@ class JNILibsProcessor : BaseProject() { } } + private fun copySoLibsTask(variant: LibraryVariant): TaskProvider { + val variantName = variant.name + val capitalizedVariant = variantName.replaceFirstChar(Char::titlecase) + + val projectExt = project.extensions.getByType(Extension::class.java) + val appProject = project.rootProject.project(projectExt.appProjectName) + val appBuildDir = appProject.layout.buildDirectory.get() + + val stripTask = ":${appProject.name}:strip${capitalizedVariant}DebugSymbols" + val codegenTask = ":${project.name}:generateCodegenSchemaFromJavaScript" + + val fromDir = + appBuildDir + .dir("intermediates/stripped_native_libs/$variantName/strip${capitalizedVariant}DebugSymbols/out/lib") + .asFile + + val intoDir = + project.rootProject + .file("${project.name}/libs$capitalizedVariant") + + return project.tasks.register("copy${capitalizedVariant}LibSources", Copy::class.java) { + it.dependsOn(stripTask, codegenTask) + it.from(fromDir) + it.into(intoDir) + + it.include("**/libappmodules.so", "**/libreact_codegen_*.so") + projectExt.dynamicLibs.forEach { lib -> it.include("**/$lib") } + } + } + private fun processNestedLibs(files: Array?) { val existingJNILibs = listOf("arm64-v8a", "armeabi-v7a", "x86_64", "x86") diff --git a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/VariantProcessor.kt b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/VariantProcessor.kt index b7e868c0..2dbf859c 100644 --- a/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/VariantProcessor.kt +++ b/gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/processors/VariantProcessor.kt @@ -11,6 +11,7 @@ package com.callstack.react.brownfield.processors import com.android.build.gradle.api.LibraryVariant +import com.android.build.gradle.internal.tasks.factory.dependsOn import com.callstack.react.brownfield.artifacts.ArtifactsResolver.Companion.ARTIFACT_TYPE_AAR import com.callstack.react.brownfield.artifacts.ArtifactsResolver.Companion.ARTIFACT_TYPE_JAR import com.callstack.react.brownfield.exceptions.TaskNotFound @@ -54,6 +55,10 @@ class VariantProcessor(private val variant: LibraryVariant) : BaseProject() { throw TaskNotFound("Can not find $preBuildTaskPath task") } + if (upperCaseVariantName == "Release") { + prepareTask.dependsOn(":app:createBundleReleaseJsAndAssets") + } + val bundleTask = variantTaskProvider.bundleTaskProvider(project, variant.name) explodeArtifactFiles(artifacts, prepareTask, bundleTask) mergeClassesAndJars(bundleTask)