2015-06-05 28 views
11

2 buildTypes (debug, release) ve 2 productFlavors (product1, product2) var. Her buildType ve productFlavors için bir buildConfigField tanımlamak istiyorum. BuildConfigField, sunucudan veri indirme uygulaması olan url'dur ve her ürün için değişiklik yaparFlavor ve buildTypes.Android Gradle'da Lezzet Başına Kod Yolu

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

    } 
} 

Ama hiç böyle bir şey istiyorum:

Şimdi, var

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

Bunu nasıl başarabiliriz?

Güncelleme:

Her URL_BASE yüzden olamaz grup URL'ler farklı modeli vardır. Olumlu bir çözüm, farklı yapı tiplerinde 2 çeşidin url tabanını eklemek ve lezzet içinde doğru olanı seçmek. Eğer bir 'KEY_MAP' gibi gradle kaynakları eklemek gerekirse

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

GÜNCELLEME 2

çözüm bu page içindedir.

cevap

2

build.gradle'da buildConfigField yöntemiyle birden fazla BuildVariants (yapı türleri + lezzet) için farklı değerler nasıl ayarlayacağınızı bilmiyorum.

Ancak, res/values/strings.xml içinde url_base için farklı bir değer kullanabilirsiniz. gibi

şey:

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

Sonra bu klasörlerde aynı dize kaynağı oluşturabilir: Elbette

- 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 

o BuildConfig içinde bir değere sahip aynı değildir ve bir build.gradle ile yapılandırmadan daha az konforludur.

+0

Her yapı türü için eşit olan java sınıfları hakkında ne düşünüyorsunuz? Ürüne eklemek için her java sınıfını kopyalamam gerekir1Debug, product1Release? Ya da product1 adında bir klasör oluşturmam gerekiyor mu ve bu kod içeride mi? Örneğin, SplashActivity.java adlı bir java sınıfı, bu, yapı türleri için hata ayıklama ve ürün1 sürümünde aynıdır. Teşekkürler – beni

+0

Java sınıfları için her buildTypes için 1 sınıf koymalısınız. Bu durumda kullanabilirsiniz: '- app/src/hata ayıklama:' ' - app/src/product1Release' ' - app/src/product2Release' –

6

@Beni, yapmanız öneren ne bu

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

problemi gibi bir şey kullanabilirsiniz her buildType için buildConfigField STRING, "URL_BASE" değerlerin son tanım tüm ürün tatlar alışması olacaktır. Yani sonuçta her iki sürümde de "https://api2.release.com" gibi bir şey olurdu. Yukarıdaki her varyant

// 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"; 

bu yardımcı olur Umut için BuildConfig dosyalarında böyle bir şey ile sona erecek kullanma

.

+0

Güncelleştirdiğim soru gibi kodumu değiştirdim. Farklı URL programlarına sahibim, bu yüzden cevabınızı aynı şekilde uygulayamadım ve görebildiğiniz gibi adapte etmeliyim. – 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

Yapı Türü, Product Flavour ve vice versa'nın bir parçası değildir. Varyant, hem yapı tipi hem de ürün aromasına göre hesaplanır. Bunu kullanarak, hem ürün lezzeti hem de yapı tipi kullanarak tutarlı bir formatta bir uzantı (seçenek 1) veya özellik (seçenek 2) oluşturabilirsiniz.

Seçenek 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}\"") 
} 

Seçenek gradle.properties içinde 2

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' 

build.gradle içinde

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

"project.android.applicationVariants.all" i çağırmak zorundayız. –

+0

Başka bir yolu olabilir ama ben bilmiyorum. Bunu yapmakla ilgili beyansal bir yol yoktur, ilgilendiğiniz şeydir. – n4h0y

İlgili konular