【问题标题】:Gradle Android Plugin - add custom flavor attribute?Gradle Android 插件 - 添加自定义风味属性?
【发布时间】:2013-07-15 20:24:53
【问题描述】:

有没有办法在 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 提供不同类型的自定义属性映射。

【问题讨论】:

    标签: android gradle


    【解决方案1】:

    您可以扩展对象以动态添加属性。 因此,您可以在添加风味对象时对其进行处理,使用如下方式:

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

    【讨论】:

    • 我设法做到了以下方式:在“android”部分上方定义扩展类 - 否则会产生编译错误:class BooleanExtension { Boolean value BooleanExtension(Boolean value) { this.value = value } public void setValue(Boolean value) { this.value = value } public Boolean getValue() { return value } } 然后写:widevineAppDrm { ... useWidevineAppDrmLib.value true ... } ....and: if (variant.productFlavors .get(0).useWidevineAppDrmLib.value) {...}
    • 还有一件事,要添加我必须做的风味扩展:productFlavors.whenObjectAdded { flavor -> flavor.extensions.create("useWidevineAppDrmLib", BooleanExtension, false) }
    • 你可能想让你的 BooleanExtension 使用 boolean 而不是 Boolean
    • @XavierDucrohet 感谢这个有用的答案!我想知道:是否有一些关于产品风味的 API 文档?因为我很想查看 flavor.extensions.create 方法的文档,以便弄清楚最后的“错误”是什么:)。因为我正在创建一个 StringProperty,所​​以我想弄清楚“false”是否是 BooleanProperty 或其他东西的默认值。
    • @XavierDucrohet 我也不太清楚最后一个 sn-p 的目的:android.applicationVariants.each { variant -> if (variant.productFlavors.get(0).useWidevineAppDrmLib.value) { ... } } ?关于你应该在那个 if 子句中做什么? productFlavors.get(0) 是否返回产品风味 googlePlay?或者哪些风味存储在该 productFlavors 属性/对象中?
    【解决方案2】:

    有一个替代解决方案不需要创建您自己的自定义类。您可以使用已经附加到“productFlavors”类的现有extras property。这是专门为允许自定义用户定义的变量而设计的。

    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) {
                ...
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多