Gradle Android Plugin - добавить собственный атрибут аромата?
Есть ли способ добавить пользовательские атрибуты для productFlavor или buildType в плагине Android для Gradle? Мне бы хотелось иметь такую дополнительную гибкость в настройке buildVariants, чтобы я мог проверять свое пользовательское свойство при определении задач для buildVariants.
productFlavors {
flavorGroups "drm", "storeType"
googlePlay {
flavorGroup "storeType"
buildConfig "public static final String TARGET_STORE = \"google\";"
}
samsungApps {
flavorGroup "storeType"
buildConfig "public static final String TARGET_STORE = \"samsung\";"
}
platformDrm {
flavorGroup "drm"
}
widevineAppDrm {
flavorGroup "drm"
minSdkVersion 9
useWidevineAppDrmLib true
}
}
так что здесь вы можете видеть, что я добавил пользовательский атрибут "useWidevineAppDrmLib" для создания аромата. Было бы неплохо увидеть тот же атрибут в buildVariant.mergedFlavor, чтобы я мог проверить это значение атрибута и создать дополнительные задачи, такие как пакет дополнительных.so файлов, когда для атрибута установлено значение true:
android.applicationVariants.each { variant ->
if(variant.mergedFlavor.useWidevineAppDrmLib ) {
... // add copy .so task
}
}
может быть, есть способ сделать это уже, но я еще не выяснил... проверка имени варианта сборки для подстроки (имя флейвора) работает для меня, но выглядит грязной.
В идеале я хотел бы иметь карту пользовательских атрибутов разных типов для buildType и productFlavor.
2 ответа
Есть альтернативное решение, которое не требует создания собственного пользовательского класса. Вы можете использовать уже существующее свойство extras, которое уже присоединено к классу 'productFlavors'. Это было специально разработано, чтобы позволить пользовательские переменные, определенные пользователем.
android {
// We can add any custom variable so long as it's prefaced with ext
productFlavors {
widevineAppDrm {
ext.useWidevineAppDrmLib = true
}
}
}
Тогда вы можете позже ссылаться, как это. Обратите внимание, если вы не добавили пользовательскую переменную в другой productFlavors
Вы должны быть уверены, чтобы проверить это сначала, иначе gradle будет жаловаться на то, что не нашел собственность.
android.applicationVariants.each { variant ->
if (variant.productFlavors[0].ext.has("useWidevineAppDrmLib")) {
if (variant.productFlavors.get(0).ext.useWidevineAppDrmLib) {
...
}
}
}
Вы можете расширить объект для динамического добавления свойства. Таким образом, вы можете сделать это на объекте аромата, когда они будут добавлены, используя что-то вроде этого:
// First declare a class that holds a boolean
class BooleanExtension {
boolean value
BooleanExtension(boolean value) {
this.value = value
}
public void setValue(boolean value) {
this.value = value
}
public boolean getValue() {
return value
}
}
android {
// add the boolean extension to all flavor object when they are created.
productFlavors.whenObjectAdded { flavor ->
flavor.extensions.create("useWidevineAppDrmLib", BooleanExtension, false)
}
// then we can set the value on the extension of any flavor object
productFlavors {
widevineAppDrm {
useWidevineAppDrmLib.value true
}
}
}
Однако это не будет передано объединенному аромату. Так что вам придется сделать
android.applicationVariants.each { variant ->
if (variant.productFlavors.get(0).useWidevineAppDrmLib.value) {
...
}
}
Отредактировано, чтобы заставить код фактически работать на основе отзывов @blackdigger.