Подтвердить что ты не робот

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.

4b9b3361

Ответ 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.