2013-08-08 7 views
13

私は、デバッグとリリースのためのGoogleマップ(v1)キーをそれぞれ持っている2つの味のアプリを持っています(合計4つのキーを意味します)。ですから、buildTypeとproductFlavorに基づいてsourceSetsを指定できるかどうかを知りたいと思います。どのようにして1つのフレーバbuildType sourceSetsを指定できますか?

src 
├── debug 
│   └── flavor1 
│    └── res 
│   └── values 
│    └── gmaps_key.xml 
├── release 
│ └──flavor1 
│  └── res 
│   └── values 
│    └── gmaps_key.xml 

のGradleはそののsourceSetの一部としてsrc/<currentBuldType>/<currentProductFlavor>/*を使用します。基本的に、私はこのような何かを達成することができますどのように思ったんだけど。

gradle assembleFlavor1Debugを実行すると、src/main/*src/flavor1/*、およびsrc/debug/flavor1/*のすべてが含まれるようにしてください。

私のbuild.gradleは超簡単です:

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.5.0' 
    } 
} 

apply plugin: 'android' 

android { 
    compileSdkVersion 8 

    productFlavors { 
     flavor1 { 
      packageName 'com.flavor1' 
     } 
     flavor2 { 
      packageName 'com.flavor2' 
     } 
    } 
} 

任意の考え?それとももっと良いアプローチですか?

答えて

4

Google MapsのAPIとの統合のためには、ここで私のGradleのサンプルコードを確認することができますフォルダ。

+0

これは私が物事をやり遂げた方法に非常に似ているので、私はあなたの答えを受け入れています。 – smoak

11

私の答えのコメントのために私はこれに戻ってきたが、この答えは余分なものであることに気付いた。各productFlavorとbuildTypeには、組み合わせと個別のソースセットがすでに存在します。つまり、src/{buildType},src/{productFlavor}src/{productFlavor}{buildType}はすでに使用できるソースフォルダです。

本質的に、OPのために必要だったのは、リソースがOPの想定しているsrc/debug/flavor1に相当するsrc/flavor1Debugに入れることでした。

OLD ANSWER: 私はbuildConfigと似た何かをやったが、うまくいけば、それはsourceSetsで動作するはずです。

基本的には、変数のproductFlavorsレベルに共通のものを定義し、下に移動しながら物事を追加し続けます。

productFlavors { 
     def common = 'src/main' 

     flavor1 { 
      def flavor = 'src/main/flavor1' 
      buildTypes { 
       debug { 
        sourceSets { 
         res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/debug' 
        } 
       } 

       release { 
        sourceSets { 
         res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/release' 
        } 

      } 
     } 
} 

これはテストしていません。 sourceSetsの代わりにandroid.sourceSetsを使用する必要があると思います。

私はproductFlavorsのために別々のリソースを定義する必要もありましたので、ビルドファイルの後半に別のステートメントを使用しました。これと同じように:

android.sourceSets.flavor1 { 
    res.srcDirs = ['flavor_resources/flavor1/res'] 
} 

あなたはただあなたがする必要がある場合は代わりにandroid.sourceSets.flavor1.debugを使用することができるはずです。

user guideによれば、srcDirを使用すると、デフォルトのソースにディレクトリが追加され、srcDirsがそれらを置き換えます。 mergeResources期に

https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricksは基本的にandroid.applicationVariants.allで少しトリックを行うと、異なるflaver/buildtypeの組み合わせの下でのstrings.xmlでAPIキーを配置します。

+0

これはどのように動的に行うのですか?私はsourceSets.whenObjectAdded {sourceSet - > sourceSet.java.srcDirs = "someDir"}を持っており、ソースセットは次のようにフレーバーごとに定義されています。sourceSets {flavor1 {} flavor2 {}}。私は次のようなことをしたい:sourceSet.debug.java.srcDirs = "someDir"各製品のフレーバーとbuildTypeごと。 – box

+0

私は答えを編集しました。あなたはまだもっとカスタムが必要ですか? –

+0

Hy @saad farooq私は編集した解決策を知っています(とにかく投稿していただきありがとうございます)。しかし、私の製品の味は複雑で再利用のリソースです。私は何をやっているのか考え直す必要があるかもしれませんが、私には12種類のフレーバーがあり、このflavor1Release、flavor1Debug、flavor1DebugFullのような追加のフォルダーを作成したくないので、私にとってダイナミックなソリューションはより良いでしょう。これは、あまりにも多くのフォルダのpermutaionにつながる、それを維持するために時間がかかります。私も質問を投稿しました:http://stackoverflow.com/questions/41589641/gradle-sourcesets-by-productflavor-and-buildtype – box

関連する問題