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
我的 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