tasks.configureEach { task -> // Make sure that we generate our prefab publication file only after having built the native library // so that not a header publication file, but a full configuration publication will be generated, which // will include the .so file def prefabConfigurePattern = ~/^prefab(.+)ConfigurePackage$/ def matcher = task.name =~ prefabConfigurePattern if (matcher.matches()) { def variantName = matcher[0][1] task.outputs.upToDateWhen { false } task.dependsOn("externalNativeBuild${variantName}") } } afterEvaluate { def abis = reactNativeArchitectures() rootProject.allprojects.each { proj -> if (proj === rootProject) return def dependsOnThisLib = proj.configurations.findAll { it.canBeResolved }.any { config -> config.dependencies.any { dep -> dep.group == project.group && dep.name == project.name } } if (!dependsOnThisLib && proj != project) return if (!proj.plugins.hasPlugin('com.android.application') && !proj.plugins.hasPlugin('com.android.library')) { return } def variants = proj.android.hasProperty('applicationVariants') ? proj.android.applicationVariants : proj.android.libraryVariants // Touch the prefab_config.json files to ensure that in ExternalNativeJsonGenerator.kt we will re-trigger the prefab CLI to // generate a libnameConfig.cmake file that will contain our native library (.so). // See this condition: https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ExternalNativeJsonGenerator.kt;l=207-219?q=createPrefabBuildSystemGlue variants.all { variant -> def variantName = variant.name abis.each { abi -> def searchDir = new File(proj.projectDir, ".cxx/${variantName}") if (!searchDir.exists()) return def matches = [] searchDir.eachDir { randomDir -> def prefabFile = new File(randomDir, "${abi}/prefab_config.json") if (prefabFile.exists()) matches << prefabFile } matches.each { prefabConfig -> prefabConfig.setLastModified(System.currentTimeMillis()) } } } } }