Определите строку в 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
, что я и хотел сделать в первую очередь.