Substituir recursos por gradle, dependendo do buildType

Quero substituir algumas strings em meu res / strings.xml por gradle.

Eu sei dissodesde o Android Gradle Plugin 0.7. + existe a possibilidade de ter uma pasta de origem específica da variante. Mas meu aplicativo tem muitos sabores e não quero adicionar pastas específicas adicionais.

UPDATE 2014-01-17

O que eu quero em detalhes:

Eu tenho algumas variáveis em meus Recursos que dependem apenas do buildType (por exemplo, "release"). Primeiro eu pensei que meuSOLUTION_1 (substituir dados depois que os recursos foram mesclados) é bom, porque se eu tiver que alterar essas variáveis, só preciso alterá-las no build.config (apenas um local). Mas, como Scott Barta escreveu no comentário abaixo, existem algumas boas razões pelas quais essa solução NÃO é uma boa idéia.

Então eu tentei outra soluçãoSOLUÇÃO_2 (apenas mescle os recursos certos) com base emeste projeto GitHub de shakalaca. Eu acho que dessa maneira é mais elegante e ainda tenho a vantagem de mudar as variáveis1 Lugar, colocar!

SOLUTION_1 (substituir dados após a fusão dos recursos):

O que eu fiz no AS 0.4.2:

nobuild.gradle Tento substituir a string "Hello World" para "OVERRIDE" (com base na minha resposta neste post):

android.applicationVariants.all{ variant ->
    // override data in resource after merge task
    variant.processResources.doLast {
        overrideDataInResources(variant)
    }
}

def overrideDataInResources(buildVariant){
    copy {
        // *** SET COPY PATHS ***
        try {
            from("${buildDir}/res/all/${buildVariant.dirName}") {
                // println "... FROM: ${buildDir}/res/all/${buildVariant.dirName}"
                include "values/values.xml"
            }
        } catch (e) {
            println "... EXCEPTION: " + e
        }

        into("${buildDir}/res/all/${buildVariant.dirName}/values")
        // println "... INTO: ${buildDir}/res/all/${buildVariant.dirName}/values"

        // --- override string "hello_world"
        filter {
            String line ->
                line.replaceAll("<string name=\"hello_world\">Hello world!</string>",
                        "<string name=\"hello_world\">OVERRIDE</string>");
        }

    // *** SET PATH TO NEW RES *** 
    buildVariant.processResources.resDir = file("${buildDir}/res/all/${buildVariant.dirName}/values/values/values.xml")
    // println "... NEW RES PATH: " + "${buildDir}/res/all/${buildVariant.dirName}/values/values/values.xml"
    }
}

A tarefa de copiar e filtrar funciona bem, mas não foi possível definir o "novo" values.xml como recurso de sequência.

SOLUTION_2 (apenas mescle os recursos certos)

defina um fluxo para buildType específico (por exemplo, "releaseRes")

mesclar esses recursos com o sabor que você deseja criar:

android.applicationVariants.all{ variant ->
    variant.mergeResources.doFirst{
        checkResourceFolder(variant)
    }
}

def checkResourceFolder(variant){
    def name = variant.name;
    if(name.contains("Release")){
       android.sourceSets.release.res.srcDirs = ['src/releaseRes/res']
       android.sourceSets.flavor1.res.srcDirs = ['src/flavor1/res']
    }
}

questionAnswers(3)

yourAnswerToTheQuestion