Как получить значение ресурса в build.gradle?
Метод resValue
(или все, что он вызывает) позволяет вам установить значение ресурса в buildTypes
или productFlavors
. Есть ли соответствующий способ получить значение ресурса, которое было установлено resValue
?
Похоже, что productFlavors
оценивается до buildTypes
, поэтому a resValue
, установленный в buildTypes
, имеет приоритет. Я хочу добавить "Debug" к имени приложения в сборках отладки, но мне нужно получить значение, которое было настроено в цвете продукта, чтобы добавить к нему.
Изменить: Я попробовал предложение Marcin Koziński использовать переменную, но все вкусы продукта оцениваются до любого типа сборки. Поэтому это не работает:
android {
String appName = ""
productFlavors {
Foo {
appName = "Foo"
}
Bar {
appName = "Bar"
}
}
buildTypes {
release {
resValue "string", "app_name", appName
}
debug {
resValue "string", "app_name", appName + " Debug"
}
}
}
В buildTypes
, appName
всегда имеет значение из последнего вкуса продукта. Таким образом, в этом примере все сборки получают имя "Bar"
или "Bar Debug"
.
В принципе, мне нужен resValueSuffix
, аналогичный applicationIdSuffix
. По-видимому, такого животного нет. Предоставляет ли плагин com.android.application
все, что я мог бы использовать для достижения этого?
Ответы
Ответ 1
Если вы только пытаетесь установить метку приложения (или другие значения манифеста), вы можете решить эту проблему с помощью манифестных заполнителей.
android {
productFlavors {
Foo {
applicationId "com.myexample.foo"
manifestPlaceholders = [ appName:"Foo"]
}
Bar {
applicationId "com.myexample.bar"
manifestPlaceholders = [ appName:"Bar"]
}
}
buildTypes {
release {
manifestPlaceholders = [ appNameSuffix:""]
}
debug {
manifestPlaceholders = [ appNameSuffix:".Debug"]
applicationIdSuffix ".debug"
}
}
}
Затем в вашем манифесте Android вы просто используете оба заполнителя для имени вашего приложения (или других значений)
<application
android:label="${appName}${appNameSuffix}"
...
</application>
Это позволяет вам устанавливать все 4 варианта бок о бок на одном устройстве, а также давать им разные имена в ящике/запуска приложения.
Ответ 2
Вы можете проверить варианты сборки следующим образом
Определить значения в gradle
buildTypes {
debug{
buildConfigField "String", "Your_string_key", '"yourkeyvalue"'
buildConfigField "String", "SOCKET_URL", '"some text"'
buildConfigField "Boolean", "LOG", 'true'
}
release {
buildConfigField "String", "Your_string_key", '"release text"'
buildConfigField "String", "SOCKET_URL", '"release text"'
buildConfigField "Boolean", "LOG", 'false'
}
}
И для доступа к этим значениям с использованием вариантов сборки:
if(!BuildConfig.LOG)
// do something with the boolean value
или
view.setText(BuildConfig.yourkeyvalue);
Ответ 3
Чтобы иметь альтернативную версию ресурса в отладочных сборках, вы можете использовать набор отладочных источников.
strings.xml
можно найти по следующему пути src/main/res/values
, что означает его в основном наборе источников. Если вы создаете новый каталог src/debug/res/values
, вы можете поместить в него новый strings.xml
файл со значениями, которые должны быть переопределены в отладочных сборках. Например:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application Debug</string>
</resources>
Это заменит любое значение app_name
в вашем основном файле. Вам не нужно дублировать все строки здесь - те, которые вы здесь не включаете, просто берутся из основного файла.