2015-06-05 5 views
11

Ho 2 buildTypes (debug, release) e 2 productFlavors (product1, product2). Voglio definire un buildConfigField per ogni buildType e productFlavors. Il buildConfigField è l'url dell'app per scaricare i dati dal server e cambia per ciascun prodottoFlavor e buildTypes.Code Path per Flavor in Android Gradle

Ora, ho:

buildTypes { 
    debug { 
     debuggable true 
    } 
    release { 
     debuggable false 
    } 
} 
productFlavors { 
    product1 { 
     buildConfigField STRING, "URL_BASE", '"https://api1.release.com"' 

    } 
    product2 { 
     buildConfigField STRING, "URL_BASE", '"https://api2.release.com"' 

    } 
} 

Ma io voglio qualcosa di simile:

buildTypes { 
    debug { 
     debuggable true 
    } 
    release { 
     debuggable false 
    } 
} 
productFlavors { 
    product1 { 
     debug { 
      buildConfigField STRING, "URL_BASE", '"https://api1.debug.com"' 
     } 
     release { 
      buildConfigField STRING, "URL_BASE", '"https://api1.release.com"' 
    } 
    product2 { 
     debug { 
      buildConfigField STRING, "URL_BASE", '"https://api2.debug.com"' 
      } 
     release { 
      buildConfigField STRING, "URL_BASE", '"https://api2.release.com"' 
     } 
    } 
} 

Come posso raggiungere questo obiettivo?

Aggiornamento:

Ogni URL_BASE ha un modello diverso quindi non posso gruppo gli URL. Una soluzione possibile consiste nell'aggiungere la base url del 2 sapore nei diversi tipi di build e selezionare quello giusto nel sapore.

buildTypes { 
    debug { 
     debuggable true 
     buildConfigField STRING, API_VARIANT_PRODUCT1, '"api1.deb.com"' 
     buildConfigField STRING, API_VARIANT_PRODUCT2, '"api2.debug.com"' 

    } 
    release { 
     debuggable false 
     buildConfigField STRING, API_VARIANT_PRODUCT1, '"api1.release.com"' 
     buildConfigField STRING, API_VARIANT_PRODUCT2, '"api2.release.com"' 
    } 
} 

productFlavors { 
    product1 { 
     buildConfigField STRING, URL_BASE, '"https://" + API_VARIANT_PRODUCT1 + "/v1"' 
    } 
    product2 { 
     buildConfigField STRING, URL_BASE, '"https://" + API_VARIANT_PRODUCT2 + "/v1"' 
    } 
    } 
} 

UPDATE 2

Se avete bisogno di aggiungere risorse a Gradle, come un 'KEY_MAP' la soluzione è in questo page.

risposta

2

Non so come sia possibile impostare valori diversi per più BuildVariants (tipi di build + flavor) in build.gradle con il metodo buildConfigField.

Tuttavia è possibile utilizzare un valore diverso per il proprio url_base all'interno di res/values/strings.xml.

Qualcosa di simile:

<string name="url_base">https://api1.debug.com</string> 

quindi è possibile creare la stessa risorsa di stringa in queste cartelle:

- app/src/product1Debug: Contains product1-debug-related code/resources 
- app/src/product1Release: Contains product1-release-related code/resources 
- app/src/product2Debug: Contains product2-debug-related code/resources 
- app/src/product2Release: Contains product2-release-related code/resources 

Naturalmente non è lo stesso di avere un valore all'interno della BuildConfig ed è meno confortevole della configurazione con build.gradle.

+0

E le classi java che sono uguali per ogni tipo di build? Devo clonare ogni classe java per aggiungere in product1Debug, product1Release? O devo creare una cartella chiamata product1 e questo codice è in esso ?? Ad esempio una classe java chiamata SplashActivity.java che è la stessa per i tipi di build debug e release in product1. Grazie – beni

+0

