2012-04-18 15 views
5

में अलग ऐप का मुफ्त/भुगतान संस्करण कैसे रखें, मेरे पास एंड्रॉइड मार्केटप्लेस पर एक सशुल्क एप्लिकेशन है, हालांकि, मैं एक मुफ्त विज्ञापन-समर्थित संस्करण जारी करना चाहता हूं।सबवर्सन

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

पैच साझा करने, लेकिन एक अलग पैकेज के साथ, मैं इन दोनों परियोजनाओं को एक साथ रख सकता हूं, लेकिन सबसे अच्छा तरीका क्या है?

+2

प्रदर्शित नहीं करते हैं, मुझे यकीन नहीं है कि लोग इसे ऑफ-विषय के रूप में क्यों वोट दे रहे हैं। यह स्पष्ट रूप से परियोजना संरचना और विन्यास प्रबंधन के बारे में एक सवाल है, जिनमें से दोनों यहां हैं। –

उत्तर

3

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

मैंने यह किया है और स्पष्ट रूप से यह अभ्यास में एक महान रणनीति नहीं है। विशेष रूप से संकलित वातावरण में, बहुत बेहतर है, मुफ्त बनाम भुगतान के लिए एक अलग निर्माण प्रक्रिया है, इसलिए दो के बजाय एक कोडबेस है। यदि दो कोडबेस हैं विचलित हो जाएंगे।

+0

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

+0

शायद, एक छोटा precompiler voodo भी काम करना चाहिए। बिल्ड सिस्टम अद्भुत चीजें हैं। –

8

क्या आपने संकलक निर्देश पर विचार किया है?

उदाहरण:

#define FREE 
// ... 
#if FREE 
Console.WriteLine("Free version"); 
#else 
Console.WriteLine("Paid version"); 
#endif 

आप बिल्कुल वही कोड आधार रखने के लिए और लक्षित कर दो दो अलग-अलग निर्माण स्क्रिप्ट या एक parametrable एक का उपयोग कर बनाता है सकते हैं।

msbuild /p:DefineConstants=FREE 
जावा के साथ ऐसा करने के लिए

, this और this पढ़ें। और शायद this

+0

मुझे नहीं लगता था कि जावा ने उन चीजों को सुना है – Malfist

+0

यह जावा में भी मौजूद है। –

+0

@ पियरे 303 मुझे खेद है, मुझे नहीं पता था कि आप ऐसा कर सकते हैं। यह अभी भी पैकेज समस्या हल नहीं करता है .... हमम। –

0

संस्करण नियंत्रण इस तरह की चीजों को प्रबंधित करने का एक खराब तरीका है। आप एक रखरखाव दुःस्वप्न के साथ समाप्त हो जाएंगे - दो अलग-अलग अनुप्रयोग जिन्हें लगभग समान होना चाहिए।

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

आपको this discussion on a similar topic दिलचस्प भी मिल सकता है।

5

केवल आपका एप्लिकेशन पैकेज अद्वितीय होना चाहिए। here देखें। वह पैकेज आपके प्रकट फ़ाइल में घोषित किया गया है। आपके पास अपना अधिकांश कोड com.mydomain.myapp में हो सकता है, और com.mydomain.myapp.free में इसकी एक अलग मुख्य गतिविधि हो सकती है।

0

feature toggle का उपयोग करके अपने ऐप का निर्माण करने से आप अपने उद्देश्य तक पहुंच सकते हैं लेकिन आपको बहुत सारे कोड को फिर से काम करना पड़ सकता है।

2 परिभाषित करके (मैं अनुशंसा करता हूं 3) फीचर कंटेनर वातावरण में।INI फ़ाइल की तरह:

[paid] 
features.ads = false 
features.featureOne = true 
features.featureTwo = true 
features.premiumFeature = true 
features.underDevFeature = false 
features.debug = false; 

[free:paid] 
features.ads = true 
features.premiumFeature = false 

; And the optionnal third 
[development:paid] 
features.debug = true 
features.underDevFeature = true 

इस तरह, आप एक संस्करण है कि एक समान है है और आप अपने संस्करण नियंत्रण स्रोत

अपने विशिष्ट लिपियों में में केवल एक ही शाखा की आवश्यकता होती है आप तो जाँच करने के लिए है, तो सुविधा के लिए अधिकृत है , यदि नहीं, तो आप इसे