owe*_*owe 23 android gradle android-studio build.gradle android-gradle-plugin
我想用gradle覆盖res/strings.xml中的一些字符串.
我知道,因为Android Gradle Plugin 0.7.+ theres可能有一个变种特定的源文件夹.但我的应用程序有很多口味,我不想添加额外的变体特定文件夹.
更新2014-01-17
我想要的详细信息:
我的资源中有一些变量只依赖于buildType(例如"release").首先,我认为我的SOLUTION_1(在资源合并后覆盖数据)很好,因为如果我必须更改这些变量,我只需要在build.config(只有一个地方)中更改它们.但正如Scott Barta在下面的评论中所写的那样,为什么这个解决方案不是一个好主意有一些很好的理由.
所以我尝试了另一个解决方案SOLUTION_2(只是合并正确的资源)基于shakalaca的这个GitHub项目.我认为这种方式更优雅,我仍然有一个优势就是在一个地方改变变量!
SOLUTION_1(在资源合并后覆盖数据):
我在AS 0.4.2中做了什么:
在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"
}
}
Run Code Online (Sandbox Code Playgroud)复制和筛选任务工作正常,但我无法将"new"values.xml设置为字符串资源.
SOLUTION_2(只需合并合适的资源)
将此资源与您要构建的风格合并:
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']
}
}
Run Code Online (Sandbox Code Playgroud)Sco*_*rta 18
您应该努力提出一种解决方案,该解决方案不涉及在构建文件中编写任何自定义代码,尤其是在动态重新分配源集时执行棘手操作的代码.自定义Gradle代码编写起来有点时髦,而且很难调试和维护.新的构建系统非常强大,已经具有很大的灵活性,很可能你已经可以做你想做的事了; 这只是学习方法的问题.
特别是如果你只是学习Android-Gradle项目的细节(而且它是如此新的,我们都是),最好在开箱即用之前尽力使用系统内置的功能.
一些建议:
debuggable
,jniDebugBuild
,renderscriptDebugBuild
,renderscriptOptimLevel
,packageNameSuffix
,versionNameSuffix
,signingConfig
,zipAlign
,runProguard
,proguardFile
,proguardFiles
.BuildConfig
机制 - 它是一个DEBUG
基于调试/发布构建状态定义标志的Java类,您可以从不同的构建类型添加自己的自定义Java代码来执行更有意义的事情.BuildConfig
用于允许构建类型之间的小功能差异,用于调试构建可能需要执行一些浪费操作以协助开发的情况,例如进行更广泛的数据验证或创建更详细的调试日志记录,并且这些浪费的事情最佳地优化了发布版本.话虽如此,它可能是一个适当的机制来做你想要的.小智 7
我不相信你需要自定义构建脚本来实现你想要的.根据我对http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants的阅读; 当构建运行时,资源将从以下文件夹合并(如果存在);
src/[flavour][buildType]/res
src/[buildType]/res
src/[flavour]/res
src/main/res
Run Code Online (Sandbox Code Playgroud)
所以我相信你只需在src/release/res中添加资源就可以实现你想要的.
虽然您可以通过指定相关的sourceSets来调整文件夹名称.[type] .res.srcDirs如果您真的想要更改它们.
归档时间: |
|
查看次数: |
21689 次 |
最近记录: |