首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >android-gradle set versionNameOverride不在BuildConfig.java中设置versionName

android-gradle set versionNameOverride不在BuildConfig.java中设置versionName
EN

Stack Overflow用户
提问于 2019-02-28 09:57:45
回答 1查看 920关注 0票数 3

我们有一个releasedebug buildType,并希望将versionCodeversionName设置为debug的常量值,否则,即使没有代码更改,每次构建也会重新打包apk。

因此,我们设置了一个固定的默认versionCode,并在以后为特定的buildType覆盖它:

代码语言:javascript
复制
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"值。我们按照这个popular answer的建议从应用程序中读取并显示versionNumber

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

我们的getAppVersionCode()包含一个时间戳,所以每个versionCode都是不同的。我尝试反转语句,以便每次调试构建都会显示不同的versionCode和versionName,这对我们来说很好。

代码语言:javascript
复制
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,首先是因为我们不想为每个代码更改重新构建所有子模块。对于第二个变体,即使我们通过output.versionCodeOverride = 1为调试构建设置了固定的versionNumber,所有的子模块都是由Android Studio重新构建的。在Android Studio3.0之前,这是可行的,但现在不行了。请给我建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-16 03:36:29

正如您注意到的,BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE是在配置时设置的自动配置字段,不幸的是,它们不会受到使用gradle脚本设置输出重写值的影响。

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

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

代码语言:javascript
复制
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即可

代码语言:javascript
复制
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()})
        }
    }
}

然后使用以下命令访问

代码语言:javascript
复制
val versionName: String = BuildConfig.REAL_VERSION_NAME
val versionCode: Int = BuildConfig.REAL_VERSION_CODE
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54917244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档