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.

Другие вопросы по тегам