Настраиваемые поля для типа сборки в gradle

#android #gradle

#Android #gradle

Вопрос:

Я пытаюсь встроить несколько адресов сервера в свой файл build.gradle, но я не уверен, как это сделать. Я знаю, что в maven вы можете написать

       <content.host>http://test.mysite.com</content.host>
  

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

       buildTypes {
        testBuild.initWith(buildTypes.debug)
        testBuild{ /*test server info goes here*/ }
      }
  

Но я не уверен, как я могу определить контент.разместите в gradle, используя тот же метод. Есть ли другой способ определить контент?хост в gradle или есть способ добавить пользовательское свойство в buildTypes?

Приветствия,

Деррил

Комментарии:

1. Где вы хотите использовать этот URL? В вашем Java-коде?

2. @CommonsWare да. Я могу сделать это в maven, и я бы предположил, что способ сделать это во многом похож на то, как вы сделали бы это в maven

Ответ №1:

Gradle для Android предлагает buildConfigField , позволяя добавлять произвольные элементы данных в сгенерированный кодом BuildConfig класс:

   buildTypes {
    debug {
      buildConfigField "String", "SERVER_URL", '"http://test.this-is-so-fake.com"'
    }

    release {
      buildConfigField "String", "SERVER_URL", '"http://prod.this-is-so-fake.com"'
    }

    mezzanine.initWith(buildTypes.release)

    mezzanine {
        buildConfigField "String", "SERVER_URL", '"http://stage.this-is-so-fake.com"'
    }
}
  

В вашем Java-коде вы можете ссылаться на BuildConfig.SERVER_URL , и он будет заполнен строкой на основе типа сборки, выбранного вами во время компиляции.

Комментарии:

1. Будет ли это также работать в файле сборки как расширение свойства (как это можно сделать для вкусов продукта)? Итак, я мог бы использовать BuildConfigField «SERVER_URL» в моем сценарии сборки?

2. @Zainodis: Извините, но я не узнаю термин «расширение свойства». Я не рассматривал возможность использования buildConfigField в определении вкуса продукта, поэтому я не знаю, поддерживается ли это опция.

3. основная идея этих расширений заключается в том, чтобы придать вкусам дополнительные свойства, которые вы используете во время сборки, такие как versionName и т.д., Но пользовательские. Я попытался использовать опубликованный вами код, а затем использовать их в сборке gradle, а не внутри кода моего приложения, но такие свойства, как SERVER_URL, не были распознаны в файле сборки gradle при доступе к ним как buildTypes. SERVER_URL итак, я предполагаю, что это не вариант для свойств сборки?

4. @Zainodis: Опять же, я не исследовал эту область, извините.

5. @Sumit: Не пишите приложение для Android. Фактически, поскольку пользователи веб-браузеров могут видеть URL-адреса сервера, также не пишите веб-приложения. И не пишите программное обеспечение для настольных компьютеров, поскольку оно страдает от той же проблемы, что и приложения для Android. В противном случае, по характеру работы HTTP / HTTPS, кому-то не составит труда выяснить, к какому серверу вы подключаетесь.

Ответ №2:

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

 defaultConfig {
    ...
    buildConfigField "String", "OS", '"android"'
}
  

Тогда BuildConfig выглядит так:

 public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    public static final String APPLICATION_ID = "com.example.app";
    public static final String BUILD_TYPE = "debug";
    public static final String FLAVOR = "";
    public static final int VERSION_CODE = 1;
    public static final String VERSION_NAME = "1.0";
    // Fields from default config.
    public static final String OS = "android";
  

}