【发布时间】:2014-02-05 05:22:56
【问题描述】:
我想用 gradle 覆盖我的 res/strings.xml 中的一些字符串。
我知道since Android Gradle Plugin 0.7.+ 有可能拥有一个特定于变体的源文件夹。 但是我的应用程序有很多口味,我不想添加额外的变体特定文件夹。
2014 年 1 月 17 日更新
我想要的详细信息:
我的资源中有一些变量仅取决于 buildType(例如“release”)。 首先,我认为我的 SOLUTION_1(资源合并后覆盖数据)很好,因为如果我必须更改这些变量,我只需在 build.config 中更改它们(只有一个地方)。 但正如 Scott Barta 在下面的评论中所写,有一些很好的理由说明这个解决方案不是一个好主意。
所以我尝试了另一个基于this GitHub project of shakalaca 的解决方案SOLUTION_2(只需合并正确的资源)。我认为这种方式更优雅,而且我仍然有优势,只需在一个位置更改变量!
SOLUTION_1(资源合并后覆盖数据):
我在 AS 0.4.2 中做了什么:
-
在
build.gradle中,我尝试将字符串“Hello World”覆盖为“OVERRIDE”(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 定义一个风格(例如“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)!
-
Scott 是对的 :) 我已经实现了 solution_1,一年后我用更新的 IDE、更新的插件回到我的项目,但它都坏了。
标签: android gradle android-studio android-gradle-plugin build.gradle