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.
Ответы
Ответ 1
Есть альтернативное решение, которое не требует создания собственного пользовательского класса. Вы можете использовать уже существующее свойство extras, которое уже привязано к классу productFlavors. Это было специально разработано, чтобы разрешить настраиваемые пользователем переменные.
android {
// We can add any custom variable so long as it 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) {
...
}
}
}
Ответ 2
Вы можете расширить объект, чтобы добавить свойство динамически.
Таким образом, вы можете сделать это на объекте аромата, когда они будут добавлены, используя что-то вроде этого:
// 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.