ग्रेडेल compileकीवर्ड निर्भरता को कॉन्फ़िगर करने के लिए apiऔर implementationकीवर्ड के पक्ष में हटा दिया गया था ।
उपयोग करना apiपदावनत का उपयोग करने के बराबर है compile, इसलिए यदि आप सभी compileको apiहर चीज से प्रतिस्थापित करते हैं तो हमेशा की तरह काम करेंगे।
implementationकीवर्ड को समझने के लिए निम्नलिखित उदाहरण पर विचार करें।
उदाहरण
मान लीजिए कि आपके पास एक पुस्तकालय है जिसे MyLibraryआंतरिक रूप से एक अन्य पुस्तकालय कहा जाता है InternalLibrary। कुछ इस तरह:
// 'InternalLibrary' module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
// 'MyLibrary' module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
मान लीजिए इस तरह से कॉन्फ़िगरेशन का MyLibrary build.gradleउपयोग करता apiहै dependencies{}:
dependencies {
api project(':InternalLibrary')
}
आप MyLibraryअपने कोड में उपयोग करना चाहते हैं ताकि आपके ऐप में build.gradleआप इस निर्भरता को जोड़ दें:
dependencies {
implementation project(':MyLibrary')
}
apiकॉन्फ़िगरेशन का उपयोग करना (या पदावनत compile) आप InternalLibraryअपने आवेदन कोड में पहुंच सकते हैं :
// Access 'MyLibrary' (granted)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());
// Can ALSO access the internal library too (and you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
इस तरह से मॉड्यूल MyLibraryसंभावित रूप से किसी चीज के आंतरिक कार्यान्वयन को "लीक" कर रहा है। आपको इसका उपयोग नहीं करना चाहिए (क्योंकि यह आपके द्वारा सीधे आयात नहीं किया गया है)
implementationविन्यास इसे रोकने के लिए शुरू की गई थी। तो अब अगर आप का उपयोग implementationकरने के बजाय apiमें MyLibrary:
dependencies {
implementation project(':InternalLibrary')
}
अब आप InternalLibrary.giveMeAString()अपने ऐप कोड में कॉल नहीं कर पाएंगे ।
मुक्केबाजी रणनीति इस तरह एंड्रॉयड Gradle पता चला है कि अगर आप में कुछ संपादित प्लगइन की अनुमति देता है InternalLibrary, यह केवल की रखता को गति प्रदान करना चाहिए MyLibraryऔर नहीं अपने पूरे अनुप्रयोग के रखता है, क्योंकि आप के लिए पहुँच नहीं है InternalLibrary।
जब आपके पास बहुत अधिक नेस्टेड निर्भरता होती है, तो यह तंत्र बिल्ड को बहुत तेज कर सकता है। (इसकी पूरी समझ के लिए वीडियो को अंत में देखें)
निष्कर्ष
जब आप नए एंड्रॉइड ग्रैगल प्लगइन 3.XX पर स्विच करते हैं, तो आपको अपने सभी compileको implementationकीवर्ड (1 *) से बदलना चाहिए । फिर अपने ऐप को कंपाइल और टेस्ट करने की कोशिश करें। यदि सब कुछ ठीक है तो कोड को छोड़ दें, यदि आपके पास समस्याएं हैं, तो आपके पास शायद आपकी निर्भरता के साथ कुछ गलत है या आपने कुछ ऐसा उपयोग किया है जो अब निजी है और अधिक सुलभ नहीं है। एंड्रॉइड ग्रैडल प्लगइन इंजीनियर जेरोम डोचेज़ द्वारा सुझाव (1 ) * )
यदि आप एक लाइब्रेरी मेन्टेनर हैं, तो आपको apiप्रत्येक निर्भरता के लिए उपयोग करना चाहिए जो आपके पुस्तकालय के सार्वजनिक एपीआई के लिए आवश्यक है, जबकि implementationपरीक्षण निर्भरता या निर्भरता के लिए उपयोग करें जो अंतिम उपयोगकर्ताओं द्वारा उपयोग नहीं की जानी चाहिए।
उपयोगी लेख कार्यान्वयन और एपीआई के बीच अंतर को दर्शाता है
संदर्भ
(यह समय बचाने के लिए एक ही वीडियो है)
Google I / O 2017 - ग्रैडल कैसे तेजी से बढ़ता है (पूर्ण वीडियो)
Google I / O 2017 - ग्रैडल कैसे बनता है (NEW GRADLE PLUGIN 3.0.0 PART ON मात्र)
Google I / O 2017 - ग्रैडल कैसे बनता है ( 1 * का संदर्भ )
Android प्रलेखन