Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
6.0 kB
3
Indexable
Never
// Adapted from https://raw.githubusercontent.com/facebook/react-native/d16ff3bd8b92fa84a9007bf5ebedd8153e4c089d/react.gradle

import java.nio.file.Paths;
def config = project.extensions.findByName("react") ?: [:]
def bundleAssetName = config.bundleAssetName ? config.bundleAssetName.get() : "index.android.bundle"

// because elvis operator
def elvisFile(thing) {
    return thing ? file(thing) : null;
}

void runBefore(String dependentTaskName, Task task) {
    Task dependentTask = tasks.findByPath(dependentTaskName);
    if (dependentTask != null) {
        dependentTask.dependsOn task
    }
}

android.buildTypes.each { buildType ->
    // to prevent incorrect long value restoration from strings.xml we need to wrap it with double quotes
    // https://github.com/microsoft/cordova-plugin-code-push/issues/264
    buildType.resValue 'string', "CODE_PUSH_APK_BUILD_TIME", String.format("\"%d\"", System.currentTimeMillis())
}

gradle.projectsEvaluated {
def debuggableVariants = config.debuggableVariants ? config.debuggableVariants.get() : ['debug']
    android.applicationVariants.all { variant ->
        // No code push for debuggable variants
        if (debuggableVariants.contains(variant.name)) {
            return;
        }

        def nodeModulesPath;
        if (config.root) {
            nodeModulesPath = Paths.get(config.root.asFile.get().absolutePath, "/node_modules");
        } else if (project.hasProperty('nodeModulesPath')) {
            nodeModulesPath = project.nodeModulesPath
        } else {
            nodeModulesPath = "../../node_modules";
        }

        def targetName = variant.name.capitalize()
        def targetPath = variant.dirName

        def jsBundleDir;
        def resourcesDir;
        def jsBundleFile;

        // Additional node commandline arguments
        def nodeExecutableAndArgs = config.nodeExecutableAndArgs ? config.nodeExecutableAndArgs.get(): ["node"]
        def extraPackagerArgs = config.extraPackagerArgs ? config.extraPackagerArgs.get() : []

        // Make this task run right after the bundle task
        def generateBundledResourcesHash;

        def reactBundleTask = tasks.findByName("createBundle${targetName}JsAndAssets")
        if (reactBundleTask) {
            jsBundleDir = reactBundleTask.property('jsBundleDir').asFile.get()
            resourcesDir = reactBundleTask.property('resourcesDir').asFile.get()
            jsBundleFile = file("$jsBundleDir/$bundleAssetName")

            generateBundledResourcesHash = tasks.create(
                    name: "generateBundledResourcesHash${targetName}",
                    type: Exec) {
                commandLine (*nodeExecutableAndArgs, "${nodeModulesPath}/react-native-code-push/scripts/generateBundledResourcesHash.js", resourcesDir, jsBundleFile, jsBundleDir)

                enabled !debuggableVariants.contains(variant.name) ?: targetName.toLowerCase().contains("release")
            }

            runBefore("merge${targetName}Resources", generateBundledResourcesHash)
            runBefore("merge${targetName}Assets", generateBundledResourcesHash)
        } else {
            def jsBundleDirConfigName = "jsBundleDir${targetName}"
            jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ? elvisFile(config."$jsBundleDirConfigName").get():
                    file("$buildDir/intermediates/assets/${targetPath}")

            def resourcesDirConfigName = "resourcesDir${targetName}"
            resourcesDir = elvisFile(config."${resourcesDirConfigName}") ? elvisFile(config."${resourcesDirConfigName}").get():
                    file("$buildDir/intermediates/res/merged/${targetPath}")

            // In case version of 'Android Plugin for Gradle'' is lower than 1.3.0
            // '$buildDir' has slightly different structure - 'merged' folder
            // does not exists so '${targetPath}' folder contains directly in 'res' folder.
            if (!resourcesDir.exists() && file("$buildDir/intermediates/res/${targetPath}").exists()) {
                resourcesDir = file("$buildDir/intermediates/res/${targetPath}")
            }

            jsBundleFile = file("$jsBundleDir/$bundleAssetName")

            def resourcesMapTempFileName = "CodePushResourcesMap-" + java.util.UUID.randomUUID().toString().substring(0,8) + ".json"

            generateBundledResourcesHash = tasks.create(
                    name: "generateBundledResourcesHash${targetName}",
                    type: Exec) {
                commandLine (*nodeExecutableAndArgs, "${nodeModulesPath}/react-native-code-push/scripts/generateBundledResourcesHash.js", resourcesDir, jsBundleFile, jsBundleDir, resourcesMapTempFileName)
            }

            // Make this task run right before the bundle task
            def recordFilesBeforeBundleCommand = tasks.create(
                    name: "recordFilesBeforeBundleCommand${targetName}",
                    type: Exec) {
                commandLine (*nodeExecutableAndArgs, "${nodeModulesPath}/react-native-code-push/scripts/recordFilesBeforeBundleCommand.js", resourcesDir, resourcesMapTempFileName)
            }

            recordFilesBeforeBundleCommand.dependsOn("merge${targetName}Resources")
            recordFilesBeforeBundleCommand.dependsOn("merge${targetName}Assets")
            runBefore("bundle${targetName}JsAndAssets", recordFilesBeforeBundleCommand)

            // We need to generate and record the resources map, but we use it to generate the bundle hash
            generateBundledResourcesHash.dependsOn("recordFilesBeforeBundleCommand${targetName}")
        }

        generateBundledResourcesHash.dependsOn("createBundle${targetName}JsAndAssets")

        runBefore("processArmeabi-v7a${targetName}Resources", generateBundledResourcesHash)
        runBefore("processX86${targetName}Resources", generateBundledResourcesHash)
        runBefore("processUniversal${targetName}Resources", generateBundledResourcesHash)
        runBefore("process${targetName}Resources", generateBundledResourcesHash)
    }
}