我的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/ 但我更喜欢简单覆盖的清洁方式,但我无法让它工作。
答案 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