Ich möchte einige Zeichenfolgen in meiner res/strings.xml mit Gradle überschreiben.Ressourcen mit Gradle überschreiben je nach BuildType
Ich weiß, dass since Android Gradle Plugin 0.7.+ Theres die Möglichkeit, eine Variante spezifischen Quellordner haben. Aber meine App hat viele Geschmacksrichtungen und ich möchte keine zusätzlichen spezifischen Ordner hinzufügen.
UPDATE 2014-01-17
Was ich will, im Detail:
Ich habe einige Variablen in meinen Ressourcen, die nur durch die buildType (beispielsweise "release") abhängen. Zuerst dachte ich, meine SOLUTION_1 (überschreiben Daten nach Ressourcen wurden zusammengeführt) ist schön, denn wenn ich diese Variablen ändern muss ich nur ändern sie in der build.config (nur einen Ort). Aber wie Scott Barta im Kommentar unten schrieb, gibt es einige gute Gründe, warum diese Lösung keine gute Idee ist.
So versuchte ich eine andere Lösung LÖSUNG_2 (nur die richtigen Ressourcen zusammenführen) basierend auf this GitHub project of shakalaca. Ich denke, dieser Weg ist eleganter und ich habe immer noch den Vorteil, nur die Variablen in einen Platz zu ändern!
SOLUTION_1 (Überschreiben von Daten nach Ressourcen waren fusionierte):
Was ich AS 0.4.2 tat in:
in
build.gradle
Ich versuche, den String "Hallo Welt" außer Kraft zu setzen, um " KORREKTUR“(based on my answer at this 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" } }
Die Kopier- und Filteraufgabe funktioniert einwandfrei, aber ich konnte die "neue" values.xml nicht als Zeichenfolgenressource festlegen.
SOLUTION_2 (merge nur die richtigen Ressourcen)
- eine floavor für spezifische buildType definieren (zB "releaseRes")
merge diese resourses mit dem Aroma, das Sie bauen wollen:
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'] } }
Dies ist im Allgemeinen nicht nur eine sehr gute Idee. Wenn Sie versuchen, in Ihrem Build-System signifikante Gymnastik durchzuführen, um Ihre Ressourcen zu modifizieren, wird Ihr gesamtes Projekt sehr schwierig zu warten und zu debuggen sein. Es wird extrem zerbrechlich sein, da Änderungen am Plugin es kaputt machen können oder Änderungen an Android Studio es möglicherweise nicht funktionieren lassen. Es würde sich lohnen, eine Frage zu stellen, in der genau erklärt wird, was Sie erreichen möchten, und welche Ansätze Sie in Betracht gezogen haben, einschließlich dieser. –
Danke für Ihre Antwort. Ich habe meine Frage bearbeitet und ausführlicher erklärt, was ich will. Ich denke, ich habe eine gute Lösung (SOLUTION_2) für meine Frage gefunden! – owe
Scott hatte Recht :) Ich hatte Lösung_1 implementiert, nach einem Jahr kehrte zu meinem Projekt mit aktualisierten IDE, aktualisierten Plugin und es ist alles kaputt. –