कस्टम बिल्ड लॉजिक लागू करें

इस सेक्शन में, ऐडवांस विषयों के बारे में बताया गया है. ये विषय तब काम के होते हैं, जब आपको Android Gradle प्लग-इन को बढ़ाना हो या अपना प्लग-इन लिखना हो.

कस्टम लॉजिक में वैरिएंट की डिपेंडेंसी पब्लिश करना

लाइब्रेरी में ऐसी सुविधाएं हो सकती हैं जिनका इस्तेमाल, अन्य प्रोजेक्ट या सब-प्रोजेक्ट करना चाहें. लाइब्रेरी को पब्लिश करने की प्रोसेस से, लाइब्रेरी को उपभोक्ताओं के लिए उपलब्ध कराया जाता है. लाइब्रेरी यह कंट्रोल कर सकती हैं कि कंपाइल करने के समय और रनटाइम के दौरान, उनके उपभोक्ताओं के पास किन डिपेंडेंसी का ऐक्सेस हो.

दो अलग-अलग कॉन्फ़िगरेशन में, हर क्लासपाथ की ट्रांज़िशन डिपेंडेंसी होती हैं. लाइब्रेरी का इस्तेमाल करने के लिए, उपभोक्ताओं को इनका इस्तेमाल करना होगा. इनके बारे में यहां बताया गया है:

  • variant_nameApiElements: इस कॉन्फ़िगरेशन में, ट्रांज़िशन डिपेंडेंसी होती हैं. ये डिपेंडेंसी, कंपाइल के समय उपभोक्ताओं के लिए उपलब्ध होती हैं.
  • variant_nameRuntimeElements: इस कॉन्फ़िगरेशन में, ट्रांज़िशन डिपेंडेंसी होती हैं. ये डिपेंडेंसी, रनटाइम के दौरान उपभोक्ताओं के लिए उपलब्ध होती हैं.

अलग-अलग कॉन्फ़िगरेशन के बीच के संबंधों के बारे में ज़्यादा जानने के लिए, Java लाइब्रेरी प्लग इन कॉन्फ़िगरेशन पर जाएं.

डिपेंडेंसी को हल करने के लिए कस्टम रणनीतियां

किसी प्रोजेक्ट में, एक ही लाइब्रेरी के दो अलग-अलग वर्शन पर डिपेंडेंसी हो सकती है. इससे, डिपेंडेंसी से जुड़ी समस्याएं हो सकती हैं. उदाहरण के लिए, अगर आपका प्रोजेक्ट मॉड्यूल A के वर्शन 1 और मॉड्यूल B के वर्शन 2 पर निर्भर करता है और मॉड्यूल A, मॉड्यूल B के वर्शन 3 पर निर्भर करता है, तो डिपेंडेंसी वर्शन का विरोध होता है.

इस समस्या को हल करने के लिए, Android Gradle प्लग इन, डिपेंडेंसी रिज़ॉल्यूशन की इस रणनीति का इस्तेमाल करता है: जब प्लग इन को पता चलता है कि डिपेंडेंसी ग्राफ़ में एक ही मॉड्यूल के अलग-अलग वर्शन मौजूद हैं, तो डिफ़ॉल्ट रूप से वह सबसे ज़्यादा वर्शन नंबर वाला वर्शन चुनता है.

हालांकि, ऐसा हो सकता है कि यह रणनीति हमेशा आपकी उम्मीद के मुताबिक काम न करे. डिपेंडेंसी रिज़ॉल्यूशन की रणनीति को पसंद के मुताबिक बनाने के लिए, नीचे दिए गए कॉन्फ़िगरेशन का इस्तेमाल करके, अपने टास्क के लिए ज़रूरी वैरिएंट की खास डिपेंडेंसी को हल करें:

  • variant_nameCompileClasspath: इस कॉन्फ़िगरेशन में, किसी वैरिएंट के कंपाइल क्लासपाथ के लिए, रिज़ॉल्यूशन की रणनीति शामिल होती है.
  • variant_nameRuntimeClasspath: इस कॉन्फ़िगरेशन में, किसी वैरिएंट के रनटाइम क्लासपाथ के लिए, समस्या हल करने की रणनीति शामिल होती है.

Android Gradle प्लग इन में ऐसे गेट्टर शामिल होते हैं जिनका इस्तेमाल करके, हर वैरिएंट के कॉन्फ़िगरेशन ऑब्जेक्ट को ऐक्सेस किया जा सकता है. इसलिए, डिपेंडेंसी रिज़ॉल्यूशन के बारे में क्वेरी करने के लिए, वैरिएंट एपीआई का इस्तेमाल किया जा सकता है. इसका उदाहरण यहां दिया गया है:

Kotlin

android {
    applicationVariants.all {
        // Return compile configuration objects of a variant.
        compileConfiguration.resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        runtimeConfiguration.resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        annotationProcessorConfiguration.resolutionStrategy {
            ...
        }
    }
}

Groovy

android {
    applicationVariants.all { variant ->
        // Return compile configuration objects of a variant.
        variant.getCompileConfiguration().resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        variant.getRuntimeConfiguration().resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        variant.getAnnotationProcessorConfiguration().resolutionStrategy {
            ...
        }
    }
}