2012-03-01 7 views
10

मुझे एंड्रॉइड में उपयोग के लिए यूटिल लाइब्रेरी का न्यूनतम जार बनाने की आवश्यकता है। मैं apache commons पुस्तकालयों (जैसे IOUtils, StringUtils) से कुछ तरीकों का उपयोग कर रहा हूं। हालांकि, इस तरह के प्रत्येक उपयोग से मुझे पूरी लाइब्रेरी (commons-lang, commons-io इत्यादि) आयात करने में मदद मिलती है जो कि टोमकैट (war के मैमूट आकार के अनुसार बिल्कुल स्वीकार्य है), लेकिन एंड्रॉइड प्रोजेक्ट के लिए बिल्कुल अस्वीकार्य है।केवल इस्तेमाल किए गए वर्गों के साथ न्यूनतम जार उत्पन्न करें

तो मेरा लक्ष्य है कि सभी उपयोग किए गए वर्गों को निर्भरताओं से एक जार में पैक करना है - लेकिन केवल उन्हीं वर्गों की आवश्यकता है। मुझे याद है कि एक बार मैवेन प्लगइन के संपर्क में रहना जो उस काम को करता है, दुर्भाग्य से मैं इसका नाम याद नहीं रख सकता और न ही इसे Google के माध्यम से ढूंढ सकता हूं।

तो कृपया, क्या आप मेवेन प्लगइन जानते हैं जो निर्भरताओं के इस तरह के कम से कम कर देगा, या कोई स्टैंड-अलोन टूल जो ऐसा ही करेगा?

उत्तर

0

क्षमा करें, शायद मैं स्पष्ट रूप से प्रश्न को समझ नहीं पाया। Obfuscator उपकरण (यानी ProGuard) ऐसा कर सकता है, है ना? यह कई जारों को एक में पैक करता है और अप्रयुक्त कक्षाओं को स्ट्रिप्स करता है। यदि आपको obfuscation/optimization (अवांछित साइड-इफेक्ट्स को रोकने के लिए) की आवश्यकता नहीं है तो आप चरण को सक्षम "सिकुड़" छोड़कर उन्हें अक्षम कर सकते हैं।

+0

मुझे पता चला है कि ProGuard पहले ही एंड्रॉइड एसकेडी में एकीकृत है, इसलिए मैं निश्चित रूप से देखता हूं कि यह मेरी आवश्यकताओं को पूरा करता है या नहीं। –

+0

जैसा कि मुझे पता है कि ऐसे पैकेजिंग ब्रोक हस्ताक्षरित लाइब्रेरी जेएआरएस हैं। यह गंभीर नुकसान हो सकता है। – Mersenne

-3

मुझे लगता है कि यदि आप ग्रहण के लिए ग्रहण का उपयोग करते हैं तो यह जारिंग के दौरान ऐसा करने के लिए कुछ विकल्प देता है :) शायद यह उपयोगी होगा।

इसके अलावा आप एक कस्टम लाइब्रेरी के तहत अपनी प्रयुक्त लाइब्रेरी कक्षाएं एकत्र कर सकते हैं और इस उपयोगकर्ता को प्रोजेक्ट में लाइब्रेरी बनाई गई है।

+0

यही मुझे उपकरण की आवश्यकता है। मुझे पता है कि मैं इसे मैन्युअल रूप से कर सकता हूं। –

0

सामान्य रूप से किसी एप्लिकेशन द्वारा उपयोग की जाने वाली सभी कक्षाओं का चयन करना संभव नहीं है। बस Class.forName(String name) के साथ हम क्या कर सकते हैं या यदि हम एक निर्भरता इंजेक्शन कंटेनर का उपयोग करते हैं और बाहरी कॉन्फ़िगरेशन फ़ाइलों में प्रकार घोषित करते हैं, तो बस सोचें।

+0

मुझे इसके बारे में पता है, लेकिन यह तभी होता है जब आप प्रतिबिंब का उपयोग करते हैं। AFAIR यह टूल काम कर रहा था जब कोई प्रतिबिंब मौजूद नहीं था, लेकिन यह सुनिश्चित नहीं कर सकता कि मैंने वास्तव में इसे देखा है या यह केवल एक सपना था;) –

+0

न केवल जब आप प्रतिबिंब का उपयोग करते हैं - आप एक यूआरएल से कक्षा लोड कर सकते हैं और कक्षा आपके कक्षा के वर्गों पर कक्षाओं पर निर्भर हो सकती है। भी दुर्घटनाग्रस्त हो जाएगा। –

+0

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

5

मेवेन प्लगइन जिसे आप याद नहीं कर सकते हैं शायद Apache Maven Shade Plugin है, minimizeJar विकल्प है। जैसा कि एंड्रियास_D ने देखा, इसमें कक्षाओं को शामिल नहीं किया जाएगा, Class.forName के साथ लोड किया गया है, इसलिए आपको implicity say in configuration की आवश्यकता होगी, ताकि आपको उनकी आवश्यकता हो। यहां बताया गया है कि मैंने अपने एकल जार में जेडीबीसी ड्राइवर को शामिल करने के लिए मेवेन बनाया है:

<filter> 
    <artifact>net.sourceforge.jtds:jtds</artifact> 
    <includes> 
     <include>**</include> 
    </includes> 
</filter> 
संबंधित मुद्दे