覆盖android gradle versionCode表单命令行

时间:2015-06-26 10:39:13

标签: android jenkins gradle android-gradle

我的Android应用程序中有一个build.gradle文件,其中包含以下设置:

android {
    ...
    defaultConfig {
        applicationId "some.app.id"
        versionName '1.2'
        versionCode 3
        ...
    }
...
}

我的AndroidManifest.xml 包含versionCode且不包含versionName。

现在我想在Jenkins上构建这个应用程序并将BUILD_NUMBER传递为app的versionCode,以便每个版本都有更高版本。

所以在工作中我有一个电话:

./gradlew -PversionCode=$BUILD_NUMBER clean build

当我使用" versionCode"重命名" app-release.apk" versionCode的值与从命令行传递的值相同:

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "MyApp_" + "_v" + versionName + "." + versionCode + ".apk"))
    }
}

摘要

所以我有一个默认值" versionCode"设置为3,但在Jenkins上构建时我想从命令行覆盖它。

问题

问题是在AndroidManifest内部构建.apk应用程序将versionCode设置为3而不是BUILD_NUMBER中的值。 我用" aapt dump badging"

检查了它

问题

这个值可以" versionCode"来自android defaultConfig的命令行参数?

我知道,我可以使用如下所述的功能: http://robertomurray.co.uk/blog/2013/gradle-android-inject-version-code-from-command-line-parameter/ 但我更喜欢简单覆盖的清洁方式,但我无法让它工作。

1 个答案:

答案 0 :(得分:10)

您可以通过在gradle.properties文件中定义属性来使用属性,请参阅gradle documentation。 但是你必须非常小心你用于你的属性的名称:如果你使用versionName,那么属性在gradle中会有正确的值(你可以println它)但它不会结束在您的AndroidManifest.xml中!所以我选择使用' versName'。 (我不太了解gradle以了解为什么会这样......)

因此,在您的项目gradle.properties中,您可以定义以下属性: versCode=3 versName=1.2

然后将build.gradle文件更改为:

android {
    ...
    defaultConfig {
        applicationId "some.app.id"
        versionName versName
        versionCode versCode as Integer
        ...
    }
    ...
}

现在您可以在命令行上覆盖它们,如下所示:./gradlew -PversCode=4 -PversName=2.1.3 clean build