2013-07-17 8 views
19

gradleのandroidプラグインのproductFlavorまたはbuildTypeにカスタム属性を追加する方法はありますか? buildVariantsの設定にこのような柔軟性を追加したいので、buildVariantsのタスクを指定するときに私のカスタムプロパティをチェックすることができます。ので、ここでGradle Android Plugin - カスタムフレーバ属性を追加しますか?

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" を追加しました見ることができます。 属性がtrueに設定されている場合、私がその属性の値を確認することができますし、このようなパッケージの追加の.soファイルなどの追加タスクを構築すればよいように、buildVariant.mergedFlavorで同じ属性を参照するとよいでしょう:

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 ... } ....と if(variant.productFlavors.get(0).useWidevineAppDrmLib.value){...} – blackdigger

+1

ともう一つ、味の拡張子を追加するために私がしなければならなかった: productFlavors.whenObjectAdded {味を - > flavor.extensions.create( "useWidevineAppDrmLib"、BooleanExtension、偽) を} – blackdigger

関連する問題