我想用resdle重写res/strings.xml中的一些字符串。根据buildType覆盖gradle资源
我知道since Android Gradle Plugin 0.7.+ theres可能性具有变体特定的源文件夹。 但我的应用程序有很多风味,我不想额外添加变体特定的文件夹。
UPDATE 2014年1月17日
我想详细:
我有我的一些资源变量由buildType(例如“发布”),仅仅依靠。 首先,我认为我的SOLUTION_1(覆盖资源合并后的数据)是很好的,因为如果我必须更改这些变量,我只需要在build.config(只是一个地方)中更改它们。 但是正如Scott Barta在下面的评论中所写的那样,这个解决方案不是一个好主意,有一些很好的理由。
所以我尝试了另一个解决方案SOLUTION_2(只是合并正确的资源)根据this GitHub project of shakalaca。我认为这种方式更优雅,我仍然有优势,只是改变一个地方的变量!
SOLUTION_1(资源后,覆盖的数据合并):
我所做的在AS 0.4.2:
在
build.gradle
我试图重写字符串 “Hello World” 到“越权”(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" } }
复制和筛选任务工作正常,但我无法将“新”values.xml设置为字符串资源。
SOLUTION_2(只是合并了正确的资源)
- 定义特定buildType一个floavor(如 “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'] } }
这一般只是不是一个很好的主意。如果您尝试在构建系统中执行重要的体操操作来修改资源,那么整个项目的维护和调试将非常困难。这将会非常脆弱,因为对该插件的更改可能会破坏它,或者对Android Studio的更改可能会使其无法使用。这是值得发布的问题,解释你到底想要完成什么,并列出你考虑的方法,包括这一个。 –
感谢您的回答。我编辑了我的问题,并详细解释了我想要的内容。我想我为我的问题找到了一个很好的解决方案(SOLUTION_2)! – owe
斯科特是对的:)我已经实施了solution_1,一年后我用更新的IDE返回了我的项目,更新了插件,它全部坏掉了。 –