android - विद्यालय पुस्तकालय के नियम




एक अन्य पुस्तकालय परियोजना पर पुस्तकालय परियोजना निर्भरता वाले चींटी के साथ एंड्रॉइड प्रोजेक्ट का निर्माण करना (4)

चींटी ant.properties में निर्भरता को जोड़ने के लिए संकलन के लिए। उदाहरण के लिए:

android.library.reference.1=../path/to/library

मैं शायद यह इतना आम सेटअप नहीं है:

(> निर्भरता =)
Android प्रोजेक्ट> एंड्रॉइड लाइब्रेरी प्रोजेक्ट 1> एंड्रॉइड लाइब्रेरी प्रोजेक्ट
इसलिए मेरे पास एक एंड्रॉइड लाइब्रेरी प्रोजेक्ट है जिसके पास किसी अन्य पुस्तकालय परियोजना की निर्भरता है।

जब मैं एक्लिप्स सबथिंग्स में प्रोजेक्ट का निर्माण कर रहा हूं तो ठीक काम करता है लेकिन मैं चींटी के साथ काम करने के लिए मेरा निर्माण नहीं कर सकता

पहली चींटी एंड्रॉइड लाइब्रेरी प्रोजेक्ट 2 संकलित करती है जो कक्षाओं को तैयार करती है। और इस फाइल को बिन फ़ोल्डर में रखती है।
फिर चींटी एंड्रॉइड लाइब्रेरी प्रोजेक्ट 1 को संकलित करने की कोशिश करता है लेकिन फिर मुझे त्रुटियाँ मिल रही हैं, क्योंकि यह एंड्रॉइड लाइब्रेरी प्रोजेक्ट 2 से कक्षाएं गायब है।

वैसे यह इतना अजीब नहीं है क्योंकि जार फ़ाइल लिब्स फ़ोल्डर में शामिल नहीं है। लेकिन project.properties में मैं पुस्तकालय परियोजना 2 के लिए निर्भरता बना दिया है तो क्यों चींटी कक्षाओं की प्रतिलिपि नहीं पुस्तकालय परियोजना 1 के libs फ़ोल्डरों के लिए है?

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

** संपादित करें

समस्या यह है कि आर वर्ग गुम है, जब मैं कक्षाओं में देखता हूं। इस जावा फ़ाइल में आर क्लास नहीं होता है। इसलिए मेरा समाधान जांचने योग्य नहीं होगा


यह एक बहुत ही भंगुर सेटअप की तरह लगता है - आप इसके लिए अच्छे कारण हो सकते हैं, लेकिन क्या आप इसके बजाय पुस्तकालयों पर निर्भरता को एक दूसरे पर निर्भर कर सकते हैं?

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

एक पुस्तकालय का उपयोग करने के मुख्य कारणों में से एक यह है कि कोड को पुन: प्रयोज्य बनाने के लिए, यह दृष्टिकोण किसी को सुनिश्चित करता है (आप, एक सहयोगी, आपके उत्तराधिकारी ...) सिर्फ एक लाइब्रेरी में प्लग कर सकते हैं और दूसरे के अपने स्वयं के कार्यान्वयन को बना सकते हैं

जावा में पुल पैटर्न को लागू करने का एक और अच्छा लेख है: http://java.dzone.com/articles/design-patterns-bridge


यह व्यवहार बिल्ड टूल के R17 में बदलाव के कारण हुआ था: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

संक्षेप में: पुस्तकालयों के लिए आर फ़ाइलों को अब उस पुस्तकालय के लिए classes.jar में पैक नहीं किया जाता है। हालांकि, पेरेंट-लाइब्रेरी (आपके उदाहरण में प्रोजेक्ट 1) के लिए pareent.R में भी 'बाल' लाइब्रेरी (प्रोजेक्ट 2 को आपके उदाहरण में) के लिए संसाधन-संदर्भ भी शामिल हैं, फिर भी आप बच्चे-आर को संदर्भित नहीं करना है ।

प्रोजेक्ट 1 के साथ प्रोजेक्ट 1 में सभी प्रोजेक्ट 2। आर-आयात स्टेटमेंट बदलें। आर आयात विवरण और आपको ठीक होना चाहिए।


पुराना सवाल है, लेकिन मेरे जैसे, अन्य लोग इस पर अपने सिर की पिटाई कर सकते हैं ...

आधिकारिक उत्तर है "यह नहीं किया जा सकता", विशेष रूप से:

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

(आधिकारिक दस्तावेजों से निकाले गए: "एक लाइब्रेरी प्रोजेक्ट को संदर्भित करना" )।

इसका मतलब है कि कुछ भी जाता है, क्योंकि उपकरण (और गंदे तरीके क्रम में हैं) के साथ ऐसा करने का कोई "साफ" रास्ता नहीं है।

आशा करता हूँ की ये काम करेगा





ant