Как определить и использовать константу в скрипте сборки Gradle (Android)?

Я работаю над приложением для Android с Gradle в качестве системы сборки.

Моя цель - использовать значение (имя пакета) как applicationId:

productFlavors {
   orange {
      applicationId "com.fruits.android.orange"
      // ...

Но также выставить его через BuildConfig, чтобы Java-код имел к нему доступ.

Этот доступ должен быть извне (а именно, бесплатная версия приложения должна знать имя пакета платной версии, чтобы она могла предложить пользователю выполнить обновление в магазине Play).

Итак, я хотел бы сделать что-то вроде этого:

productFlavors {
   orange {
      applicationId orangeProPackage
      // ...


buildConfigField 'String', 'ORANGE_PRO_PACKAGE', "$orangeProPackage" // ?

Только я не уверен, как определить orangeProPackage, чтобы он был виден во всем build.gradle и не ломал скрипт.

Поскольку есть несколько разных вкусов, было бы лучше, если бы я мог как-то сгруппировать все эти константы вот так (наверное?):

def proPackages = [
        orange: "..."
        apple: "..."
        banana: "..."
]

а затем ссылайтесь на них в понятной и описательной манере, например proPackages.orange и т. д.

Вопрос в том, как этого добиться?

Это не дубликат Это можно ли объявить переменную в Gradle пригодной для использования в Java?

Я видел этот вопрос (и несколько других). Я знаю, как объявить buildConfigFields, у меня их уже предостаточно. Мой вопрос касается повторного использования того же значения, что и buildConfigField и applicationId.


person Konrad Morawski    schedule 26.10.2015    source источник
comment
Возможный дубликат Можно ли объявить переменная в Gradle, которую можно использовать в Java?   -  person ThomasThiebaud    schedule 26.10.2015
comment
@Maloubobola это не дубликат. Я видел этот вопрос (и несколько других). Я знаю, как объявить buildConfigFields, у меня их уже предостаточно. Мой вопрос касается повторного использования того же значения, что и buildConfigField и applicationId.   -  person Konrad Morawski    schedule 26.10.2015


Ответы (1)


Только я не уверен, как определить OrangeProPackage, чтобы он был виден во всем build.gradle и не ломал скрипт.

Вы можете поместить его в gradle.properties в корне вашего проекта. Как и другие файлы .properties, это просто хранилище ключей и значений:

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp

Затем вы ссылаетесь на него как на простую глобальную строковую переменную (ORANGE_PRO_PACKAGE) в вашем build.gradle:

buildConfigField 'String', 'ORANGE_PRO_PACKAGE', '"' + ORANGE_PRO_PACKAGE + '"'

было бы лучше, если бы я мог как-то сгруппировать все эти константы

Все, что связано с файлами .properties, с этим не справится. Там вы можете искать определение глобальных переменных в файле build.gradle верхнего уровня только в простом коде Groovy или что-то в этом роде.

person CommonsWare    schedule 26.10.2015
comment
На самом деле это должно быть buildConfigField 'String', 'ORANGE_PRO_PACKAGE', '"' + ORANGE_PRO_PACKAGE + '"', иначе значение не будет сгенерировано как строковый литерал в BuildConfig, и сборка прервется. А в остальном - работает, спасибо за подсказку. - person Konrad Morawski; 26.10.2015
comment
Можно ли использовать разные файлы .properties для каждого вкуса? Одним из преимуществ будет то, что таким образом можно сохранить один и тот же ключ (в gradle.properties) во всех вариантах. В зависимости от вкуса, поскольку файл изменится, значения этих ключей будут другими. Если использовать один и тот же файл gradle.properties для строки, значение которой изменяется в зависимости от вкуса, нам понадобятся разные ключи в одном файле .properties, которые со временем сложнее поддерживать. - person Shobhit Puri; 15.03.2017
comment
@ShobhitPuri: Можно ли использовать разные файлы .properties для каждого вкуса? -- нет ничего автоматического для этого AFAIK. Но Gradle — это Groovy, поэтому вы можете читать любые файлы с вашего компьютера для разработки, которые вы хотите, в своих сценариях сборки. - person CommonsWare; 15.03.2017