Gradle Android插件 – 添加自定义风味属性?

有没有办法在android插件中为gradle添加自定义属性到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提供不同types的自定义属性的映射。

有一种替代解决方案,不需要创建自己的自定义类。 您可以使用已经附加到’productFlavors’类的已存在的extras属性 。 这是专门为允许自定义用户定义的variables而设计的。

 android { // We can add any custom variable so long as it's prefaced with ext productFlavors { widevineAppDrm { ext.useWidevineAppDrmLib = true } } } 

然后您可以稍后参考。 请注意,如果您没有将自定义variables添加到其他productFlavors您需要确保先检查它,否则gradle会抱怨找不到该属性。

 android.applicationVariants.each { variant -> if (variant.productFlavors[0].ext.has("useWidevineAppDrmLib")) { if (variant.productFlavors.get(0).ext.useWidevineAppDrmLib) { ... } } } 

您可以扩展对象以动态添加属性。 所以当你添加时,你可以在flavor对象上做到这一点,使用类似这样的东西:

 // 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的反馈。