mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 01:25:39 +00:00
c0316c695d
Summary: This PR tries to fix a minor bug in `react.gradle` due to which task that bundles JS into the assets folder of the APK is not run when separate build per CPU architecture is enabled and we are using different product flavors. Closes https://github.com/facebook/react-native/pull/8675 Differential Revision: D3541348 fbshipit-source-id: 4c84f21a06a45046f84bdd8ae5c5d834ec080476
104 lines
4.8 KiB
Groovy
104 lines
4.8 KiB
Groovy
import org.apache.tools.ant.taskdefs.condition.Os
|
|
|
|
def config = project.hasProperty("react") ? project.react : [];
|
|
|
|
def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
|
|
def entryFile = config.entryFile ?: "index.android.js"
|
|
|
|
// because elvis operator
|
|
def elvisFile(thing) {
|
|
return thing ? file(thing) : null;
|
|
}
|
|
|
|
def reactRoot = elvisFile(config.root) ?: file("../../")
|
|
def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
|
|
|
|
void runBefore(String dependentTaskName, Task task) {
|
|
Task dependentTask = tasks.findByPath(dependentTaskName);
|
|
if (dependentTask != null) {
|
|
dependentTask.dependsOn task
|
|
}
|
|
}
|
|
|
|
gradle.projectsEvaluated {
|
|
// Grab all build types and product flavors
|
|
def buildTypes = android.buildTypes.collect { type -> type.name }
|
|
def productFlavors = android.productFlavors.collect { flavor -> flavor.name }
|
|
|
|
// When no product flavors defined, use empty
|
|
if (!productFlavors) productFlavors.add('')
|
|
|
|
productFlavors.each { productFlavorName ->
|
|
buildTypes.each { buildTypeName ->
|
|
// Create variant and target names
|
|
def flavorNameCapitalized = "${productFlavorName.capitalize()}"
|
|
def buildNameCapitalized = "${buildTypeName.capitalize()}"
|
|
def targetName = "${flavorNameCapitalized}${buildNameCapitalized}"
|
|
def targetPath = productFlavorName ?
|
|
"${productFlavorName}/${buildTypeName}" :
|
|
"${buildTypeName}"
|
|
|
|
// React js bundle directories
|
|
def jsBundleDirConfigName = "jsBundleDir${targetName}"
|
|
def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?:
|
|
file("$buildDir/intermediates/assets/${targetPath}")
|
|
|
|
def resourcesDirConfigName = "resourcesDir${targetName}"
|
|
def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?:
|
|
file("$buildDir/intermediates/res/merged/${targetPath}")
|
|
def jsBundleFile = file("$jsBundleDir/$bundleAssetName")
|
|
|
|
// Bundle task name for variant
|
|
def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets"
|
|
|
|
// Additional node and packager commandline arguments
|
|
def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
|
|
def extraPackagerArgs = config.extraPackagerArgs ?: []
|
|
|
|
def currentBundleTask = tasks.create(
|
|
name: bundleJsAndAssetsTaskName,
|
|
type: Exec) {
|
|
group = "react"
|
|
description = "bundle JS and assets for ${targetName}."
|
|
|
|
// Create dirs if they are not there (e.g. the "clean" task just ran)
|
|
doFirst {
|
|
jsBundleDir.mkdirs()
|
|
resourcesDir.mkdirs()
|
|
}
|
|
|
|
// Set up inputs and outputs so gradle can cache the result
|
|
inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
|
|
outputs.dir jsBundleDir
|
|
outputs.dir resourcesDir
|
|
|
|
// Set up the call to the react-native cli
|
|
workingDir reactRoot
|
|
|
|
// Set up dev mode
|
|
def devEnabled = !targetName.toLowerCase().contains("release")
|
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
|
commandLine("cmd", "/c", *nodeExecutableAndArgs, "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}",
|
|
"--reset-cache", "true", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs)
|
|
} else {
|
|
commandLine(*nodeExecutableAndArgs, "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}",
|
|
"--reset-cache", "true", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs)
|
|
}
|
|
|
|
enabled config."bundleIn${targetName}" ||
|
|
config."bundleIn${buildTypeName.capitalize()}" ?:
|
|
targetName.toLowerCase().contains("release")
|
|
}
|
|
|
|
// Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process
|
|
currentBundleTask.dependsOn("merge${targetName}Resources")
|
|
currentBundleTask.dependsOn("merge${targetName}Assets")
|
|
|
|
runBefore("process${flavorNameCapitalized}Armeabi-v7a${buildNameCapitalized}Resources", currentBundleTask)
|
|
runBefore("process${flavorNameCapitalized}X86${buildNameCapitalized}Resources", currentBundleTask)
|
|
runBefore("processUniversal${targetName}Resources", currentBundleTask)
|
|
runBefore("process${targetName}Resources", currentBundleTask)
|
|
}
|
|
}
|
|
}
|