更新后Android gradle 3.0.0 buildConfigField警告

Dan*_*son 15 android build.gradle android-gradle-plugin

我最近安装了最新的Canary版本的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
}
Run Code Online (Sandbox Code Playgroud)

警告内容如下:

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"
Run Code Online (Sandbox Code Playgroud)

对于我的各种领域和构建类型,其中有100个.我如何解决它们以及实际告诉我的警告是什么?

Reh*_*han 18

Vasiliy正确地提到了这个原因.只是为它添加一点,一个可能的原因可能是当你有一个使用任何其他buildType初始化的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'
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将收到buildType阶段的警告

警告:BuildType(阶段):buildConfigField'ENABLE_CRASH_REPORTING'值正被替换:false - > true

原因非常简单明了,stage继承了debug中的所有字段,然后stage替换了它,因为你可能希望为stage 赋予不同的值(如上例所示).可能的解决方法可能正在取代

initWith(buildTypes.debug)
Run Code Online (Sandbox Code Playgroud)

signingConfig signingConfigs.debug
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是一个很好的解决方案 - 那么你有两种以上的构建类型没有 initWith 变得麻烦且容易出错 (2认同)

Vas*_*liy 7

Build system warns you that some buildConfigField is being re-assigned.

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

  1. 您的构建脚本配置错误,并且两次评估了一些表达式
  2. 您的构建脚本具有重复的分配
  3. gradle会自行评估构建脚本两次,并警告您有关其自身的操作

  • 关于如何抑制警告的任何想法。替换依赖于构建变量的buildConfigValues是一个正常的用例 (15认同)
  • 我最近考虑取消警告。从源头看,该信息正在以日志记录级别INFO记录,因此默认情况下它不应出现在控制台输出中(默认日志级别为LIFECYCLE,比INFO更为详细)。但是,文档中包含以下注释:“无论使用什么日志级别,都会显示控制台的丰富组件(构建状态和正在进行的工作区域)。在Gradle 4.0之前,这些丰富组件仅以日志级别LIFECYCLE或更低级别显示。” 所以我不确定是否有一种方法可以抑制丰富组件中的消息:/ (2认同)