android - 如何用 Android Gradle 替换字符串资源

标签 android gradle android-studio

我在 Android Studio 中用 gradle 制作了一个新应用,现在我需要制作大约 10 个版本,在资源中具有不同的包名称和值。我像示例一样制作了自定义 flavor ,并希望用自定义值替换此自定义 flavor 中的一些字符串。我找到了这样的例子:

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

但我不知道该放在哪里。据我了解,我需要将其放入单独的任务中,但是如何使 IDE 调用此任务?

我还需要替换 Java 类和 Content Provider 的身份验证中的几个变量,也许我需要通过将文件复制到 flavor1 文件夹并让 gradle 合并它来做到这一点,但存储多个文件副本似乎是错误的解决方案一条线的区别...也许我需要使用其他解决方案来解决所有这些问题?

这里是 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"
        }

    }

}

最佳答案

我遇到了类似的问题。我想将 Jenkins 内部版本号添加到从 strings.xml 合并的字符串中。这是我从 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')
        }
    }
}

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

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

更新:在某些时候,Android Gradle 插件将迭代应用程序变体关键字的方式从 each 更改为 all。我的答案已更新以反射(reflect)更改,但如果此代码未将任何内容打印到控制台,请尝试切换到 each

关于android - 如何用 Android Gradle 替换字符串资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17275461/

相关文章:

python - Python正则表达式来匹配和替换gradle依赖项输出

eclipse - 导入 (libGDX) Gradle 项目导致 Eclipse 崩溃

android-layout - 影响工具栏样式和定位的抽屉导航片段

android - AndroidStudio 2.3 更新后 Robolectric 测试中的 RuntimeEnvironment.application

java - Android Studio 删除 Reyclerview 和 Sqlitedb 中的所有行

android - 如何为使用不同插件的多项目构建聚合测试报告?

android - ListView 未使用 notifydatasetchanged() 调用进行更新

java - 如何从 Gradle 中的 JAR 中排除资源并通过 IntelliJ 运行

android - 如何通过Gradle排除/删除 flavor 特定的 Assets 文件?

android - 使用 Retrofit 从服务器获取多个 View 项目来创建 RecyclerView