2015-02-12 9 views
39

एंड्रॉइड प्रोजेक्ट में विशेष रूप से Android Studio में Dependencies में नई निर्भरता जोड़ने के दौरान तीन स्कोप विकल्प संकलित/प्रदत्त/एपीके हैं।संकलित, प्रदान किया गया, एपीके - एंड्रॉइड निर्भरता स्कोप

प्रत्येक को चुनने के प्रभाव क्या हैं, हमें उनका उपयोग कब करना चाहिए? नाम क्या है इसके अलावा।

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

"। ठीक से संभाल 'प्रदान की' और 'पैकेज' स्कोप कि वे क्या कर किया जाना चाहिए करने के लिए 'प्रदान की' और 'पैकेज' एंड्रॉयड पुस्तकालय के साथ नहीं किया जा सकता है, और एक त्रुटि उत्पन्न होगा" .. यह है http://tools.android.com/tech-docs/new-build-system

+0

मेरी वर्तमान में खुले इनाम स्पष्ट करने के लिए, अगर आप निर्भरता के साथ काम करने के लिए एंड्रॉइड स्टूडियो में प्रोजेक्ट स्ट्रक्चर डायलॉग का उपयोग करते हैं, वहां "स्कोप" ड्रॉप-डाउन होता है। उस ड्रॉप-डाउन में अधिकांश आइटम समझ में आते हैं। वह जो "एपीके" नहीं है। यदि आप इसे चुनते हैं, तो आप 'build.gadle' में 'निर्भरता {apk' de.greenrobot: eventbus: 2.4.0 '}' जैसे कुछ के साथ हवाएं बनाते हैं। हालांकि, यह स्पष्ट नहीं है कि इस दायरे का वास्तव में क्या मतलब है, निर्भरता के साथ क्या किया जाएगा। – CommonsWare

उत्तर

41
  • provided से - केवल पैकेज समय निर्भरता
  • compile - - केवल निर्भरता
  • package संकलन समय compile- समय और पैकेज-टाइम निर्भरता

provided आमतौर पर एनोटेशन प्रोसेसिंग आधारित पुस्तकालयों के लिए उपयोग किया जाता है। आम तौर पर इन पुस्तकालयों को दो कलाकृतियों में विभाजित किया जाता है - "एनोटेशन" और "कंपाइलर"। "कंपाइलर" provided निर्भरता है क्योंकि आपको इसे केवल संकलन के लिए आवेदन में उपयोग करने की आवश्यकता नहीं है; और "एनोटेशन" compile निर्भरता है - इसका उपयोग एप्लिकेशन कोड में किया जाता है और इसलिए संकलित करता है। या जेनरेट कोड को अतिरिक्त निर्भरता की आवश्यकता हो सकती है जबकि आपका एप्लिकेशन नहीं हो सकता है। जैसे कटार निर्भरता विन्यास:

compile 'com.squareup.dagger:dagger:1.2.2' 
provided 'com.squareup.dagger:dagger-compiler:1.2.2' 
+0

तो एंड्रॉइड में हमें इसे काम करने के लिए डैगर के लिए घोषित करने की आवश्यकता है: प्रदान की गई 'org.glassfish: javax.annotation: 10.0-b28' तो इसका मतलब यह है कि डिवाइस में यह कोड नहीं होगा, केवल संकलन समय के लिए ही विधियों/कक्षाओं के लिए डिवाइस में अब शामिल नहीं हैं? – j2emanue

+0

क्या आप थोड़ा सा पैकेज समय समझा सकते हैं केवल निर्भरता है? क्या आप वाकई इसका इस्तेमाल करते हैं? – j2emanue

+0

@ j2emanue हाँ केवल पैकेज समय के लिए। जहां तक ​​मुझे याद है परिणाम परिणाम उत्पन्न करने के लिए एनोटेशन प्रोसेसर के लिए यह विशेष निर्भरता आवश्यक है। यह आउटपुट एपीके में पैक नहीं किया जाएगा। –

