2013-07-17 72 views
19

有沒有什麼辦法可以在android插件中爲gradle添加自定義屬性到productFlavor或buildType? 我希望在配置buildVariants時具有這種額外的靈活性,以便在爲buildVariants指定任務時檢查自定義屬性。Gradle Android插件 - 添加自定義風味屬性?

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提供不同類型的自定義屬性的映射。

回答

14

有一種替代解決方案不需要創建自己的自定義類。您可以使用已經附加到'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) { 
      ... 
     } 
    } 
} 
20

您可以擴展對象以動態添加屬性。 所以,你可以做到這一點的味道對象上得到補充,當他們使用這樣的事情:

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

+0

Xav,非常感謝您的快速回復! – blackdigger

+1

我設法做到這一點通過以下方式:定義「機器人」部分上方擴展類 - 否則它給編譯錯誤: 類BooleanExtension { 布爾值 BooleanExtension(布爾值){ \t THIS.VALUE =值 } 公共無效的setValue(布爾值){ \t THIS.VALUE =值 } 公共布爾的getValue(){ \t返回值 }} 然後 寫: widevineAppDrm { ... useWidevineAppDrmLib.v alue true ... } .... and: if(variant.productFlavors.get(0).useWidevineAppDrmLib.value){...} – blackdigger

+1

還有一兩件事,以增加風味延長我不得不這樣做: productFlavors.whenObjectAdded {味 - > flavor.extensions.create( 「useWidevineAppDrmLib」,BooleanExtension,FALSE) } – blackdigger