Gradle всегда принимать значения из типа build внутри последнего аромата

В компании, где я работаю, мы используем много вкусов в наших внутренних и внешних проектах. Плюс 2 или 3 типа сборки тоже (dev, prod и qa), и иногда нам нужно изменять определенные переменные в определенном buildType внутри аромата.

Вот где проблема возникает, когда у меня есть еще один аромат, Groovy всегда принимает конфигурации последнего типа buildType.

Пример:

Прежде всего, я определяю новые типы buildTypes:

android {
...
 buildTypes {
        development {
            initWith debug
        }
        production {
            initWith release
        }
    }
...
}

Затем я определяю ароматы с конкретными изменениями buildType:

productFlavors {
     mcDonalds {
           ...
            buildTypes {
                development {
                    manifestPlaceholders = [onesignal_app_id               : "4b77f560-26f3-420d-b438-d7aeb9912d4d",
                                            onesignal_google_project_number: "REMOTE"]
                }
                production {
                    manifestPlaceholders = [onesignal_app_id               : "6b77f560-26f3-420d-b438-d7aeb9912d33",
                                            onesignal_google_project_number: "REMOTE"]
                }
            }
        }
        burgerKing {
           ...
            buildTypes {
                development {
                    manifestPlaceholders = [onesignal_app_id               : "8b77f560-26f3-420d-b438-d7aeb9912d44",
                                            onesignal_google_project_number: "REMOTE"]
                }
                production {
                    manifestPlaceholders = [onesignal_app_id               : "0b77f560-26f3-420d-b438-d7aeb9912456",
                                            onesignal_google_project_number: "REMOTE"]
                }
            }
        }
}

Независимо от вкуса, который я выбираю для сборки, gradle всегда будет принимать значения из последнего вкуса, и когда я отправлю push-уведомление пользователям mcDonalds, все пользователи burgerKing получат объявления о большом mac.

Google сказал, что он предназначен, и этого не произойдет, если я использую build.gradle.ktl. Я не понимаю, как они могут сказать, что это предназначено. Для меня это проблема Groovy, это ошибка, и все больше людей сообщают о той же проблеме в трекере проблем.

Какое обходное решение вы предлагаете?

Пожалуйста, не советуйте мне использовать другое измерение, это не сработает, потому что конфигурации меняются в каждом стиле flavor/buildType, и я думаю, что это смешно в отношении количества вариантов сборки:

  • mcDonaldsDevelopmentDebug
  • mcDonaldsDevelopmentRelease
  • mcDonaldsProductionDebug
  • mcDonaldsProductionRelease
  • burgerKingDevelopmentDebug
  • burgerKingDevelopmentRelease
  • burgerKingProductionDebug
  • burgerKingProductionRelease

Все, что мне нужно, это что-то вроде этого:

  • mcDonaldsDevelopment
  • mcDonaldsProduction
  • burgerKingDevelopment
  • burgerKingProduction

Ответ 1

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

 buildTypes {
    production {
        minifyEnabled true
        signingConfig signingConfigs.release
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    development {
        minifyEnabled false
    }
}

productFlavors {
    mcDonalds {
        resValue "string", "key1", "value1"
        resValue "string", "key2", "value2"
    }
    burgerKing {
        resValue "string", "key1", "value1"
        resValue "string", "key2", "value2"
    }

}

Это создаст следующие варианты сборки с разными конфигами

  1. mcDonaldsDevelopment
  2. mcDonaldsProduction
  3. burgerKingDevelopment
  4. burgerKingProduction

также в своем коде вы можете проверить, если вы производите разработку с использованием следующего

if (BuildConfig.DEBUG) {
       //select string for development (key1)
    } else {
       //select string for production (key2)
    }