2015-06-05 9 views
11

मेरे पास 2 बिल्ड टाइप (डीबग, रिलीज) और 2 उत्पाद फ़्लेवर्स (उत्पाद 1, उत्पाद 2) हैं। मैं प्रत्येक buildType और productFlavors के लिए buildConfigField को परिभाषित करना चाहता हूं। BuildConfigField सर्वर से डेटा डाउनलोड करने के लिए ऐप यूआरएल है, और यह प्रत्येक उत्पाद फ्लेवर और बिल्ड टाइप के लिए बदलता है।एंड्रॉइड ग्रैडल में स्वाद प्रति कोड

अब, मैं है:

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

    } 
} 

लेकिन मैं कुछ इस तरह हैं:

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

मैं कैसे इस लक्ष्य को हासिल कर सकते हैं?

अद्यतन:

प्रत्येक URL_BASE एक अलग तरीके की है तो मैं नहीं समूह यूआरएल कर सकते हैं। एक सकारात्मक समाधान विभिन्न प्रकार के प्रकारों में 2 स्वाद के यूआरएल बेस को जोड़ने और स्वाद में सही का चयन करना है।

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

अद्यतन 2

आप Gradle में संसाधनों को जोड़ने के लिए, एक 'KEY_MAP' की तरह की जरूरत है समाधान इस page में है।

उत्तर

2

मुझे नहीं पता कि build.gradle में buildConfigField विधि के साथ आप एकाधिक BuildVariants (प्रकार + स्वाद) बनाने के लिए अलग-अलग मान कैसे सेट कर सकते हैं।

हालांकि आप url_base के लिए res/values/strings.xml के अंदर एक अलग मूल्य का उपयोग कर सकते हैं।

कुछ की तरह:

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

तो आपको इन फ़ोल्डर में एक ही स्ट्रिंग संसाधन बना सकते हैं:

- 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 
बेशक

यह BuildConfig अंदर एक मूल्य के लिए समान नहीं है और है build.gradle के साथ विन्यास से कम confortable।

+0

जावा वर्गों के बारे में क्या जो प्रत्येक निर्माण प्रकार के बराबर हैं? क्या मुझे product1Debug, product1Release में जोड़ने के लिए प्रत्येक जावा क्लास क्लोन करना है? या मुझे product1 नामक फ़ोल्डर बनाना है और यह कोड इसमें है ?? उदाहरण के लिए SplavaActivity.java नामक एक जावा क्लास जो कि निर्माण प्रकार डीबग और उत्पाद 1 में रिलीज़ के लिए समान है। धन्यवाद – beni

+0

जावा कक्षाओं के लिए आपको प्रत्येक बिल्ड टाइप के लिए 1 वर्ग रखना होगा। आप इस मामले में उपयोग कर सकते हैं: '- ऐप/src/डीबग:' '- ऐप/src/product1Release' ' - ऐप/src/product2Release' –

6

@Beni, तो आप इस

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

तुम क्या करने का प्रस्ताव किया गया था क्या के साथ समस्या की तरह कुछ का उपयोग कर सकते हैं कि प्रत्येक buildType के लिए buildConfigField STRING, "URL_BASE" मूल्यों के अंतिम परिभाषा सभी उत्पाद स्वादों में आदत हो जाएगा। तो आप दोनों रिलीज संस्करणों में "https://api2.release.com" जैसे कुछ खत्म करेंगे।

का उपयोग करके आप ऊपर प्रत्येक संस्करण

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

आशा इस में मदद करता है के लिए अपने BuildConfig फाइलों में कुछ इस तरह से खत्म हो जाएगा।

+0

मैंने अपना कोड मेरे अपडेट किए गए प्रश्न की तरह बदल दिया। मेरे पास अलग-अलग यूआरएल योजनाएं हैं, इसलिए मैं आपका जवाब उसी तरह लागू नहीं कर सका और मुझे इसे अनुकूलित करना होगा जैसा कि आप देख सकते हैं। – 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

बिल्ड प्रकार उत्पाद स्वाद का हिस्सा नहीं है और इसके विपरीत। वेरिएंट की गणना दोनों प्रकार के प्रकार और उत्पाद स्वाद के आधार पर की जाती है। इसका उपयोग करके आप उत्पाद स्वाद और निर्माण प्रकार दोनों का उपयोग करके एक सतत प्रारूप के साथ या तो एक एक्सटेंशन (विकल्प 1) या एक संपत्ति (विकल्प 2) बना सकते हैं।

विकल्प 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}\"") 
} 

विकल्प 2

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' 

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

क्या हमें स्पष्ट रूप से "project.android.applicationVariants.all" को कॉल करना होगा। –

+0

कोई अन्य तरीका हो सकता है लेकिन मुझे नहीं पता। ऐसा करने का कोई घोषणात्मक तरीका नहीं है जो आप चाहते हैं। – n4h0y

संबंधित मुद्दे