gpt4 book ai didi

android-gradle-plugin - android-gradle 设置 versionNameOverride 不会在 BuildConfig.java 中设置 versionName

转载 作者:行者123 更新时间:2023-12-04 15:48:09 30 4
gpt4 key购买 nike

我们有一个 releasedebug buildType 并希望设置 versionCodeversionNamedebug 的恒定值否则,即使没有更改代码,每个构建都会重新打包 apk。

所以我们设置了一个固定的默认值 versionCode然后为特定的 buildType 覆盖它:

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.gradletest"
minSdkVersion 28
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

applicationVariants.all { variant ->
if (!variant.buildType.isDebuggable()) {
variant.outputs.each { output ->
output.versionCodeOverride = getAppVersionCode()
output.versionNameOverride = getAppVersionName()
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.debug
debuggable true
}
}
}

虽然这适用于 apk,但不幸的是生成的 class BuildConfig始终具有默认值 1/"1.0"值(value)。我们阅读并展示了 versionNumber从应用程序中作为这个 popular answer建议。

显然 BuildConfig.java是在配置时生成的,而不是在项目构建时生成的,因此它无法知道所选的变体。如何处理?

我们的 getAppVersionCode()包含时间戳,因此每个 versionCode 都不同。我尝试翻转语句,以便调试版本每次都会显示不同的 versionCode 和 versionName,这对我们来说很好。
android {
defaultConfig {
versionCode getAppVersionName()
versionName getAppVersionCode()
}

applicationVariants.all { variant ->
if (variant.buildType.isDebuggable()) {
variant.outputs.each { output ->
output.versionCodeOverride = 1
output.versionNameOverride = "1.0"
}
}
}
}

我们有固定调试的原因 versionCode首先是我们不想为每个代码更改重建所有子模块。对于第二个变体,即使我们设置了固定的 versionNumber用于调试版本 output.versionCodeOverride = 1所有子模块都由 Android Studio 重建。在 Android Studio 3.0 之前,这有效但不再有效。请指教。

最佳答案

如您所见,BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE是在配置时设置的自动配置字段,不幸的是不受使用 gradle 脚本设置输出覆盖值的影响。

因为它们是自动配置字段,它们也不能通过 gradle 脚本直接更改。幸运的是,在使用您的方法时有一些方法可以解决这个问题:

1) 从包管理器获取显示的真实版本值:
而不是调用 BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE您需要在应用程序中显示它们的位置,请调用

val versionName: String = context.packageManager.getPackageInfo(context.packageName, 0).versionName
val versionCode: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
context.packageManager.getPackageInfo(context.packageName, 0).longVersionCode.toInt()
} else {
context.packageManager.getPackageInfo(context.packageName, 0).versionCode
}

这将返回您通过 output.versionCodeOverride 设置的版本值。对于选定的变体,即使 BuildConfig 字段默认为“1.0”/1

2) 为应用程序版本添加您自己的 BuildConfig 字段
如果您确实希望可以从 BuildConfig 访问版本名称,则可以在设置输出覆盖值时构建其他配置字段。请确保您不使用 VERSION_NAME 的自动字段名称。和 VERSION_CODE :
android {

...

applicationVariants.all { variant ->
if (variant.buildType.isDebuggable()) {
variant.outputs.each { output ->
output.versionCodeOverride = 1
output.versionNameOverride = "1.0"
}
variant.buildConfigField("String", "REAL_VERSION_NAME", "\"${getAppVersionName()}\"")
variant.buildConfigField("Int", "REAL_VERSION_CODE", ${getAppVersionCode()})
}
}
}

然后使用访问
val versionName: String = BuildConfig.REAL_VERSION_NAME
val versionCode: Int = BuildConfig.REAL_VERSION_CODE

关于android-gradle-plugin - android-gradle 设置 versionNameOverride 不会在 BuildConfig.java 中设置 versionName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54917244/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com