2017-01-13 15 views
5

अभी मेरे पास दो उत्पाद हैं जो ग्रेडल में हैं। मुझे तीसरा जोड़ना होगा। दो मौजूदा उत्पाद स्वाद बहुत ज्यादा सब कुछ साझा करते हैं। उन्हें बिल्ली और कुत्ते को बुलाओ - वे दोनों जानवर हैं। मुझे जोड़ने वाला तीसरा स्वाद अनिवार्य रूप से ऐप का एक सैंडबॉक्स संस्करण है। हम इसे बाइक कह सकते हैं।तीन उत्पाद स्वाद: दो बहुत समान, एक छोटा लेकिन अलग

कहें कि मेरे ऐप में अब बारह गतिविधियां हैं जो सभी बिल्ली और कुत्ते द्वारा साझा की जाती हैं। लेकिन बाइक उत्पाद स्वाद के पास केवल उन तीन गतिविधियों तक पहुंच होनी चाहिए और बाइक को अपनी खुद की लॉन्चर गतिविधि की आवश्यकता है। बुद्धिमानी से समायोजित करने के लिए मैं अपने कोड को दोबारा कैसे दोहरा सकता हूं? दोबारा, दो स्वाद बहुत ज्यादा सब कुछ साझा करते हैं, जबकि एक स्वाद दूसरे दो के साथ बहुत कम साझा करता है।

अद्यतन

वहाँ Change default source set configurations का उपयोग कर इस समस्या के समाधान के लिए एक स्मार्ट तरीका है करने के लिए लगता है। असल में, मैं /main स्रोतसेट को पूरे ऐप पर सामान्य सभी के लिए रखूंगा; एक /dogCat सोर्ससेट जो कि कुत्ते और बिल्ली दोनों के लिए आम है; और /bike स्रोतसेट केवल बाइक से संबंधित है।

इतना पता लगा करने के बाद, मैं अभी भी Gradle sourceSets भाग

android { 
    ... 
    sourceSets { 
    . . . 
    } 
} 
लेखन कुछ समस्या हो रहा है
+0

मैंने उत्तर समझाया है, कृपया जांचें और मुझे बताएं। यदि यह आपके लिए उपयोगी है या नहीं। – Shekhar

+0

उत्तर नीचे देखें –

+0

इस उत्तर की जांच करें जिसमें समान कार्यान्वयन है। http://stackoverflow.com/questions/40302977/while-using-product-flavours-what-files-are-common-in-each-flavour-and-what-file/40303385#40303385 आशा है कि इससे मदद मिलती है .... – Stallion

उत्तर

0

आप इन 2 दृष्टिकोण की कोशिश कर सकते: अपने मुख्य स्वाद में

  • सभी गतिविधियों को लागू करें (जावा/मुख्य को ग्रैडल परिभाषित स्वादों में सभी के साथ साझा किया जाता है) और प्रत्येक स्वाद वाले एंड्रॉइड मेनिफेस्ट को केवल उन गतिविधियों को संदर्भित करना चाहिए जिन्हें उन्हें काम करने की आवश्यकता है। प्रोगुआर्ड की मदद से आप आश्वस्त कर सकते हैं कि संदर्भित गतिविधियों से इस्तेमाल नहीं किया गया कोड आपके आर्टिफैक्ट (एपीके) में तैनात नहीं होता है। आप अलग अलग लांचर जब आप प्रत्येक में परिभाषित किया गया है हो सकता है AndroidManifest.xml

  • स्वाद लाइब्रेरी प्रोजेक्ट के साथ कार्य करना। इस तरह आप प्रत्येक स्वाद में पुस्तकालयों के अलग-अलग सेट और फिर अलग-अलग मैनिफेस्ट में लोड कर सकते हैं।

मैं कुछ अन्य समय में कुछ उदाहरण के साथ इस जवाब का विस्तार करने की कोशिश करेंगे।

3

मुख्य स्वाद में सभी सामान्य वर्गों को रखें। उदाहरण के लिए, आपके पास तीन स्वाद, बिल्ली, कुत्ते और बाइक हैं। इन तीन स्वादों में, कुछ और को छोड़कर, बिल्ली और कुत्ते अधिकतर समान होते हैं। दूसरी तरफ बाइक में कुछ वर्ग भी हैं जो आम हैं।

तीन परिदृश्य:

01 जब सब स्वाद आम कार्यक्षमता

की तरह, बिल्ली, कुत्ते और बाइक सब है एक वर्ग जो PriceInformation के रूप में नामित किया गया है। फिर इस वर्ग को मुख्य स्वाद में रखें।

