क्यों उत्पाद जायके से अलग प्रकार का निर्माण कर रहे हैं?


173

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

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

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

कुछ ठोस उदाहरण जो मेरे भ्रम का कारण बने:

  • signingConfigसंपत्ति का निर्माण प्रकार और उत्पाद जायके दोनों में सेट किया जा सकता है ... लेकिन minifyEnabled(और, मुझे लगता है, shrinkResources?) केवल निर्माण प्रकार में विन्यस्त किया जा सकता।

  • applicationIdकेवल उत्पाद के स्वादों में निर्दिष्ट किया जा सकता है ... और applicationIdSuffixकेवल निर्माण प्रकारों में निर्दिष्ट किया जा सकता है !?

वास्तविक प्रश्न :

उपरोक्त उदाहरणों को देखते हुए: बिल्ड प्रकार बनाम उत्पाद जायके की भूमिकाओं के बीच एक स्पष्ट अंतर है?

यदि हां, तो इसे समझने का सबसे अच्छा तरीका क्या है?

यदि नहीं, तो अंततः निर्माण के प्रकारों और उत्पाद जायके को एक एकल विन्यास योग्य डीएसएल वस्तु में विलय करने की योजना है?


55
"कौन से कॉन्फ़िगरेशन को बिल्ड प्रकार में निर्दिष्ट किया जाना चाहिए, कौन सा कॉन्फ़िगरेशन उत्पाद के स्वाद में निर्दिष्ट किया जाना चाहिए" - अपने विकास के जीवन शैली (डिबग, "डॉगफ़ूड", रिलीज़, आदि) के प्रकार का निर्माण करें। उत्पाद आपकी वितरण रणनीति (Google IAP बनाम अमेज़ॅन IAP बनाम ब्लैकबेरी IAP, आदि) का मॉडल बनाता है। ये स्वतंत्र अवधारणाएं हैं। बाकी के रूप में, मुझे लगता है कि कार्यान्वयन के लिए तकनीकी कारण हैं जो थोड़ा तय करते हैं कि वे डीएसएल कैसे सेट करते हैं, और इसलिए अगर कोई विलय की योजना है तो मुझे आश्चर्य होगा।
कॉमन्सवेयर

1
@CommonsWare जो उच्च स्तर पर बहुत मायने रखता है। और हाँ, शायद प्रकारों / स्वादों का अनुक्रमिक प्रसंस्करण प्रतिबंधित करता है कि कैसे और कब एक पूरे को बदल सकता है applicationId, उदाहरण के लिए।
19

जवाबों:


168

@CommonsWare ने टिप्पणियों में जो कहा है, उस पर विस्तार करते हुए, मूल विचार यह है कि बिल्ड प्रकार आपके एप्लिकेशन के विभिन्न बिल्ड के लिए हैं जो कार्यात्मक रूप से भिन्न नहीं हैं - यदि आपके ऐप का डिबग और रिलीज़ संस्करण है, तो वे एक ही ऐप हैं , लेकिन एक में डिबगिंग कोड होता है, शायद अधिक लॉगिंग इत्यादि, और दूसरा सुव्यवस्थित और अनुकूलित होता है और संभवतः ProGuard के माध्यम से बाधित होता है। जायके के साथ, आशय यह है कि ऐप किसी न किसी तरह से अलग है। सबसे स्पष्ट उदाहरण आपके एप्लिकेशन का एक निशुल्क बनाम भुगतान किया गया संस्करण होगा, लेकिन डेवलपर्स इसे वितरित किए जाने के आधार पर अंतर कर सकते हैं (जो इन-ऐप बिलिंग एपीआई उपयोग को प्रभावित कर सकता है)।

ऐसे डेवलपर हैं जो विभिन्न ग्राहकों के लिए एक जैसे ऐप के कई, कई अलग-अलग संस्करण बनाते हैं - एक उदाहरण एक साधारण ऐप हो सकता है जो वेब पेज में एक वेब पेज खोलता है, जिसमें प्रत्येक संस्करण के लिए अलग-अलग URL और ब्रांडिंग है - यह एक है जायके का अच्छा उपयोग।

पुनरावृत्ति करने के लिए, यदि यह "एक ही एप्लिकेशन" है, तो कुछ अंतरों को मोड्यूलो करें जो अंत उपयोगकर्ता के लिए महत्वपूर्ण नहीं हैं, और विशेष रूप से यदि एक को छोड़कर सभी वेरिएंट आपके स्वयं के परीक्षण और विकास उपयोग के लिए हैं और केवल एक संस्करण के लिए तैनात किया जाएगा अंत उपयोगकर्ताओं, तो यह बिल्ड प्रकार के लिए एक अच्छा उम्मीदवार है। यदि यह "एक अलग" एप्लिकेशन है और उपयोगकर्ताओं के लिए कई वेरिएंट तैनात किए जाएंगे, तो शायद यह उत्पाद स्वाद के लिए एक उम्मीदवार है।

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


17
धन्यवाद, स्कॉट। मुझे निश्चित रूप से लगता है कि यह अंतर समझ में आता है (और नाम 'बिल्ड टाइप' और 'प्रोडक्ट फ्लेवर' इस उपयोग के लिए उपयुक्त हैं)। शायद कोई इस applicationIdमुद्दे को इस प्रकार समझ सकता है: चूँकि जायके आपके ऐप के "पूरी तरह से अलग" संस्करणों का प्रतिनिधित्व करते हैं, यह समझ में आता है कि "पूरी तरह से" अलग-अलग ऐप आईडी को निर्दिष्ट करने में सक्षम हो; हालांकि, एक निश्चित स्वाद के लिए, कई बिल्ड प्रकार सभी "समान" ऐप का प्रतिनिधित्व करते हैं और इसलिए केवल ऐप आईडी प्रत्यय (जिससे ऐप आईडी के 'समूहीकरण को बनाए रखना') को बदलने की अनुमति है।
1948 में

28

buildType कॉन्फ़िगर करें कि हम अपने ऐप को कैसे पैकेज करते हैं

  • shrinkResources
  • progaurdFile
  • आदि।

स्वाद विभिन्न वर्गों और संसाधनों को कॉन्फ़िगर करता है।

  • फ्लेवर 1 में आपकी मेनऐक्टिविटी कुछ कर सकती है, और फ्लेवर 2 अलग कार्यान्वयन में

  • differente ऐप का नाम

  • आदि।

प्रत्येक उत्पाद का स्वाद अन्य लोगों के बीच निम्नलिखित गुणों के अपने मूल्य हो सकते हैं, जो निम्न गुणों से आधारित हैं defaultConfig:

  • applicationId
  • minSdkVersion
  • targetSdkVersion
  • versionCode
  • versionName

9

यहां बताया गया है कि मैं इसके सार के अंतर को कैसे दूर करता हूं:

  • buildTypeनिर्माण का तरीका है।
  • flavorबिल्ड का क्या है।

0

build typesइंगित करने के लिए उपयोग किया जाता है debug/releaseविभिन्न प्रमाण पत्र और सक्रिय करने के साथ मोड Proguardया debuggableझंडा।

flavorsकस्टम सुविधाओं के लिए उपयोग किया जाता है (उदाहरण के नि: शुल्क या भुगतान संस्करण के लिए), minimum and target APIजैसे स्तर, उपकरण और एपीआई आवश्यकताओं layout, drawableताकि आप विभिन्न में अलग कोड और संसाधनों हो सकता है flavors

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.