如何用Android Gradlereplacestring资源

我在Android Studio中用gradle创build了一个新的应用程序,现在我需要制作大约10个版本,其中包含不同的软件包名称和值。 我在例子中做了自定义的风格,并想用自定义值来replace这个自定义风格中的一些string。 我发现这样的例子:

filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: ['version': '2.2']) 

但是我不知道该把它放在哪里。 据我了解,我需要把它分成不同的任务,但如何使这个任务由IDE调用?

此外,我需要更换Java类和内容提供商的身份validation内的几个variables,也许我需要通过复制文件到flavor1文件夹,让gradle合并它,但它似乎是错误的解决scheme,以存储在一个不同的文件的副本线…也许我需要用户一些其他的解决scheme呢?

这里是build.gradle:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.2' } } apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile project(':JazzyListView') compile project(':ABS') compile project(':Volley') } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { versionCode 5 versionName "3.0" minSdkVersion 8 targetSdkVersion 17 } sourceSets { main { manifest.srcFile 'src/main/AndroidManifest.xml' java.srcDirs = ['src/main/java'] res.srcDirs = ['src/main/res'] } } productFlavors { flavor1 { packageName "com.example.flavor1" } flavor2 { packageName "com.example.flavor2" } } } 

Solutions Collecting From Web of "如何用Android Gradlereplacestring资源"

我有一个类似的问题。 我想将Jenkins内部版本号添加到从strings.xml中合并的string中。 这是我的解决scheme,Android Gradle插件0.12。+。

 // Insert the build number into strings.xml android.applicationVariants.all{ variant -> variant.mergeResources.doLast{ ext.env = System.getenv() def buildNumber = env.BUILD_NUMBER if (buildNumber != null) { File valuesFile = file("${buildDir}/intermediates/res/${variant.dirName}/values/values.xml") println("Replacing revision number in " + valuesFile) println("Build number = " + buildNumber) String content = valuesFile.getText('UTF-8') content = content.replaceAll(/devBuild/, buildNumber) valuesFile.write(content, 'UTF-8') } } } 

您可能想要根据您想要执行的操作挂钩到不同的Gradle任务。 看看Android构build的一部分任务来解决这个问题。

http://tools.android.com/tech-docs/new-build-system/user-guide

更新 :在某些时候,Android Gradle插件改变了从各个应用变体关键字迭代到全部的方式 。 我的答案已更新,以反映更改,但尝试切换到每个如果此代码不打印任何东西到控制台。

我试图获得与Maven资源过滤类似的function。 这是我想出来的。 我的解决scheme可以使用一些更改更健壮(即从属性文件等拉)。

我的例子只是展示了如何replace一个值,这就是我所需要的。 这些variables遵循${some.property}约定。 此解决scheme也适用于具有自己的资源文件的产品口味。

 import org.apache.tools.ant.filters.* ... android.applicationVariants.all{ variant -> // Perform resource filtering variant.mergeResources.doLast { filterResources(variant) } } def filterResources(buildVariant) { //Setup temp directory to filter the resources File resFiltered = file("${buildDir}/res/all/filtered/${buildVariant.dirName}") if(resFiltered.exists()){ resFiltered.delete() } //Copy and filter the resources. copy { from(buildVariant.processResources.resDir) { include '**/*.xml' //Could be improved upon to pull from a properties file, etc. ant.properties['app.version'] = project.version filter(ExpandProperties, project: ant.project) } from(buildVariant.processResources.resDir) { exclude '**/*.xml' } into resFiltered } //Delete all the original resource files file(buildVariant.processResources.resDir).deleteDir() //Replace with the filtered ones. resFiltered.renameTo(file(buildVariant.processResources.resDir)) //Delete the original 'filtered' directory file( "${buildDir}/res/all/filtered").deleteDir() } 

在strings.xml中的例子

  ... <string name="app_version">${app.version}</string> ... 

在您的“src”文件夹中,创build与“main”文件夹具有相同层级的“flavor1”和“flavor2”文件夹。 如果你的main / res / values中有strings.xml,你可以在flavor1 / res / values中做,并且在那里有replace值。 它可能会在IDE中显示错误,但它仍应该生成并运行。

这些链接可能会有所帮助:

  • 使用Gradle构buildAndroid应用程序
  • Gradle插件用户指南

而我的filter定义使用正则expression式来取代某些东西:

 from('res/') { include '**/*.xml' filter { line -> line.replaceAll(/YOUR_REGEX_TO_REPLACE_SOMETHING/, 'REPLACED_RESULT_EXPRESSION') } } into 'build/path/to/your/filtered/resources/'