02. जब बिल्ली और कुत्ते की समान कार्यक्षमता होती है लेकिन बाइक नहीं करते हैं।

पसंद है, बिल्ली और कुत्ते की लाइफस्पैन नामक एक आम कार्यक्षमता है, फिर इस वर्ग को केवल इस स्वाद में रखें।

03. जब केवल बाइक की सामान्य कार्यक्षमता होती है, लेकिन अन्य दो स्वाद नहीं होते हैं।

फिर उस विशेष श्रेणी को केवल बाइक स्वाद में रखें।

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     applicationId "com.productflavor" 
     minSdkVersion 14 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    productFlavors { 

     cat { 
      applicationId "com.cat.theme" 
     } 
     dog { 
      applicationId "com.dog.theme" 
     } 
     bike { 
      applicationId "com.bike.theme" 
     } 
    } 
} 

Below is the Image I'm attaching.

, के बाद से MainActivity आम है तो मुख्य स्वाद में केवल उल्लेख।

1

मुझे लगता है कि मैं अपनी समस्या का समाधान करने में सक्षम था।

चरण 1. कॉपी रेस: सभी मैं क्या करना है

android { 
    ... 
    sourceSets { 
    main { 
     … 
    } 
    dog { 
     java.srcDirs = [‘dog_cat/java'] 
     … 
    } 
    cat { 
     java.srcDirs = [‘dog_cat/java'] 
     … 
    } 
    bike { 
     java.srcDirs = [‘bike/java’]//which is actually superfluous 
     … 
    } 
    } 

अब मैं पुष्टि करने के लिए

+0

मुझे लगता है कि आप 'java.srcDir' src/dog_cat/java'' चाहते हैं जो '=' की बजाय स्रोत डीआईआर जोड़ता है जो डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करता है। –

1

आप अपने प्रोजेक्ट के कई जायके बना सकते हैं बस कदम नीचे का पालन परीक्षण करने के लिए जा रहा हूँ है। ऐप/src/res का फ़ोल्डर और पेस्ट ऐप/src/YourFlavourName (बिल्ली/कुत्ता/बाइक)/Res।

चरण 2. अनुप्रयोग build.gradle

एंड्रॉयड {

productFlavors { 

    Cat { 
     applicationId = "com.cat" 
    } 

    Dog { 
     applicationId = "com.dog" 
     versionCode 1 
     versionName "1.0" 
    } 

    Bike { 
     applicationId = "com.bike" 
     versionCode 1 
     versionName "1.0" 
    } 

    } 

sourceSets {

main { 
     aidl.srcDirs = ['src'] 
     renderscript.srcDirs = ['src'] 
     jniLibs.srcDirs = ['libs'] 
    } 

    Cat { java.srcDirs = ['src/Cat/java', 'src/Cat/java/'] } 
    Dog { java.srcDirs = ['src/Dog/java', 'src/Dog/java/'] } 
    Bike { java.srcDirs = ['src/Bike/java', 'src/Bike/java/'] } 

} 

}

चरण 3: एंड्रॉयड studi के बाईं ओर ओ वहाँ दो स्लाइड विकल्प पसंद कर रहे हैं और varients बिल्ड पर varients enter image description here क्लिक निर्माण और स्वाद perticulat रन के लिए BuildVarient चयन

चरण 4: भागो appication

1

@Nouvel Travay, देखें क्या होता है जब आप है स्वाद परिभाषित करें जो आप विभिन्न तरीकों को परिभाषित करते हैं जो अनुप्रयोग व्यवहार करते हैं। मान लीजिए कि यदि आप विभिन्न स्वादों में अलग-अलग तार दिखाना चाहते हैं तो आपको उन तारों को व्यक्तिगत रूप से उन अलग-अलग स्वादों में परिभाषित करने की आवश्यकता होगी। इसी तरह यदि आप विभिन्न व्यवहार/कार्यक्षमता को परिभाषित करना चाहते हैं तो आपको अलग-अलग स्वाद में उन व्यवहारों को व्यक्तिगत रूप से परिभाषित करना होगा। महत्वपूर्ण: - फ़ाइल का नाम वही रहना चाहिए, जैसे कि आप एक स्वाद के लिए मेनएक्टिविटी का नाम दे सकते हैं लेकिन अन्य स्वाद के लिए समान व्यवहार के लिए स्टार्टएक्टिविटी जैसे अलग नाम नहीं। आशा है कि मैंने आपको समझ लिया है। अधिक निकासी के लिए पूछने के लिए स्वतंत्र महसूस करें।

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