एंड्रॉइड आर्काइव लाइब्रेरी (एएआर) बनाम मानक जार


131

मैं एंड्रॉइड ऐप्स के लिए मानक निर्माण प्रणाली के रूप में ग्रैडल के नए गोद लेने के बारे में कुछ लेख पढ़ रहा हूं। खैर, मानक जावा विकास से आ रहा है मैं आमतौर पर जार फ़ाइलों पर निर्भर करता हूं ताकि मेरी परियोजना का निर्माण हो सके। हालाँकि ऐसा लगता है कि Android में aar संकुल भी है, जो कि Windows OS में dll फ़ाइलों के समतुल्य है , जैसा कि यहाँ बताया गया है :

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

हालाँकि, मुझे इस अवधारणा के आसपास कुछ संदेह है। मेरा मतलब है, जब एक डेवलपर को अपने आवेदन में aar निर्भरता सहित रुचि होनी चाहिए ? क्या यह निर्भरता कुछ एसडीके न्यूनतम संस्करण के लिए कड़ा है?

उदाहरण के लिए, एक परियोजना में मैं एक COM पोर्ट का उपयोग करता हूं, जिसके लिए मैं NDK precompiled .so पुस्तकालयों का उपयोग करता हूं । अगर मुझे इस उपयोगिता को साझा करना है तो क्या मुझे एक आरा बनाना होगा?

जवाबों:


221

AARफाइलें निम्नलिखित कारणों Jarसे s के समान हैं Dll:

Dlls को उन अनुप्रयोगों में साझा किया जा सकता है जहां AARआपके ऐप के साथ s और jars पैक किए गए हैं।

AARs बनाम Jars:

A Jarऔर a के बीच मुख्य अंतर AARयह है कि AARइसमें संसाधन layouts, drawablesआदि शामिल हैं । इससे स्व-निहित दृश्य घटकों को बनाना बहुत आसान हो जाता है। उदाहरण के लिए यदि आपके पास एक से अधिक लॉगिन स्क्रीन का उपयोग करने वाले कई ऐप्स हैं, Jarतो आप कक्षाओं को साझा कर सकते हैं, लेकिन लेआउट, शैलियों आदि को नहीं, फिर भी आपको उन्हें डुप्लिकेट करना होगा। AARएस के साथ सब कुछ एक साफ पैकेज में बांधा गया है।

निष्कर्ष में, AARs सही दिशा में एक बड़ा कदम हैं।

नोट:
इसी तरह के प्रयास apk-libएस के साथ किए गए थे लेकिन वे अब अप्रचलित हैं क्योंकि AARएस बहुत बेहतर हैं।


@ मान लीजिए। क्या कोई रास्ता है जिससे हम aar फ़ाइलों को रोक सकते हैं- पुस्तकालय को बाधित कर सकते हैं?
अभिषेक

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

5
@LarH मुझे लगता है कि इसका मतलब है कि आप अपने अनुप्रयोगों के बीच कोड (aar फाइलें) साझा कर सकते हैं, लेकिन उपयोगकर्ताओं को स्वतंत्र रूप से एप्लिकेशन इंस्टॉल करने देने के लिए इसे हर पैकेज में अलग से शामिल किया जाएगा। यदि 2 एप्लिकेशन इंस्टॉल किए गए हैं और दोनों एक ही aar का उपयोग करते हैं, तो एंड्रॉइड रनटाइम केवल एक बार लोड करने के लिए पर्याप्त चतुर हो सकता है।
हबीब

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

5
@Mohammadmoradyar आप अपनी कक्षाओं को आगे बढ़ाने के लिए अपनी लाइब्रेरी पर प्रोगार्ड का उपयोग कर सकते हैं लेकिन किसी भी जावा-आधारित बायटेकोड के साथ, लोगों को अपना कोड हटाने से रोकने का कोई तरीका नहीं है।
एकीकृत करें

11

बयान " एक जार और एएआर के बीच मुख्य अंतर यह है कि एएआर में लेआउट, ड्रॉइबल्स आदि जैसे संसाधन शामिल हैं " जेएआर फ़ाइल विनिर्देश के अनुरूप नहीं है और इसलिए एक सच्चाई नहीं है। JAR फ़ाइल विनिर्देश के अनुसार :

