2013-08-08 19 views
13

Ho due versioni di un'app che hanno ciascuna la propria chiave di google maps (v1) per il debug e il rilascio (ovvero 4 chiavi totali). Quindi mi piacerebbe sapere se posso specificare i set sorgente basati su buildType e productFlavor. In sostanza, mi chiedo come posso ottenere qualcosa di simile:Come posso specificare per source buildType sourceSets?

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

Dove Gradle utilizzerà il src/<currentBuldType>/<currentProductFlavor>/* come parte del suo sourceSet.

In sostanza voglio in modo che se corro gradle assembleFlavor1Debug includerà tutto sotto src/main/*, src/flavor1/* e src/debug/flavor1/*.

mio build.gradle è super semplice:

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

Qualche idea? O forse un approccio migliore a questo?

risposta

4

per Google Maps API di integrazione è possibile controllare il mio codice di esempio Gradle qui: https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks

Fondamentalmente fare un piccolo trucco in android.applicationVariants.all durante la fase di mergeResources e inserire la chiave API strings.xml sotto diversi flaver combinazione/buildtype cartella.

+0

Accetto la tua risposta perché è molto simile a come ho finito per fare le cose. – smoak

11

Mi è capitato di tornare su questo a causa di un commento sulla mia risposta e ho capito che questa risposta è superflua (ancora meglio di quella accettata che lo è ancora di più). Per ogni prodotto Flavor e buildType, esistono già combinazioni e set di fonti individuali. Ad esempio src/{buildType}, src/{productFlavor} e src/{productFlavor}{buildType} sono già disponibili cartelle di origine.

Quindi, in sostanza, tutto ciò che era necessario per l'OP era mettere le risorse in src/flavor1Debug che è equivalente allo src/debug/flavor1 che l'OP prevede.

RISPOSTA VECCHIO: Ho fatto qualcosa di simile con buildConfig ma si spera che dovrebbe funzionare con sourceSets.

Fondamentalmente, si definiscono le cose comuni al livello productFlavors in una variabile e si continua ad aggiungere le cose mentre si scende.

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

      } 
     } 
} 

Non ho provato questo. Penso che potrebbe essere necessario utilizzare android.sourceSets anziché solo sourceSets.

Ho anche avuto bisogno di definire risorse separate per il productFlavors così ho usato una dichiarazione separata in ritardo nel file di build. In questo modo:

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

Si dovrebbe solo essere in grado di utilizzare android.sourceSets.flavor1.debug invece se è necessario.

Si noti inoltre che in base al Gradle Android user guide, utilizzando srcDir si aggiunge la directory alle origini predefinite e srcDirs le sostituisce.

+0

Come farei questo dinamicamente? Ho sourceSets.whenObjectAdded {sourceSet -> sourceSet.java.srcDirs = "someDir"} e quindi i set sorgente definiti per flavor come questo: sourceSets {flavor1 {} flavor2 {}}.Voglio fare qualcosa di simile: sourceSet.debug.java.srcDirs = "someDir" per ogni gusto del prodotto e per buildType. – box

+0

Ho modificato la risposta, hai ancora bisogno di qualcosa di più personalizzato? –

+0

Hy @saad farooq Sono a conoscenza della soluzione che è stata modificata (grazie per averla postata comunque!), Tuttavia i sapori del mio prodotto sono complessi e riutilizziamo le risorse. Potrei dover ripensare a ciò che sto facendo, ma la soluzione dinamica per me sarebbe più bella, dal momento che ho 12 gusti di prodotto e non voglio creare altre cartelle come questo flavor1Release, flavor1Debug, flavor1DebugFull. Ciò porterebbe a un permutaion di troppe cartelle, richiede molto tempo per mantenerlo. Ho postato una domanda anche: http://stackoverflow.com/questions/41589641/gradle-sourcesets-by-productflav-and-buildtype – box

Problemi correlati