Определите строку в gradle, а также используйте приложение, специфичное для вкуса.

Я видел скрипты, которые управляют задачами сборки gradle, и теперь мне интересно, можно ли установить строку за пределами `defaultConfig, но относиться к ней по умолчанию для всех вкусов.

В принципе, у меня есть несколько разновидностей, и у всех есть определенный ApplicationId. Я хочу использовать этот id для установки ресурса строки, который будет использоваться позже в моем java-коде.

defaultConfig {
    minSdkVersion 11
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}

productFlavors {
    one {
        applicationId "com.my.app.one"
    }
    two {
        applicationId "com.my.app.two"
    }
}

Я хочу установить такую ​​строку:

resValue "string", "authority", applicationId + ".dataprovider"

Что я пробовал:

  • Если я поместил его в раздел defaultConfig, applicationId все равно null, значит, я получаю неправильную строку
  • Помещение в каждую секцию аромата работает, но поскольку у меня есть несколько ароматов, создается много повторений кода.

Ищем альтернативу.

P.S. Я использую Android Studio 0.8.12.

Ответ 1

Ну, после многих поисков мне удалось найти ответ на этот вопрос. Возможно, кто-то найдет это полезным.

productFlavors.all {
    resValue "string", "authority", applicationId + ".dataprovider"
}

Этот простой фрагмент устанавливает строку для всех ароматов после, которые были установлены в их инвазивных переменных. Это похоже на defaultConfig, но не совсем так, как оно выполняется после блоков аромата.


Дополнительно:

Оказывается, я даже могу установить applicationId! До сих пор мой конечный результат:

def final String AUTHORITY = '.dataprovider'

productFlavors.all {
    applicationId "com.my.app." + name
    resValue "string", "authority", applicationId + AUTHORITY
    buildConfigField "String", "AUTHORITY", "\""+applicationId + AUTHORITY+"\""
}

Теперь я могу получить каждый авторитет поставщика ароматов через BuildConfig.AUTHORITY и @string/authority, который я использую в манифесте и в моем файле класса соответственно:

<provider
    android:name="com.my.app.DataProvider"
    android:authorities="@string/authority"
    android:exported="false" />


public class DataProvider extends ContentProvider {
    public static final String PROVIDER = BuildConfig.AUTHORITY;
    public static final Uri SEARCH_URI = Uri.parse("content://" + PROVIDER + "/search");
}

Ответ 2

Я хотел что-то подобное, поэтому я потратил около двух часов на изучение Groovy Methods. Я хотел быть в состоянии пойти против производства, песочницы и местной среды. Поскольку я ленивый, я только хотел изменить URL в одном месте. Вот что я придумал:

 flavorDimensions 'environment'
    productFlavors {
        production {
            def REMOTE_HOST = "evil-company.com"
            buildConfigField 'String', 'API_HOST', "\"${REMOTE_HOST}\""
            buildConfigField 'String', 'API_URL', "\"https://${REMOTE_HOST}/api/v1/\""
            buildConfigField 'String', 'WEB_URL', "\"https://${REMOTE_HOST}/\""
            dimension 'environment'
        }
        rickard {
            def LOCAL_HOST = "192.168.1.107"
            buildConfigField 'String', 'API_HOST', "\"${LOCAL_HOST}\""
            buildConfigField 'String', 'API_URL', "\"https://${LOCAL_HOST}/api/v1/\""
            buildConfigField 'String', 'WEB_URL', "\"https://${LOCAL_HOST}/\""
            applicationIdSuffix ".dev"
        }
    }

Альтернативный синтаксис, потому что вы можете использовать ${variable} с двойными кавычками в Groovy Methods.

rickard {
    def LOCAL_HOST = "192.168.1.107"
    buildConfigField 'String', 'API_HOST', '"' + LOCAL_HOST + '"'
    buildConfigField 'String', 'API_URL', '"https://' + LOCAL_HOST + '/api/v1/"'
    buildConfigField 'String', 'WEB_URL', '"https://' + LOCAL_HOST + '"'
    applicationIdSuffix ".dev"
}

Мне было трудно понять, что строки должны быть объявлены как строки, заключенные в кавычки. Из-за этого ограничения я не API_HOST напрямую использовать ссылку API_HOST, что я и хотел сделать в первую очередь.