Override android gradle versionCode 表单命令行

Override android gradle versionCode form command line

我的 android 应用程序中有一个 build.gradle 文件,其设置如下:

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

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

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

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

./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 上构建时我想从命令行覆盖它。

问题

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

检查了它

问题

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

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

您可以通过在 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