获取Gradle特定任务的当前flavor

9

我正在尝试处理google-services.json和不同风格的问题。文档表示我们需要在根文件夹中拥有该文件。

我有一个任务可以轻松将该文件从风格文件夹复制到根文件夹:

task CopyToRoot(type: Copy) {
    def appModuleRootFolder = '.'
    def srcDir = 'src'
    def googleServicesJson = 'google-services.json'

    outputs.upToDateWhen { false }
    def flavorName = android.productFlavors.flavor1.name

    description = "Switches to $flavorName $googleServicesJson"
    delete "$appModuleRootFolder/$googleServicesJson"
    from "${srcDir}/$flavorName/"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

然后,在afterEvaluate中,我强制执行
afterEvaluate {
    processFlavor1DebugGoogleServices.dependsOn CopyToRoot
    processFlavor1ReleaseGoogleServices.dependsOn CopyToRoot
}

这只适用于一个已静态定义的口味。如何针对每种口味做到这一点?我有4种口味。如何获取正在编译的当前口味?

[更新1] - 也尝试过:

task CopyToRoot(type: Copy) {
    def appModuleRootFolder = '.'
    def srcDir = 'src'
    def googleServicesJson = 'google-services.json'

    outputs.upToDateWhen { false }
    def flavorName = android.productFlavors.flavor1.name

    android.applicationVariants.all { variant ->
        def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName()
        println('flavorString: ' + flavorString)

        description = "Switches to $flavorString $googleServicesJson"
        delete "$appModuleRootFolder/$googleServicesJson"
        from "${srcDir}/$flavorString/"
        include "$googleServicesJson"
        into "$appModuleRootFolder"
    }
 }

但是这并没有复制正确的文件。有什么帮助吗?

@CommonsWare 有其他的解决方案吗?如何动态地实现它? - Nunes D.
3个回答

5
一种方法是在每个版本中创建名为“google-services”的文件夹,其中包含json文件的调试版本和发布版本:

enter image description here

在gradle文件的buildTypes部分添加以下内容:

    applicationVariants.all { variant ->
        def buildTypeName = variant.buildType.name
        def flavorName = variant.productFlavors[0].name;

        def googleServicesJson = 'google-services.json'
        def originalPath = "src/$flavorName/google-services/$buildTypeName/$googleServicesJson"
        def destPath = "."

        copy {
            if (flavorName.equals(getCurrentFlavor()) && buildTypeName.equals(getCurrentBuildType())) {
                println originalPath
                from originalPath
                println destPath
                into destPath
            }
        }
    }

当你切换构建变体时,它会自动将正确的JSON文件复制到您的应用程序模块的根目录中。
在您的build.gradle文件的根目录添加两个方法以获取当前产品风味和当前构建类型。
def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if( tskReqStr.contains( "assemble" ) )
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher( tskReqStr )

    if( matcher.find() ) {
        println matcher.group(1).toLowerCase()
        return matcher.group(1).toLowerCase()
    }
    else
    {
        println "NO MATCH FOUND"
        return "";
    }
}

def getCurrentBuildType() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

        if (tskReqStr.contains("Release")) {
            println "getCurrentBuildType release"
            return "release"
        }
        else if (tskReqStr.contains("generateDebug")) {
            println "getCurrentBuildType debug"
            return "debug"
        }

    println "NO MATCH FOUND"
    return "";
}

根据这个答案


1
我找到了答案。Google终于支持每个口味不同的google-services.json。您只需要将插件更新到com.google.gms:google-services:2.0.0即可。 无需将json文件复制到应用程序文件夹中,只需将不同的google-services.json文件放在构建口味目录中即可。

0
def getCurrentProductVariant() {
    def yourTaskName = "XXXX"
    def taskName = project.gradle.startParameter.taskNames.find { it.contains(yourTaskName) }
    if (taskName != null) {
        def variantParts = taskName.split(/(?<!^)(?=[A-Z])/)[-2..-1].collect { it.toLowerCase() }
        return new ProductVariant(buildType: variantParts[1], productFlavor: variantParts[0])
    }
    return null
}

class ProductVariant {
    String buildType
    String productFlavor
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接