Android gradle 3.0.0 buildConfigField предупреждение после обновления

Недавно я установил последнюю версию 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
}

Предупреждения читаются следующим образом:

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 повторно назначается.

Два отображаемых поля переустанавливаются на одно и то же значение, которое указывает, что может произойти один из следующих сценариев:

  • ваша сборка script неверно сконфигурирована и оценивает некоторое выражение дважды
  • у вашей сборки script есть дубликаты присвоений
  • gradle сам по себе дважды вычисляет конструкцию script и предупреждает вас о своих действиях

Ответ 2

Причина правильно указана Василием. Просто добавить немного к этому, одна из возможных причин этого может быть, когда у вас есть 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'
}

В этом случае вы получите предупреждение для этапа buildType

Предупреждение: BuildType (stage): значение 'ENABLE_CRASH_REPORTING' buildConfigField заменяется: false → true

Причина довольно проста и очевидна, что stage наследует все поля от отладки, а затем stage заменяет его, потому что вы можете назначить им другое значение для stage (как в случае выше). Возможным обходным путем может быть замена

initWith(buildTypes.debug)

с

signingConfig signingConfigs.debug

Это устранит ошибку подписи, которую вы обычно получаете при сборке этапов сборки. Но главное отличие здесь в конфигурации сейчас; Этап не будет наследовать переменные сборки отладки в этом случае, и поэтому вы также не получите никакого предупреждения для этого. Также в этом случае вам придется переопределить все переменные сборки на этапе, поскольку (уже упоминавшийся) этап больше не наследуется от отладки.

Ответ 3

Самое наивное решение - переместить все buildConfigField раздела debug раздел defaultConfig.