Zastąp zasoby za pomocą stopniowania w zależności od typu buildType

Chcę przesłonić niektóre ciągi w moim pliku res / strings.xml za pomocą gradle.

wiem tood Android Gradle Plugin 0.7. + istnieje możliwość posiadania konkretnego folderu źródłowego. Ale moja aplikacja ma wiele smaków i nie chcę dodawać dodatkowych wariantów folderów.

AKTUALIZACJA 2014-01-17

Czego chcę szczegółowo:

W moich zasobach mam kilka zmiennych, które zależą tylko od typu buildType (np. „Release”). Najpierw myślałemROZWIĄZANIE_1 (przesłonięcie danych po scaleniu zasobów) jest przyjemne, ponieważ jeśli muszę zmienić te zmienne, muszę je tylko zmienić w pliku build.config (tylko jedno miejsce). Ale, jak napisał Scott Barta w poniższym komentarzu, istnieją dobre powody, dla których to rozwiązanie NIE jest dobrym pomysłem.

Spróbowałem innego rozwiązaniaROZWIĄZANIE_2 (po prostu połącz odpowiednie zasoby) na podstawieten projekt Shakalaca GitHub. Myślę, że ten sposób jest bardziej elegancki i nadal mam przewagę, aby zmienić zmiennejeden miejsce!

ROZWIĄZANIE_1 (zastąp dane po scaleniu zasobów):

Co zrobiłem w AS 0.4.2:

wbuild.gradle Próbuję przesłonić ciąg „Hello World” na „OVERRIDE” (na podstawie mojej odpowiedzi w tym poście):

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"
    }
}

Zadanie kopiowania i filtrowania działa poprawnie, ale nie mogłem ustawić „new” values.xml jako zasobu łańcuchowego.

ROZWIĄZANIE_2 (wystarczy połączyć odpowiednie zasoby)

zdefiniuj floavor dla konkretnego typu buildType (np. „releaseRes”)

połącz te zasoby ze smakiem, który chcesz zbudować:

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(2)

yourAnswerToTheQuestion