Gradle获取特定任务的当前风格

Nun*_* D. 8 android gradle google-play-services android-productflavors

我正在尝试处理google-services.json和不同的口味.文档说我们需要根文件夹中的文件.

我有一个任务,可以轻松地将文件从flavor文件夹复制到根文件夹:

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"
}
Run Code Online (Sandbox Code Playgroud)

然后,在afterEvaluate I force

afterEvaluate {
    processFlavor1DebugGoogleServices.dependsOn CopyToRoot
    processFlavor1ReleaseGoogleServices.dependsOn CopyToRoot
}
Run Code Online (Sandbox Code Playgroud)

这仅适用于1种风味(静态定义).如何为每种口味做到这一点?我有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"
    }
 }
Run Code Online (Sandbox Code Playgroud)

但这不会复制正确的文件.有帮助吗?

Fal*_*asB 5

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

在此输入图像描述

在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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

当您切换构建变体时,它会自动在您的应用程序模块的根目录下复制正确的json文件.

添加两个调用的方法,以获取build.gradle根目录下的当前flavor和当前构建类型

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 "";
}
Run Code Online (Sandbox Code Playgroud)

基于这个答案