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」クラスにすでにアタッチされている既存のextras プロパティを利用できます。これは、カスタムのユーザー定義変数を許可するために特別に設計されました。

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

その後、後でそのように参照できます。カスタム変数を other に追加しなかった場合は、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 に答える