2014-10-24 6 views
21

Ho e vecchia app Android che sto cercando di migrare al sistema di build gradle Android. L'app è attualmente costruita in una configurazione multi-progetto e pubblicata come quattro diverse app (due set di dati diversi inclusi e versioni gratuite/a pagamento per entrambi i set di dati). Sono riuscito ad allontanarmi dalla configurazione multi-progetto usando flavourDimensions (precedentemente chiamato flavorGroups), ma non riesco a capire come impostare un ID di applicazione diverso per ciascuna combinazione di sapori.Come impostare ID di applicazione diversi per ciascuna combinazione di sapori utilizzando flavorDimensions?

Poiché le versioni dell'app sono già state pubblicate, è necessario mantenere lo stesso applicationid attualmente. A causa di come è stata eseguita la denominazione del pacchetto originale, non posso semplicemente utilizzare la combinazione flavor-buildtype con "packageNameSuffix" (che sarebbe stata un'ottima opzione se si trattasse di un'applicazione non pubblicata).

https://stackoverflow.com/a/20956353/4177090 sta rispondendo come utilizzare diverse cartelle di origine per combinazioni di sapori, ma non come (se possibile) impostare una configurazione specifica per ciascuna combinazione nel file di generazione.

Gradle build frammento:

flavorDimensions "price", "dataset" 

productFlavors { 
    free { flavorDimension "price" } 
    paid { flavorDimension "price" } 
    dataset1 { flavorDimension "dataset" } 
    dataset2 { flavorDimension "dataset" } 
} 

Vorrei avere qualcosa di simile a quanto segue nel mio file di generazione Gradle (si noti come unlogic mia denominazione è, motivo per cui non posso usare packageNameSuffix):

freeDataset1 { applicationId "com.beansys.freeappdataset1" } 
freeDataset2 { applicationId "com.beansys.freedataset2" } 
paidDataset1 { applicationId "com.beansys.dataset1paid" } 
paidDataset2 { applicationId "com.beansys.mypaiddataset2" } 
+0

Perché non butti via le dimensioni e crei aromi separati? – Simas

+0

Grazie per il suggerimento. Potrei farlo, ma in tal caso dovrei duplicare le cartelle dei sorgenti di sapore, cioè i dati del dataset1 verrebbero duplicati in entrambe le cartelle freeDataset1 e nella cartella paidDataset1. Se la duplicazione di codice e dati è la mia unica opzione, preferisco tornare "indietro" all'utilizzo di una soluzione multi-progetto (non molto pulita, ma almeno migliore della duplicazione del contenuto della mia cartella sorgente). – Fredrik

+0

Perché hai collegato la risposta che suggerisce più cartelle? – Simas

risposta

6

Sono finalmente riuscito a risolvere questo. Penso che la soluzione sia elegante (anche se il codice reale potrebbe molto probabilmente essere scritto molto più bello da qualcuno con una profonda conoscenza).

soluzione per impostare una specifica ApplicationID per ciascuna variante combinata:

flavorDimensions "price", "dataset" 

productFlavors { 
    free { flavorDimension "price" } 
    paid { flavorDimension "price" } 
    dataset1 { flavorDimension "dataset" } 
    dataset2 { flavorDimension "dataset" } 
} 

android.variantFilter { variant -> 
    def flavorString = "" 
    def flavors = variant.getFlavors() 
    for (int i = 0; i < flavors.size(); i++) { 
     flavorString += flavors[i].name; 
    } 
    if(flavorString.equalsIgnoreCase("freeDataset1")) { 
     variant.getDefaultConfig().applicationId "com.beansys.freeappdataset1" 
    } 
    if(flavorString.equalsIgnoreCase("freeDataset2")) { 
     variant.getDefaultConfig().applicationId "com.beansys.freedataset2" 
    } 
    if(flavorString.equalsIgnoreCase("paidDataset1")) { 
     variant.getDefaultConfig().applicationId "com.beansys.dataset1paid" 
    } 
    if(flavorString.equalsIgnoreCase("paidDataset2")) { 
     variant.getDefaultConfig().applicationId "com.beansys.mypaiddataset2" 
    } 
} 
19

La soluzione proposta da Fredrik ha smesso di funzionare dopo l'aggiornamento Android 1.0.2 Studio di (e plug Gradle a 1.0.0) quindi ho dovuto aggiungi le seguenti modifiche, aggiornato al plugin gradle 1.3.1:

flavorDimensions "price", "dataset" 

productFlavors { 
    free { dimension "price" } 
    paid { dimension "price" } 
    dataset1 { dimension "dataset" } 
    dataset2 { dimension "dataset" } 
} 

android.applicationVariants.all { variant -> 
    def mergedFlavor = variant.mergedFlavor 
    switch (variant.flavorName) { 
     case "freeDataset1": 
      mergedFlavor.setApplicationId("com.beansys.freeappdataset1") 
      break 
     case "freeDataset2": 
      mergedFlavor.setApplicationId("com.beansys.freedataset2") 
      break 
     case "paidDataset1": 
      mergedFlavor.setApplicationId("com.beansys.dataset1paid") 
      break 
     case "paidDataset2": 
      mergedFlavor.setApplicationId("com.beansys.mypaiddataset2") 
      break 
    } 
}