JAR फ़ाइल लोकप्रिय ZIP फ़ाइल प्रारूप पर आधारित एक फ़ाइल प्रारूप है और इसका उपयोग कई फ़ाइलों को एक में एकत्रित करने के लिए किया जाता है। एक JAR फ़ाइल अनिवार्य रूप से एक ज़िप फ़ाइल है जिसमें एक वैकल्पिक META-INF निर्देशिका है।

जैसा कि आप देख सकते हैं, कोई सामग्री सीमा नहीं है जो एक JAR फ़ाइल में संसाधन जैसे लेआउट, ड्राबल्स आदि को मना करती है। अधिक विवरण के लिए जावा® वर्चुअल मशीन विनिर्देशन का आलेख 5.3 "निर्माण और लोडिंग" देखें।

तो सवाल पर एंड्रॉइड आर्काइव लाइब्रेरी (एएआर) बनाम मानक जार। उत्तर इस बात पर निर्भर करता है कि आप किस निर्माण उपकरण का उपयोग कर रहे हैं।

यदि आप एंड्रॉइड स्टूडियो को बिल्ड टूल (क्रमशः प्रोजेक्ट आयोजक के रूप में) का उपयोग कर रहे हैं, तो आप निश्चित रूप से एंड्रॉइड प्रोजेक्ट्स के बीच एन्कैप्सुलेटेड संसाधनों को साझा करने के लिए * .ar फ़ाइलों का बेहतर उपयोग करेंगे। AAR फ़ाइल स्वरूप Android Studio बिल्ड का एक हिस्सा है और जैसा कि अन्य टिप्पणियों में बताया गया है, यहाँ इसका उपयोगकर्ता इंटरफ़ेस Android पुस्तकालयों के लिए aar प्रारूप का समर्थन करता है।

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


मैं तब कहूंगा कि अंतर यह है कि JAR पारिस्थितिकी तंत्र में किसी भी तरह के संसाधन को साझा करने का एक जरिया है, जबकि AAR Android केंद्रित है और आपको एक ठोस लेआउट के लिए मजबूर करता है
एक्सट्रीम बाइकर

मुझे लगता है कि चुने गए उत्तर (@unify) के लेखक को इस बारे में कुछ स्पष्टीकरण देना चाहिए।
lfree

मैं अधिक से अधिक जावा दुनिया के बारे में नहीं जानता, लेकिन एंड्रॉइड वर्ल्ड जार फाइलों में संसाधन शामिल नहीं हो सकते। यही है, भले ही संसाधन .jar संग्रह में थे, उन्हें परियोजना में नहीं लाया जाएगा जिसमें उन्हें शामिल किया गया है: stackoverflow.com/q/2474904/211292
थॉमसडब्ल्यू

6

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

.aarसे अलग .jarनहीं से .jarअलग है .zip। यह निश्चित अवधारणाएं हैं कि किस तरह की सामग्री की उम्मीद की जानी चाहिए, लेकिन दोनों में .jarऔर .aarसबसे अधिक बार संकलित कक्षाएं और वे संसाधन होते हैं।.aarबस यह निर्दिष्ट करता है कि पुस्तकालय Android विशिष्ट है और कुछ अपेक्षित संरचना है, ऐसे पुस्तकालयों के लिए उचित है (अच्छी तरह से, .jarकुछ अपेक्षित संरचना भी है)।

वह दृश्य जो .AR केवल एंड्रॉइड स्टूडियो द्वारा समर्थित है, को भी हटा दिया गया है। ऐसे पुस्तकालयों को मावेन सेंट्रल में तैनात किया जा सकता है, और ग्रेडेल जैसे उपकरण उदाहरण के लिए @AR प्रत्यय का उपयोग करके उन्हें संदर्भित कर सकते हैं:

dependencies {
    compile ('io.github.andviane:uncover:2.0.1@aar')
    ..
}  

इस मावेन केंद्रीय तैनाती को संदर्भित करने के लिए ।

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