16

जेवियर APK गुंजाइश के बारे में here बात करती है।

एंड्रॉइड प्लगइन में, रनटाइम के बराबर (सॉर्ट) को एपीके कहा जाता है। आप

निर्भरता कर सकते हैं { APK फ़ाइलों ('libs/foo.jar') }

और यह केवल पैक कर देंगे लेकिन संकलन classpath पर नहीं होगा।

+0

ऐसा प्रतीत होता है। मैं कुछ हद तक परेशान हूं क्यों कोई इसे चाहेगा, लेकिन शायद मैं सिर्फ रचनात्मक नहीं हूं। बहुत धन्यवाद! – CommonsWare

+0

बस अनुमान लगा रहा है, लेकिन आप अपने प्रत्येक स्वाद के लिए एक अलग जार चाहते हैं (उदाहरण के लिए, विभिन्न आर्किटेक्चर के लिए)? – aows

+1

आप उन लोगों के लिए 'स्वाद 1 कॉम्पाइल', 'flavor2Compile', आदि का उपयोग करेंगे (जहां' स्वाद 1' और 'स्वाद 2' आपके स्वाद हैं)। – CommonsWare

32

ये गुण maven scopes से आते हैं।

वे बस निर्माण प्रक्रिया के प्रत्येक चरण के दौरान विशेष निर्भरताओं का इलाज करने का संकेत देते हैं।

  1. compile - एक डिफ़ॉल्ट दृष्टिकोण, यह बस का अर्थ है कि सभी निर्भरता संकलन समय पर उपलब्ध होना चाहिए। संकलन निर्भरता एक परियोजना के सभी कक्षाओं में उपलब्ध हैं। इसके अलावा, उन निर्भरताओं को निर्भर परियोजनाओं के लिए प्रचारित किया जाता है। एक संकलन-समय निर्भरता आमतौर पर रनटाइम पर आवश्यक होती है।

  2. package - एप्लिकेशन बनाने के लिए अतिरिक्त कॉन्फ़िगरेशन घोषित करता है। आप प्लगइन सूचीबद्ध कर सकते हैं जो निर्माण प्रक्रिया में अतिरिक्त कार्यक्षमता जोड़ते हैं।

  3. provided - इसका मतलब है कि रनटाइम पर्यावरण में इन निर्भरताओं को शामिल किया गया है। उदाहरण के लिए, जब आप android.jar लाइब्रेरी आंतरिक में देखते हैं तो आपको प्रत्येक विधि निकाय में java.lang.RuntimeException: Stub! दिखाई देगा।

    कुछ परिणाम है कि:,

    • आप स्थानीय रूप से Android अनुप्रयोगों को विकसित कर सकते हैं पूरा एंड्रॉयड पर्यावरण के बिना।
    • आपका एपीके आपको इसे एंड्रॉइड डिवाइस या एमुलेटर पर चलाना चाहिए क्योंकि इन विधियों के कार्यान्वयन प्रदान करता है।
    • एसडीके कक्षाओं का संदर्भ देने वाले आपके ऐप्स ठीक से निर्माण करेंगे, क्योंकि जार कक्षा मेटाडेटा प्रदान करता है।
    • जब तक आप कुछ लाइब्रेरी का उपयोग नहीं करते हैं जो कलाकृतियों (उदा। Robolectric) प्रदान करते हैं, तो आपको अपने एमुलेटर/डिवाइस पर परीक्षण चलाना होगा।

provided और package एंड्रॉयड पुस्तकालय के साथ प्रयोग किया जा सकता है, और एक त्रुटि उत्पन्न होगा।

यहाँ है कैसे sourceSet की तरह दिखता है:

enter image description here

अधिक निर्माण प्रणाली के बारे में जानकारी: https://www.youtube.com/watch?v=LCJAgPkpmR0

Gradle के बारे में एक भयानक लेख: http://www.sinking.in/blog/provided-scope-in-gradle/

संबंधित मुद्दे