首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在更新到AGP 3.2.0之后,BuildConfig.VersionCode没有反映实际的versionCode

在更新到AGP 3.2.0之后,BuildConfig.VersionCode没有反映实际的versionCode
EN

Stack Overflow用户
提问于 2018-09-25 16:13:06
回答 2查看 2.1K关注 0票数 4

在更新到AGP(Android插件) 3.2.0之后,我们不能直接在mergedFlavor上设置mergedFlavor。如果我们这样做,就会得到以下有用的警告:

代码语言:javascript
复制
versionCode cannot be set on a mergedFlavor directly.
versionCodeOverride can instead be set for variant outputs using the following syntax:
android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.versionCodeOverride = 40805
        }
    }
}

在这个变化之后,除了一件小事情外,一切都很好。自动生成的BuildConfig.VERSION_CODE不反映来自output.versionCodeOverride = 40805的版本代码。

在AGP 3.2.0之前,我们可以通过以下方法动态地设置versionCode:

代码语言:javascript
复制
applicationVariants.all { v ->
        v.mergedFlavor.versionCode = 40805 // 40805 is hardcoded as an example but it is archived dynamically.
    }

以及反映在BuildConfig.VERSION_CODE中的版本代码(这非常方便),我想用AGP3.2.0进行同样的归档。

我知道我可以通过为这类variant.buildConfigField('int', 'OVERRIDDEN_VERSION_CODE', "${versionCodeOverride}")创建一个定制的build字段来解决这个问题,这将使用我覆盖的BuildConfig.OVERRIDDEN_VERSION_CODE生成versionCode。通过通过versionCode设置mergedFlavor.versionCode = 40805来存档AGP版本,如3.2.0所示,但我不喜欢这种解决办法。

有没有办法让output.versionCodeOverride = 40805在自动生成的BuildConfig.VERSION_CODE中进行反射?

PS:如果我们将versionCode直接设置在特定的风格中,它将如预期的那样工作,但这不是我想知道的:)

更新

找到一个类似的问题(用一个描述良好的用例),并考虑到我们的讨论,我可以给出一个更好的答案,这里

EN

回答 2

Stack Overflow用户

发布于 2018-09-25 20:13:20

综上所述,问题不在于版本代码覆盖根本没有被应用,只是BuildConfig.VERSION_CODE没有获取覆盖值。

这已在官方问题跟踪器( https://issuetracker.google.com/issues/37008496 )中被标记为预期行为。

其中一条注释解释了为什么定义versionCode,并建议将defaultConfig定义为一种风格,而不是defaultConfig

如果我们为每个输出创建一个不同的buildconfig.java,那么我们还需要为每个拆分运行javac/proguard/jacoco/dex,这样我们就失去了构建时间的改进。 如果这对您非常重要,那么就不要使用splits,而是使用味道,但是我们会得到更慢的构建时间。

如果不想更改当前设置,则可能需要从清单中读取版本代码。你所需要的只是一个背景:

代码语言:javascript
复制
val versionCode = context.packageManager.getPackageInfo(context.packageName, 0).versionCode

您应该缓存这个值,因为获取包信息是一个非常重要的操作。

版本号也是如此。

票数 3
EN

Stack Overflow用户

发布于 2018-09-25 17:08:33

指令的顺序很重要..。

代码语言:javascript
复制
String versionName = version.versionName
int versionCode = version.versionCode

android {
    applicationVariants.all { variant ->

        // to be removed here:
        // variant.mergedFlavor.versionCode = versionCode

        variant.outputs.each { output ->

            // and to be added here:
            output.versionNameOverride = versionName
            output.versionCodeOverride = versionCode
        }
    }
}

构建多个APK的文档解释了它,下面是“配置版本控制”。

虽然这样做的原因不是构建工具3.2.0,而是Gradle 4.6。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52502548

复制
相关文章

相似问题

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