2017-10-04 21 views
15

The docs उल्लेख करें कि implementationcompile/api पर महत्वपूर्ण निर्माण समय सुधार प्रदान करता है। compileOnly के बारे में क्या?एंड्रॉइड ग्रैडल कार्यान्वयन बनाम संकलन केवल प्रदर्शन

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

+0

'संकलन केवल' का अर्थ है कि उन निर्भरताओं को केवल समय संकलित करने के लिए सुलभ किया जाएगा, और ** ** रनटाइम के दौरान उपलब्ध नहीं है। यदि आपको मॉड्यूल को रनटाइम पर उन निर्भरताओं की आवश्यकता नहीं है, तो मुझे उन्हें 'compileOnly' घोषित करने में कोई समस्या नहीं दिखाई देती है। – azizbekian

+0

यह उस प्रश्न का समाधान नहीं करता है, जो प्रदर्शन के संबंध में है। – Eliezer

उत्तर

6

api विन्यास निर्भरता कि करने के लिए बाहरी modules(सकर्मक निर्भरता) निर्यात किया जाता है के लिए इस्तेमाल किया जाना चाहिए। उप-वर्सा implementation कॉन्फ़िगरेशन का उपयोग उन निर्भरताओं के लिए किया जाना चाहिए जो घटक (संक्रमणीय निर्भरता नहीं) के लिए आंतरिक हैं।

कार्यान्वयन compileOnly बनाम:

वहाँ अपना काम करने में कोई समानता है, compileOnly है

  • एक विन्यास जावा-प्लगइन से विरासत में मिली
  • संकलन समय पर आवश्यक
  • भी शामिल नहीं रनटाइम क्लासपाथ में या निर्भर परियोजनाओं के संपर्क में।

तो compileOnlyimplementation विन्यास काम जैसे प्रतिस्थापित नहीं करता:

implementation 'com.android.support:appcompat-v7:25.1.0' // can't use compileOnly here 
testCompile 'junit:junit:4.12' 

compile "com.google.dagger:dagger:2.8" // can't use here also 
annotationProcessor "com.google.dagger:dagger-compiler:2.8" // can't use here also 
compileOnly 'javax.annotation:jsr250-api:1.0' // we can use compileOnly here because it's required on run time only. 

के बाद से अपने मामले एक "बहु मॉड्यूल" है, तो आप api विन्यास का उपयोग करना होगा, जब तक आप अंतिम मॉड्यूल तक पहुँचने implementation का उपयोग करना बेहतर है।

enter image description here

प्रदर्शन:

बाद ग्राफ उन विन्यास का वर्णन?

मैं api अधिक स्मृति की आवश्यकता है क्योंकि Gradle कि सकर्मकमॉड्यूल में हर वर्ग स्नैपशॉट होगा, इसके विपरीत implementation एक पसंदीदा विन्यास है, क्योंकि (जैसा कि ऊपर उल्लेख) यह अपने स्वयं के आंतरिक कार्यान्वयन के लिए प्रयोग किया जाता है लगता है।

+0

स्पष्टीकरण के लिए धन्यवाद, लेकिन मेरा प्रश्न यह है कि सुधार, यदि कोई हो, तो 'कार्यान्वयन' पर 'compileOnly' का उपयोग करने के लिए हैं। – Eliezer

+0

@Eliezer उत्तर अद्यतन किया गया। – Ibrahim

+0

अभी भी काफी नहीं है।'CompileOnly' के लिए ग्रेडल दस्तावेज़ कहता है" निर्भरता जिनकी एपीआई संकलन समय पर आवश्यक है, लेकिन जिसका 'कार्यान्वयन' उपभोग करने वाली लाइब्रेरी, एप्लिकेशन या रनटाइम पर्यावरण द्वारा प्रदान किया जाना है। " मेरा सवाल यह है कि, मेरी लाइब्रेरी की निर्भरताओं को 'संकलित केवल' बनाम 'कार्यान्वयन' के रूप में घोषित करने का कोई लाभ है क्योंकि दोनों काम करेंगे (चेतावनी के साथ कि उपभोग करने वाले मॉड्यूल को उन निर्भरताओं को 'कार्यान्वयन' के रूप में घोषित करने की आवश्यकता होगी, यदि वे हैं सार्वजनिक एपीआई)। – Eliezer

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