कई मॉड्यूल वाले प्रोजेक्ट में, Android लाइब्रेरी को उपयोगकर्ताओं के बीच डिस्ट्रिब्यूट करना मुश्किल हो सकता है. ऐसा तब होता है, जब प्रोजेक्ट के स्ट्रक्चर को साफ़ तौर पर बनाए रखने की कोशिश की जा रही हो. कई मामलों में, पब्लिश की जाने वाली लाइब्रेरी की संख्या, तय की गई संख्या से ज़्यादा होती है.
Android Gradle प्लग इन के साथ बंडल किया गया Fused Library प्लग इन, एक से ज़्यादा Android लाइब्रेरी मॉड्यूल को पब्लिश की जा सकने वाली एक Android लाइब्रेरी में पैकेज करने में मदद करता है. इससे, अपनी लाइब्रेरी के सोर्स कोड और संसाधनों को अपनी ज़रूरत के हिसाब से मॉड्यूलर बनाया जा सकता है. साथ ही, डिस्ट्रिब्यूट करने के बाद अपने प्रोजेक्ट के स्ट्रक्चर को छिपाया जा सकता है.
एक लाइब्रेरी के तौर पर डिस्ट्रिब्यूट करने से ये फ़ायदे मिल सकते हैं:
- डिपेंडेंसी को आसान बनाना: यह सुविधा, लाइब्रेरी की कई डिपेंडेंसी को एक ही एएआर से बदल देती है. इससे आपके उपयोगकर्ताओं के लिए, प्रोजेक्ट सेटअप और वर्शन मैनेजमेंट की प्रोसेस आसान हो जाती है
- लाइब्रेरी का साइज़ कम होना: इससे कोड छोटा करने की प्रोसेस बेहतर हो सकती है. इससे एएआर का साइज़ कम हो जाता है
- बेहतर सुरक्षा: पब्लिश की गई लाइब्रेरी को लागू करने से जुड़ी अंदरूनी जानकारी पर बेहतर कंट्रोल मिल सकता है
मर्ज की गई लाइब्रेरी बनाना
फ़्यूज़ की गई लाइब्रेरी बनाने के लिए, आपको एक नया Android मॉड्यूल बनाना होगा. इसके बाद, डिपेंडेंसी जोड़नी होंगी और फिर फ़्यूज़ की गई लाइब्रेरी को पब्लिश करना होगा.
नया फ़्यूज़्ड लाइब्रेरी मॉड्यूल जोड़ना
इस प्लगिन का इस्तेमाल करने के लिए, आपको अपने प्रोजेक्ट में एक नया Android मॉड्यूल जोड़ना होगा:
इस उदाहरण में, फ़्यूज़ किए गए लाइब्रेरी मॉड्यूल को myFusedLibrary कहा जाएगा.
gradle.propertiesफ़ाइल मेंandroid.experimental.fusedLibrarySupport=trueजोड़कर, फ़्यूज़ की गई लाइब्रेरी के साथ काम करने की सुविधा चालू करें.include(":myFusedLibrary")कोsettings.gradle.ktsफ़ाइल से जोड़ें.gradle/libs.versions.tomlफ़ाइल में,[plugins]सेक्शन के नीचेandroid-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }जोड़ें.- सबसे ऊपर मौजूद
build.gradle.ktsफ़ाइल में, प्लगिन ब्लॉक मेंalias(libs.plugins.android.fusedlibrary) apply falseजोड़ें. myFusedLibraryमॉड्यूल बनाने के लिए,myFusedLibraryनाम की एक नई डायरेक्ट्री बनाएं. इसके लिए, 'My Application' पर राइट क्लिक करें > New > Directory पर क्लिक करें.build.gradle.ktsमॉड्यूल मेंbuild.gradle.ktsफ़ाइल बनाएं (build.gradle.ktsमॉड्यूल पर राइट क्लिक करें > नया > फ़ाइल).myFusedLibrarymyFusedLibrarymyFusedLibrary/build.gradle.ktsफ़ाइल में यह कोड चिपकाएं:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
डिपेंडेंसी जोड़ें
फ़्यूज़ की गई लाइब्रेरी का मुख्य काम, डिपेंडेंसी को बंडल करना है. इस प्लगिन की मदद से, लोकल प्रोजेक्ट की डिपेंडेंसी और बाहरी लाइब्रेरी जोड़ी जा सकती हैं.
पैकेज किए जाने वाले कॉम्पोनेंट की डिपेंडेंसी के बारे में बताने के लिए, include कॉन्फ़िगरेशन का इस्तेमाल करें.
ट्रांज़िटिव डिपेंडेंसी को पैकेज नहीं किया जाता.
उदाहरण के लिए:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
मर्ज की गई लाइब्रेरी पब्लिश करना
फ़्यूज़ की गई लाइब्रेरी को पब्लिश करने से पहले, आपको Android लाइब्रेरी को पब्लिश करने के बारे में जानकारी होनी चाहिए. फ़्यूज़ की गई लाइब्रेरी को पब्लिश करना, Android लाइब्रेरी को पब्लिश करने जैसा ही है. हालांकि, कुछ मुख्य अंतर हैं जिन पर आपको फ़्यूज़ की गई लाइब्रेरी को सही तरीके से पब्लिश करने के लिए ध्यान देना होगा:
- Maven Publish Plugin को उस मॉड्यूल पर भी लागू किया जाना चाहिए जिस पर FusedLibrary plugin लागू किया गया है.
- पब्लिकेशन को
fusedLibraryComponentसे इनहेरिट करना होगा, क्योंकि इससे फ़्यूज़ की गई लाइब्रेरी के आर्टफ़ैक्ट को कंपाइल करने के लिए ज़रूरी डिपेंडेंसी मिलती हैं.
यहां पब्लिकेशन के कॉन्फ़िगरेशन का एक उदाहरण दिया गया है:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
Groovy
plugins { id 'com.android.fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
टेस्टिंग के लिए, फ़्यूज़ की गई लाइब्रेरी पब्लिश करना
आपको Android ऐप्लिकेशन या Android लाइब्रेरी से पब्लिश की गई फ़्यूज़ की गई लाइब्रेरी के हिसाब से जांच करनी चाहिए. हमारा सुझाव है कि आप फ़्यूज़ की गई लाइब्रेरी और उसकी प्रोजेक्ट डिपेंडेंसी को लोकल मेवन रिपॉज़िटरी में पब्लिश करें.
फ़्यूज़ की गई लाइब्रेरी के आर्टफ़ैक्ट को किसी लोकल रिपॉज़िटरी में पब्लिश करने के लिए, यहां दिए गए कॉन्फ़िगरेशन की तरह कोई कॉन्फ़िगरेशन तय करें:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Groovy
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
मर्ज की गई लाइब्रेरी अपलोड करना
मर्ज की गई लाइब्रेरी को डिस्ट्रिब्यूट करने के लिए, अपनी लाइब्रेरी अपलोड करना लेख पढ़ें.
व्यवहार और सुरक्षा उपाय
Android लाइब्रेरी को एक साथ इस्तेमाल करने में कुछ समस्याएं आती हैं. इस वजह से, प्लगिन के लिए यह तय करना मुश्किल हो जाता है कि किस लाइब्रेरी को प्राथमिकता दी जाए. उदाहरण के लिए, एक ही क्लासपाथ वाली दो लाइब्रेरी को फ़्यूज़ करने पर, बिल्ड फ़ेल हो जाएगा. संसाधन मर्ज करते समय, उन डिपेंडेंसी के क्रम को ध्यान में रखा जाएगा जिन्हें अलग-अलग लाइब्रेरी में एक ही नाम वाले संसाधन को चुनते समय तय किया गया था.
- डिपेंडेंसी के तौर पर जोड़ने के लिए, फ़्यूज़ की गई लाइब्रेरी को सिर्फ़ Android लाइब्रेरी आर्टफ़ैक्ट AAR के तौर पर पब्लिश किया जा सकता है.
- डेटा बाइंडिंग का इस्तेमाल करने वाली लाइब्रेरी को फ़्यूज़ नहीं किया जा सकता.
- एक ही फ़्यूज़ की गई लाइब्रेरी में, कई बिल्ड टाइप और प्रॉडक्ट फ़्लेवर को फ़्यूज़ नहीं किया जा सकता. अलग-अलग वैरिएंट के लिए, अलग-अलग फ़्यूज़ की गई लाइब्रेरी बनाएं.
कॉन्फ़िगरेशन की ज़रूरत और इस्तेमाल में आसानी के बीच बैलेंस बनाए रखने के लिए, प्लगिन अस्पष्ट टकरावों पर बिल्ड को फ़ेल कर देगा या आर्टफ़ैक्ट को फ़्यूज़ करते समय, अनुमानित तरीके का इस्तेमाल करेगा. आर्टफ़ैक्ट को फ़्यूज़ करने के तरीके के बारे में जानकारी, यहां दी गई टेबल में दी गई है:
| टाइप | व्यवहार |
|---|---|
| कक्षाएं | एक ही क्लासपाथ वाली लाइब्रेरी को फ़्यूज़ करने पर, बिल्ड फ़ेल हो जाएगा. |
| Android संसाधन | संसाधन मर्ज करते समय, डिपेंडेंसी के क्रम को ध्यान में रखा जाएगा. यह क्रम, अलग-अलग फ़ाइलों में एक ही नाम वाले संसाधन को चुनते समय तय किया गया था. |
| AAR मेटाडेटा | एएआर के मेटाडेटा वर्शन को मर्ज किया जाता है. इसके लिए, हर डिपेंडेंसी लाइब्रेरी से सबसे ज़्यादा वैल्यू को प्राथमिकता दी जाती है. इन वैल्यू को बदलने के लिए, डीएसएल उपलब्ध है. Kotlin androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| Java के संसाधन | एक जैसे पाथ वाली कई लाइब्रेरी में मौजूद Java रिसॉर्स फ़ाइलों का इस्तेमाल करने की अनुमति नहीं है. ऐसा करने पर, बिल्ड फ़ेल हो जाएगा. |
मौजूदा समस्याएं
फ़्यूज़्ड लाइब्रेरी एक नया प्लगिन है. इसमें कुछ समस्याएं हैं. इन समस्याओं को ठीक करने के लिए काम किया जा रहा है, ताकि सभी इस्तेमाल के उदाहरणों को पूरा किया जा सके.
- सोर्स JAR फ़ाइलें जनरेट नहीं की जा सकतीं
- अन्य .aar फ़ाइलों पर फ़ाइल डिपेंडेंसी जोड़ना
- RenderScript और Prefab आर्टफ़ैक्ट को फ़्यूज़ करने की सुविधा उपलब्ध नहीं है
फ़्यूज़ की गई लाइब्रेरी की डिपेंडेंसी समझना
फ़्यूज़ की गई लाइब्रेरी में कोई सोर्स नहीं होता है. साथ ही, यह सिर्फ़ Android लाइब्रेरी का इस्तेमाल करती है. इसलिए, यह समझना ज़रूरी है कि कौनसी चीज़ कहां से आती है. नतीजे के तौर पर मिले आर्टफ़ैक्ट में मर्ज की गई डिपेंडेंसी और आर्टफ़ैक्ट बनाने के लिए ज़रूरी डिपेंडेंसी की सूची बनाने के लिए, फ़्यूज़ की गई लाइब्रेरी पर gradle :report टास्क चलाएं. यह टास्क, JSON रिपोर्ट जनरेट करता है. यह रिपोर्ट, फ़्यूज़ की गई लाइब्रेरी की build/reports डायरेक्ट्री में सेव की जाती है.
इंटरनल प्लगिन की डिपेंडेंसी के बारे में ज़्यादा जानकारी पाने के लिए, gradle :dependencies टास्क चलाएं. इससे आपको प्लगिन कॉन्फ़िगरेशन की स्थिति दिखेगी.