2015-06-05 4 views
11

Ich habe 2 buildTypes (debug, release) und 2 productFlavors (product1, product2). Ich möchte ein buildConfigField für jeden buildType und productFlavors definieren. Das buildConfigField ist die URL, über die die App Daten vom Server herunterlädt, und sie ändert sich für jedes productFlavor und buildTypes.Code Pfad pro Geschmack in Android Gradle

Jetzt habe ich:

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

    } 
} 

Aber ich möchte etwas wie folgt aus:

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

Wie ich das erreichen kann?

Update:

Jede URL_BASE hat ein anderes Muster, so kann ich nicht gruppiert die URLs. Eine mögliche Lösung besteht darin, die URL-Basis der 2 Flavor in den verschiedenen Build-Typen hinzuzufügen und die richtige in der Flavor auszuwählen.

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

Wenn Sie Ressourcen in gradle hinzufügen müssen, wie ein 'KEY_MAP' ist die Lösung in diesem page.

Antwort

2

Ich weiß nicht, wie Sie verschiedene Werte für mehrere BuildVariants (Build-Typen + Geschmack) in build.gradle mit der buildConfigField Methode festlegen können.

Sie können jedoch einen anderen Wert für Ihre url_base innerhalb res/values/strings.xml verwenden.

Etwas wie:

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

Dann können Sie die gleiche Zeichenfolge-Ressource in diesen Ordner erstellen:

- 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 

Natürlich ist es nicht das gleiche ist, einen Wert innerhalb des BuildConfig zu haben und ist weniger komfortabel als die Konfiguration mit build.gradle.

+0

Was ist mit den Java-Klassen, die für jeden Buildtyp gleich sind? Muss ich jede Java-Klasse klonen, um sie in product1Debug, product1Release hinzuzufügen? Oder muss ich einen Ordner namens product1 erstellen und dieser Code ist drin ?? Zum Beispiel eine Java-Klasse namens SplashActivity.java, die für die Build-Typen debug und release in product1 identisch ist. Danke – beni

+0

Für Java-Klassen müssen Sie 1 Klasse für jeden buildTypes setzen. Sie können in diesem Fall verwenden: '- app/src/debug:' '- app/src/product1Release' ' - app/src/product2Release' –

6

@Beni, Sie so etwas wie dieses

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

Das Problem mit dem, was Sie vorschlugen zu tun, ist, dass die letzte Definition der die buildConfigField STRING, "URL_BASE" Werte für jede buildType in allen Produkt Aromen gewöhnen werden können. Also, was Sie würden mit so etwas wie "https://api2.release.com" in beiden Release-Versionen sein.

Verwendung der oben Sie mit so etwas wie dies in Ihrer BuildConfig Dateien für jede 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"; 

hoffe, das hilft am Ende.

+0

Ich änderte meinen Code wie meine aktualisierte Frage. Ich habe verschiedene URL-Schemata, daher konnte ich Ihre Antwort nicht auf die gleiche Weise anwenden und muss sie anpassen, wie Sie sehen können. – 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

Build-Typ ist nicht Bestandteil von Product Flavour und umgekehrt. Die Variante wird basierend auf dem Buildtyp und dem Produktgeschmack berechnet. Mit diesem können Sie entweder eine Erweiterung (Option 1) oder eine Eigenschaft (Option 2) mit einem konsistenten Format erstellen, indem Sie sowohl Produktaroma als auch Buildtyp verwenden.

Option 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}\"") 
} 

Option 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

müssen wir "project.android.applicationVariants.all" explizit aufrufen. –

+0

Es könnte anders sein, aber ich weiß es nicht. Es gibt keine deklarative Art, dies zu tun, an der Sie interessiert sind. – n4h0y

Verwandte Themen