Android Gradle 3.0.0更新后,buildConfigField警告

22

我最近安装了最新的Android Studio金丝雀版,目前使用的是Android Gradle插件3.0.0-alpha4(之前是2.3.3)。

现在我的所有buildConfigFields都会收到警告:

buildTypes {
        def BOOLEAN = "boolean"
        def STRING = "String"
        def INT = "int"
        def TRUE = "true"
        def FALSE = "false"
        def SOME_PER_BUILD_TYPE_FIELD = "SOME_PER_BUILD_TYPE_FIELD"

 debug {
            buildConfigField BOOLEAN, SOME_PER_BUILD_TYPE_FIELD, FALSE
}

 release {
            buildConfigField BOOLEAN, SOME_PER_BUILD_TYPE_FIELD, TRUE
}

警告信息如下:

Warning:BuildType(debug): buildConfigField 'SOME_PER_BUILD_TYPE_FIELD' value is being replaced: false -> false
Warning:BuildType(debug): buildConfigField 'SOME_STRING_FIELD' value is being replaced: "999" -> "999"

我有好几个领域和建筑类型的警告,大概有100个。我该如何修复它们?这个警告实际上想要告诉我什么?


1
不确定如何解决这个问题,但警告本身就已经很清楚了:构建系统只是警告您某些 buildConfigField 正在被重新分配。显示的两个字段被重新分配到相同的值,这表明 A)您的构建脚本配置错误并重复评估某些表达式 B)您的构建脚本有重复赋值 C)Gradle 本身对构建脚本进行两次评估,并警告您自己的操作。 - Vasiliy
我也遇到了一些奇怪的警告/错误,使用3.0.0-alpha4版本时,但是回退到3.0.0-alpha3版本后问题就奇妙地解决了。也许你可以试试这个方法? - ItWillDo
1
是的,我相当确定这指向了我的构建脚本中的问题,正如@Vasiliy所提到的。我使用配置字段定义默认的调试和发布构建类型,但也为每个其他风味构建类型定义了构建类型,看起来因为我在debugdebug_flavor_1等中都定义了它们,gradle将其指出为错误,而以前没有。我已将默认的调试和发布类型重命名为debug_defaultrelease_default,所有错误似乎都已消失。 - Daniel Wilson
1
@Vasiliy 如果你回答了,我会标记它为这样 :) - Daniel Wilson
最后,我需要在自定义调试变体上使用initWith debug,以便它们继承BuildConfig.DEBUG为true。 - Daniel Wilson
3个回答

25

原因已经由Vasiliy正确提到。只是为了补充一点,可能的原因之一是当您有一个使用其他任何构建类型初始化的buildType时。例如,请考虑以下构建配置:

debug {
    buildConfigField 'boolean', 'ENABLE_CRASH_REPORTING', 'false'
}
stage {
    initWith(buildTypes.debug)
    buildConfigField 'boolean', 'ENABLE_CRASH_REPORTING', 'true'
}
release {
    buildConfigField 'boolean', 'ENABLE_CRASH_REPORTING', 'true'
}

在这种情况下,您将会收到一个有关于buildType阶段的警告:

警告:BuildType(stage):buildConfigField 'ENABLE_CRASH_REPORTING'的值被替换了:false -> true

原因很简单明显,即stage继承了debug的所有字段,然后stage用自己的值进行了替换,因为您可能想要为stage分配不同的值(就像上面的情况一样)。一种可能的解决方法是进行替换。

initWith(buildTypes.debug)

随着

signingConfig signingConfigs.debug

这将解决构建阶段通常出现的签名错误。但是,现在配置的主要区别是:在此情况下,stage 不会从 debug 继承构建变量,因此您也不会收到任何警告。此外,在此情况下,您将不得不重新定义所有的构建变量在 stage 中(已经提到),因为 stage 不再从 debug 继承。


1
如果你能够将构建变量移动到defaultConfig而不是debug中,它就不会产生警告。 - Carson Holzheimer
2
这不是真正的好解决方案 - 如果您有两种以上的构建类型,没有initWith将变得繁琐且容易出错。 - dant3
非常普遍的原因,但是通常不能令人满意地解决问题的非常具体的解决方案:我正在使用initWith来防止多个buildType配置的重复,包括minifyEnabled、shrinkResources和proguardFiles。因此,我认为initWith是一个非常有用的buildType配置。有一个单独的buildConfigField我想要覆盖,但是我想要“initWith”任何其他配置(与signingConfig无关),所以这个解决方案对我来说没有意义。 - P Kuijpers

12

构建系统警告您某些buildConfigField正在被重新赋值。

这两个显示的字段将被重新赋给相同的值,这表明可能正在发生以下情况之一:

  1. 您的构建脚本配置不正确,并且对某些表达式进行了两次评估
  2. 您的构建脚本有重复的赋值
  3. gradle自身对构建脚本进行了两次评估,并向您发出其自己的警告

23
有没有关于如何抑制警告的想法。替换依赖于构建变体的buildConfigValues是正常的使用情况。 - Patrick
1
@for3st,你解决了如何抑制这个警告的问题了吗? - i am E
3
最近我研究了如何抑制警告。从源代码来看,这些信息被记录在日志级别为INFO的位置,因此默认情况下不应该出现在控制台输出中(默认日志级别为LIFECYCLE,比INFO更简洁)。但是,文档包括以下说明:“无论使用哪个日志级别,控制台的精美组件(构建状态和正在进行的工作区域)都将被显示。在Gradle 4.0之前,这些精美组件只会在日志级别为LIFECYCLE或更低时显示。” 所以我不确定是否有办法抑制富组件中的消息 :/ - stkent
1
来源:日志文档源代码 - stkent
请监控此问题以寻求潜在的解决方案(:fingerscrossed:)https://issuetracker.google.com/issues/68849483 - tir38
显示剩余2条评论

2
最简单的解决方案是将debug部分中的所有buildConfigField移动到defaultConfig部分。原始答案翻译成"最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接