覆盖android gradle versionCode表单命令行

lja*_*der 7 android gradle jenkins android-gradle-plugin

我有一个build.gradle文件在我的Android应用程序中使用此设置:

android {
    ...
    defaultConfig {
        applicationId "some.app.id"
        versionName '1.2'
        versionCode 3
        ...
    }
...
}
Run Code Online (Sandbox Code Playgroud)

我的AndroidManifest.xml 包含versionCode,也不包含versionName.

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

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

./gradlew -PversionCode=$BUILD_NUMBER clean build
Run Code Online (Sandbox Code Playgroud)

当我使用"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"))
    }
}
Run Code Online (Sandbox Code Playgroud)

摘要

所以我将默认值"versionCode"设置为3,但是在构建Jenkins时我想从命令行覆盖它.

问题

问题是在AndroidManifest内部构建.apk应用程序将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/ 但我更喜欢清洁方式简单的覆盖,但我不能让它工作.

use*_*491 11

您可以通过在gradle.properties文件中定义属性来使用属性,请参阅gradle文档.但是你必须要非常小心你用于属性的名称:如果你使用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
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考我需要将versionCode versCode作为Integer,否则会因为找不到方法versionCode()而抱怨异常. (2认同)