Я хочу переопределить некоторые строки в файле res/strings.xml с помощью gradle.
Я знаю, что с Android Gradle Plugin 0.7. + позволяет иметь вариант конкретной исходной папки. Но у моего приложения много вкусов, и я не хочу добавлять дополнительные варианты конкретных папок.
ОБНОВЛЕНИЕ 2014-01-17
Что я хочу подробно:
У меня есть некоторые переменные в моих ресурсах, которые зависят только от типа buildType (например, "release" ). Сначала я думал, что мой SOLUTION_1 (переопределить данные после объединения ресурсов) приятно, потому что, если мне нужно изменить эти переменные, мне просто нужно их изменить в файле build.config(всего одно место). Но, как написал Скотт Барта в комментарии ниже, есть несколько веских причин, почему это решение НЕ является хорошей идеей.
Итак, я попробовал другое решение SOLUTION_2 (просто объединить нужные ресурсы) на основе этого проекта GitHub shakalaca, Я думаю, что этот способ более изящный, и у меня все еще есть преимущество просто изменить переменные в одном месте!
SOLUTION_1 (переопределение данных после объединения ресурсов):
Что я сделал в AS 0.4.2:
-
in
build.gradle
Я пытаюсь переопределить строку "Hello World" на "OVERRIDE" (на основе моего ответа в этом сообщении):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" } }
Задача копирования и фильтрации работает отлично, но я не могу установить "new" values.xml в качестве ресурса строки.
SOLUTION_2 (просто объедините нужные ресурсы)
- определить floater для определенного типа buildType (например, "releaseRes" )
-
объединить эти ресурсы с вкусом, который вы хотите построить:
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'] } }