20

有没有办法在 gradle 的 android 插件中向 productFlavor 或 buildType 添加自定义属性?我希望在 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 中看到相同的属性,这样我就可以检查该属性值并构建其他任务,例如在属性设置为 true 时打包其他 .so 文件:

android.applicationVariants.each { variant -> if(variant.mergedFlavor.useWidevineAppDrmLib ) { ... // add copy .so task } }

也许已经有办法做到这一点,但我还没有发现......检查子字符串(风味名称)的构建变体名称对我有用,但它看起来很脏。

理想情况下,我希望为 buildType 和 productFlavor 提供不同类型的自定义属性的映射。

4

2 回答 2

21

您可以扩展对象以动态添加属性。因此,您可以在添加风味对象时使用以下内容:

// 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 的反馈进行编辑以使代码实际工作。

于 2013-07-17T19:16:38.253 回答
17

有一个替代解决方案不需要创建您自己的自定义类。您可以利用已经附加到“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) {
            ...
        }
    }
}
于 2015-04-13T19:01:57.737 回答