Android Gradle Build - 如何将环境变量注入资产目录中的属性文件?

时间:2016-11-18 09:24:22

标签: android jenkins gradle android-gradle

这对我来说并不是什么新鲜事,在谷歌发布适用于Android工作室版本2.2.2的Gradle插件之前,我已经这样做了几个月,它打破了文件查找功能。

使用案例

我在Android工作室和Jenkins中运行gradle构建。我需要将一些构建信息传递给构建,然后希望它由代码使用。这些值包括系统信息,构建变体,构建日期和相关构建版本的IP地址。

在我从2.1.3

切换到Gradle 2.2.2之前
android.applicationVariants.all { variant ->
    variant.mergeResources.doLast {
        File propsFile = file("${buildDir}/intermediates/assets/${variant.dirName}/config.properties")
        println("Filtering resource file: " + propsFile)
        String content = propsFile.getText('UTF-8')
        println("File contents: " + content)
        content = content.replaceAll(/@build.date@/, buildDate)
                .replaceAll(/@build.mode@/, buildMode)
                .replaceAll(/@serverUri@/, serverUrl)
        propsFile.write(content, 'UTF-8')
    }
}

以上代码在intermediate/assets/${variant.dirName}路径中查找config.properties文件。然后处理该文件,用传递给replaceAll方法的变量替换标有@ .. @的标记。

现在我的问题是:

该代码应该适用于较新的Gradle插件版本2.2.2。但是,我发现较新的版本不会在中间目录中生成资产文件夹,因此上面的代码无法查找文件并抛出以下错误:

Execution failed for task ':app:mergeDebugResources'.
> /home/pawan/git/MyApplication/app/build/intermediates/assets/debug/config.properties (No such file or directory)

很明显,较新的版本改变了构建操作的工作方式。现在的问题是,我该如何从这一点开始呢?如何实现预期的功能?任何解决方法或修复方法?

1 个答案:

答案 0 :(得分:0)

可能会Build Environment对您有所帮助。您可以在gradle.properties中定义环境变量并为其分配默认值。在你build.gradle文件中,只有这样的环境变量。在jenkins中,使用gradlew将您的需求值分配给变量,默认值将被替换。

例如,在gradle.properties

versCode=100

build.gradle

defaultConfig {
    // Other configs
    versionCode versCode as Integer
}

在你的jenkens构建脚本中:

./gradlew -PversCode=200 build