Per le classi java devi mettere 1 classe per ogni buildTypes. Si può usare in questo caso: '- app/src/debug:' '- app/src/product1Release' ' - app/src/product2Release' –

6

@Beni, è possibile utilizzare qualcosa di simile

buildTypes { 
    debug { 
     debuggable true 
     buildConfigField("String", "API_VARIANT", '"debugvariant"') 
    } 
    release { 
     debuggable false 
     buildConfigField("String", "API_VARIANT", '"releasevariant"') 
    } 
} 
productFlavors { 
    product1 { 
     buildConfigField("String", "URL_BASE", '"https://api1." + API_VARIANT + ".com"') 
    } 
    product2 { 
     buildConfigField("String", "URL_BASE", '"https://api2." + API_VARIANT + ".com"') 
    } 
} 

Il problema con quello che si proponevano di fare è che l'ultima definizione dei valori buildConfigField STRING, "URL_BASE" per ogni buildType si abituerà in tutti i sapori dei prodotti. Quindi, quello che si otterrebbe sarebbe qualcosa come "https://api2.release.com" in entrambe le versioni.

Utilizzando il sopra di voi finirà con qualcosa di simile nei file BuildConfig per ciascuna variante

// Fields from build type: debug 
public static final String API_VARIANT = ["debugvariant"|"releasevariant"]; 
// Fields from product flavor: [product1|product2] 
public static final String URL_BASE = "https://[api1|api2]." + API_VARIANT + ".com"; 

Spero che questo aiuti.

+0

Ho cambiato il mio codice come la mia domanda aggiornata. Ho diversi schemi di URL, quindi non ho potuto applicare la risposta nello stesso modo e devo adattarla come puoi vedere. – beni

1
applicationVariants.all { variant -> 

    def apiVariant = variant.getFlavorName == "product1" ? "api1" : "api2" 
    def server = variant.buildType.name == "debug" ? "debug" : "release" 

    variant.buildConfigField STRING, URL_BASE, "http://" + apiVariant + "." + server + ".com" 
} 
5

Il tipo di build non fa parte di Product Flavor e viceversa. La variante viene calcolata in base al tipo di build e al sapore del prodotto. Usando questo puoi semplicemente creare un'estensione (opzione 1) o una proprietà (opzione 2) con un formato coerente usando sia l'aroma del prodotto che il tipo di build.

Opzione 1

ext.product1_release_base_url = 'http://baseurl.myproduct/public' 
ext.product2_release_base_url = 'http://baseurl.yourproduct/secure' 
ext.product1_debug_base_url = 'http://debugurl.myproduct/test' 
ext.product2_debug_base_url = 'http://yourproduct/debug' 

android { 
    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      minifyEnabled false 
     } 
    } 
    productFlavors { 
     product1 {} 
     product2 {} 
    } 
} 

project.android.applicationVariants.all {variant -> 
    def url = project.ext."${variant.flavorName}_${variant.buildType.name}_base_url" 
    variant.buildConfigField('String', 'URL_BASE', "\"${url}\"") 
} 

Opzione 2

in gradle.properties

product1_release_base_url = 'http://baseurl.myproduct/public' 
product2_release_base_url = 'http://baseurl.yourproduct/secure' 
product1_debug_base_url = 'http://debugurl.myproduct/test' 
product2_debug_base_url = 'http://yourproduct/debug' 

in build.gradle

android { 
    buildTypes { 
     release {} 
     debug {} 
    } 
    productFlavors { 
     product1 {} 
     product2 {} 
    } 
} 

project.android.applicationVariants.all {variant -> 
    def url = project."${variant.flavorName}_${variant.buildType.name}_base_url" 
    variant.buildConfigField('String', 'URL_BASE', "\"${url}\"") 
} 
+0

dobbiamo chiamare "project.android.applicationVariants.all" in modo esplicito. –

+0

Potrebbe esserci un altro modo, ma non lo so. Non c'è un modo dichiarativo di farlo è ciò che ti interessa. – n4h0y

Problemi correlati