Reemplace los recursos con Gradle dependiendo de buildType

Quiero anular algunas cadenas en mi res / strings.xml con gradle.

Yo sé esodesde Android Gradle Plugin 0.7. + existe la posibilidad de tener una carpeta fuente específica de variante. Pero mi aplicación tiene muchos sabores y no quiero agregar carpetas específicas adicionales a la variante.

ACTUALIZACIÓN 2014-01-17

Lo que quiero en detalle:

Tengo algunas variables en mis Recursos que dependen solo del tipo de construcción (por ejemplo, "release"). Primero pensé miSOLUCIÓN_1 (anular los datos después de que se fusionaron los recursos) es bueno, porque si tengo que cambiar estas variables, solo tengo que cambiarlas en el build.config (solo un lugar). Pero como Scott Barta escribió en el comentario a continuación, hay algunas buenas razones por las que esta solución NO es una buena idea.

Así que probé otra soluciónSOLUCIÓN_2 (simplemente fusionar los recursos correctos) basado eneste proyecto GitHub de shakalaca. Creo que esta forma es más elegante y todavía tengo la ventaja de cambiar las variables enuno ¡lugar!

SOLUCIÓN_1 (anular los datos después de fusionar los recursos):

Lo que hice en AS 0.4.2:

enbuild.gradle Intento anular la cadena "Hello World" por "OVERRIDE" (basado en mi respuesta en este 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"
    }
}

La tarea de copiar y filtrar funciona bien, pero no pude establecer el valor "nuevo" values.xml como un recurso de cadena.

SOLUCIÓN_2 (simplemente fusionar los recursos correctos)

define un floavor para buildType específico (por ejemplo, "releaseRes")

fusiona estos recursos con el sabor que deseas construir:

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']
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta