Debug/Release android gradle 构建使用不同的 VersionCode
Use different VersionCode for Debug/Release android gradle build
我想应用不同的版本代码来制作 apk 文件。
对于调试,仅将其固定为 1
,对于发布,则在 defaultConfig 中指定任何数字。
下面的代码将 mypackage-release-1.apk
文件作为 assembleRelease 工件,这不是预期的。我预计 mypackage-release-10111.apk
。
为什么 debug { defaultConfig.versionCode=1 }
行会影响 assembleRelease 工件?
defaultConfig {
versionCode 10111
versionName '2.5.4'
minSdkVersion 10
targetSdkVersion 21
}
signingConfigs {
debug {
project.ext.loadSign = false
defaultConfig.versionCode = 1 // Why this value applied to assembleRelease?
}
release {
project.ext.loadSign = true
applicationVariants.all { variant ->
variant.outputs.each { output ->
def file = output.outputFile
output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionCode + ".apk"))
}
}
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
signingConfig signingConfigs.release
}
}
我也是,但我认为 defaultConfig.versionCode
是在 build.gradle
编译时设置的。它是全局静态变量,在编译时分配,而不是运行时。
我认为我们可以拦截gradle任务执行,并在运行时修改defaultConfig.versionCode
。
gooooooooogle 之后,我发现这个适合我:https://gist.github.com/keyboardsurfer/a6a5bcf2b62f9aa41ae2
晚会...
整个 gradle 文件在执行任何任务之前进行评估,因此您基本上是在更改默认 versionCode
的同时声明 debug
配置。没有直接的方法从 buildType
重置 versionCode
,但是另一个答案中的 link 通过在构建变体上声明任务来解决问题。
android {
...
defaultConfig {
...
}
buildTypes {
...
}
applicationVariants.all { variant ->
def flavor = variant.mergedFlavor
def versionCode = flavor.versionCode
if (variant.buildType.isDebuggable()) {
versionCode += 1
}
flavor.versionCode = versionCode
}
}
这是一个更新版本:
android {
defaultConfig { ... }
applicationVariants.all { variant ->
if (variant.name == 'debug') {
variant.outputs.each { output ->
output.versionCodeOverride = 1
}
}
}
}
与风味搭配使用:
applicationVariants.all { variant ->
def flavor = variant.mergedFlavor
def name = flavor.getVersionName()
def code = flavor.getVersionCode()
if (variant.buildType.isDebuggable()) {
name += '-d'
code = 1
}
variant.outputs.each { output ->
output.versionNameOverride = name
output.versionCodeOverride = code
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
if (variant.buildType.isDebuggable()) {
output.versionCodeOverride = 26
output.versionNameOverride = "2.2.6"
}
}
}
放入 android{}
所以最近我不得不处理相同的场景,我能找到的所有示例都使用 applicationVariants
属性,即 ill-documented imo。
所以在对源代码进行了一些挖掘之后,我意识到最终 versionCode
和 versionName
来自 ProductFlavor
的属性被合并到 AndroidManifest 中,这让我开始思考:我们不能自己注入它们吗,因为我们在 ProductFlavor 和 BuildType DSL 对象上有 manifestPlaceholders
属性,所以我想到了这个——不要犹豫,提供反馈并告诉我原因错了
在build.gradle(app)
android {
...
buildTypes {
debug {
manifestPlaceholder = [versionCode: X, versionName: "X.Y.Z"]
}
release {
manifestPlaceholder = [versionCode: A, versionName: "A.B.C"]
}
}
...
}
在AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="..."
android:versionCode="${versionCode}"
android:versionName="${versionName}">
...
</manifest>
最简单的解决方案是将 versionCode 和 versionName 变量从 defaultConfig 分别移至 debug 和 release。
android {
...
defaultConfig {
// without versionCode and versionName
...
}
buildTypes {
debug {
defaultConfig.versionCode X
defaultConfig.versionName 'X.Y.Z'
}
release {
defaultConfig.versionCode A
defaultConfig.versionName 'A.B.C'
}
}
...
}
我想应用不同的版本代码来制作 apk 文件。
对于调试,仅将其固定为 1
,对于发布,则在 defaultConfig 中指定任何数字。
下面的代码将 mypackage-release-1.apk
文件作为 assembleRelease 工件,这不是预期的。我预计 mypackage-release-10111.apk
。
为什么 debug { defaultConfig.versionCode=1 }
行会影响 assembleRelease 工件?
defaultConfig {
versionCode 10111
versionName '2.5.4'
minSdkVersion 10
targetSdkVersion 21
}
signingConfigs {
debug {
project.ext.loadSign = false
defaultConfig.versionCode = 1 // Why this value applied to assembleRelease?
}
release {
project.ext.loadSign = true
applicationVariants.all { variant ->
variant.outputs.each { output ->
def file = output.outputFile
output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionCode + ".apk"))
}
}
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
signingConfig signingConfigs.release
}
}
我也是,但我认为 defaultConfig.versionCode
是在 build.gradle
编译时设置的。它是全局静态变量,在编译时分配,而不是运行时。
我认为我们可以拦截gradle任务执行,并在运行时修改defaultConfig.versionCode
。
gooooooooogle 之后,我发现这个适合我:https://gist.github.com/keyboardsurfer/a6a5bcf2b62f9aa41ae2
晚会...
整个 gradle 文件在执行任何任务之前进行评估,因此您基本上是在更改默认 versionCode
的同时声明 debug
配置。没有直接的方法从 buildType
重置 versionCode
,但是另一个答案中的 link 通过在构建变体上声明任务来解决问题。
android {
...
defaultConfig {
...
}
buildTypes {
...
}
applicationVariants.all { variant ->
def flavor = variant.mergedFlavor
def versionCode = flavor.versionCode
if (variant.buildType.isDebuggable()) {
versionCode += 1
}
flavor.versionCode = versionCode
}
}
这是一个更新版本:
android {
defaultConfig { ... }
applicationVariants.all { variant ->
if (variant.name == 'debug') {
variant.outputs.each { output ->
output.versionCodeOverride = 1
}
}
}
}
与风味搭配使用:
applicationVariants.all { variant ->
def flavor = variant.mergedFlavor
def name = flavor.getVersionName()
def code = flavor.getVersionCode()
if (variant.buildType.isDebuggable()) {
name += '-d'
code = 1
}
variant.outputs.each { output ->
output.versionNameOverride = name
output.versionCodeOverride = code
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
if (variant.buildType.isDebuggable()) {
output.versionCodeOverride = 26
output.versionNameOverride = "2.2.6"
}
}
}
放入 android{}
所以最近我不得不处理相同的场景,我能找到的所有示例都使用 applicationVariants
属性,即 ill-documented imo。
所以在对源代码进行了一些挖掘之后,我意识到最终 versionCode
和 versionName
来自 ProductFlavor
的属性被合并到 AndroidManifest 中,这让我开始思考:我们不能自己注入它们吗,因为我们在 ProductFlavor 和 BuildType DSL 对象上有 manifestPlaceholders
属性,所以我想到了这个——不要犹豫,提供反馈并告诉我原因错了
在build.gradle(app)
android {
...
buildTypes {
debug {
manifestPlaceholder = [versionCode: X, versionName: "X.Y.Z"]
}
release {
manifestPlaceholder = [versionCode: A, versionName: "A.B.C"]
}
}
...
}
在AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="..."
android:versionCode="${versionCode}"
android:versionName="${versionName}">
...
</manifest>
最简单的解决方案是将 versionCode 和 versionName 变量从 defaultConfig 分别移至 debug 和 release。
android {
...
defaultConfig {
// without versionCode and versionName
...
}
buildTypes {
debug {
defaultConfig.versionCode X
defaultConfig.versionName 'X.Y.Z'
}
release {
defaultConfig.versionCode A
defaultConfig.versionName 'A.B.C'
}
}
...
}