android-gradle set versionNameOverride没有在BuildConfig.java中设置versionName

时间:2019-02-28 01:57:45

标签: android-gradle android-studio-3.0

我们有一个releasedebug buildType,并想将versionCode的{​​{1}}和versionName设置为恒定值,否则,每个构建都会重新打包apk,即使没有代码更改。

因此,我们设置了固定的默认值debug,随后将其替换为特定的buildType:

versionCode

虽然这对apk有效,但是不幸的是,生成的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 } } } 始终具有默认的class BuildConfig值。我们按照此popular answer的建议从应用程序中读取并显示1/"1.0"

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

我们的BuildConfig.java包含时间戳记,因此每个versionCode都不相同。我尝试翻转语句,以便调试版本每次都显示不同的versionCode和versionName,这对我们来说很好。

getAppVersionCode()

首先具有固定调试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,所有子模块也都由Android Studio重建。在Android Studio 3.0之前,此方法有效,但现在不再有效。请告知。

1 个答案:

答案 0 :(得分:1)

您已经注意到,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_NAMEVERSION_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