2013-08-08 5 views
13

Ich habe 2 Varianten einer App, die jeweils einen eigenen Google Maps (v1) -Schlüssel für Debug und Release haben (also insgesamt 4 Schlüssel). Also würde ich gerne wissen, ob ich SourceSets basierend auf BuildType und ProductFlavor angeben kann. Im Grunde frage ich mich, wie ich so etwas wie dies erreichen können:Wie kann ich pro Geschmack buildType sourceSets angeben?

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

Wo gradle die src/<currentBuldType>/<currentProductFlavor>/* als Teil seiner sourceSet verwenden.

Grunde möchte ich es so, dass wenn ich gradle assembleFlavor1Debug laufen sie alles unter src/main/*, src/flavor1/* und src/debug/flavor1/* umfassen wird.

ist mein build.gradle super einfach:

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' 
     } 
    } 
} 

Irgendwelche Gedanken? Oder vielleicht ein besserer Ansatz dazu?

Antwort

4

Für Google Maps API-Integration können Sie meinen gradle Beispielcode hier überprüfen: https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks

Im Grunde einen kleinen Trick tun in android.applicationVariants.all während der mergeResources Phase, und legen Sie den API-Schlüssel in strings.xml unter verschiedenen flaver/buildtype Kombination Mappe.

+0

Ich akzeptiere deine Antwort, weil das sehr ähnlich ist, wie ich am Ende Sachen gemacht habe. – smoak

11

Ich bin zufällig wegen eines Kommentars auf meine Antwort darauf zurückgekommen und habe festgestellt, dass diese Antwort überflüssig ist (immer noch besser als die akzeptierte, die noch mehr ist). Für jedes productFlavor- und buildType-Objekt sind Kombinationen und einzelne Quellensets bereits vorhanden. d.h. src/{buildType}, src/{productFlavor} und src/{productFlavor}{buildType} sind bereits verfügbare Quellordner.

Also, alles, was für das OP benötigt wurde, war, die Ressourcen in src/flavor1Debug zu setzen, die der src/debug/flavor1 entspricht, die das OP vorsieht.

ALTE ANTWORT: Ich habe etwas Ähnliches mit buildConfig getan, aber hoffentlich sollte es mit sourceSets arbeiten.

Im Wesentlichen definieren Sie die allgemeinen Sachen auf der Ebene productFlavors in einer Variablen und fügen Dinge hinzu, wenn Sie nach unten gehen.

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' 
        } 

      } 
     } 
} 

Ich habe dies nicht getestet. Ich denke, Sie müssen android.sourceSets anstatt nur sourceSets verwenden.

Ich musste auch separate Ressourcen für die productFlavors definieren, so dass ich eine separate Anweisung spät in der Build-Datei verwendet. Wie so:

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

sollten Sie nur in der Lage sein android.sourceSets.flavor1.debug stattdessen zu verwenden, wenn Sie benötigen.

Beachten Sie auch, dass nach der Android Gradle user guide, srcDir fügt das Verzeichnis zu den Standardquellen und srcDirs ersetzt sie.

+0

Wie würde ich das dynamisch machen? Ich habe sourceSets.whenObjectAdded {sourceSet -> sourceSet.java.srcDirs = "someDir"} und dann die Quellsätze wie folgt definiert: sourceSets {flavour1 {} flavour2 {}}.Ich möchte etwas wie: sourceSet.debug.java.srcDirs = "someDir" für jedes Produkt-Flavour und pro buildType machen. – box

+0

Ich habe die Antwort bearbeitet, brauchen Sie noch etwas mehr Brauch? –

+0

Hy @saad farooq Ich bin mir der Lösung bewusst, die bearbeitet wurde (danke, dass du sie trotzdem gepostet hast!), Aber meine Produktaromen sind komplex und nutzen Ressourcen wieder. Ich muss vielleicht überdenken, was ich mache, aber die dynamische Lösung für mich wäre schöner, da ich 12 Produktvarianten habe und keine zusätzlichen Ordner wie diese flavor1Release, flavor1Debug, flavour1DebugFull erstellen möchte. Dies würde zu einer Permutation von zu vielen Ordnern führen, deren Pflege zeitaufwendig ist. Ich habe auch eine Frage gestellt: http://stackoverflow.com/questions/41589641/gradle-sourceset-by-productflavor-and-buildtype – box

Verwandte Themen