ऐप्लिकेशन ऑप्टिमाइज़ेशन की सुविधा चालू करने के लिए, आपको ऐसी लाइब्रेरी का इस्तेमाल करना होगा जो Android ऑप्टिमाइज़ेशन के साथ काम करती हों. अगर कोई लाइब्रेरी, Android ऑप्टिमाइज़ेशन के लिए कॉन्फ़िगर नहीं की गई है, तो हो सकता है कि वह Android ऐप्लिकेशन के लिए सही न हो. उदाहरण के लिए, अगर वह रिफ़्लेक्शन का इस्तेमाल, उससे जुड़े रखरखाव के नियमों को बंडल किए बिना करती है. इस पेज पर बताया गया है कि कुछ लाइब्रेरी, ऐप्लिकेशन ऑप्टिमाइज़ेशन के लिए क्यों बेहतर हैं. साथ ही, आपको लाइब्रेरी चुनने में मदद करने के लिए सामान्य सलाह भी दी गई हैं.
रिफ़्लेक्शन के बजाय codegen का इस्तेमाल करना
आम तौर पर, आपको ऐसी लाइब्रेरी चुननी चाहिए जो रिफ़्लेक्शन के बजाय, कोड जनरेशन (codegen) का इस्तेमाल करती हों. codegen की मदद से, ऑप्टिमाइज़र यह आसानी से तय कर सकता है कि रनटाइम के दौरान किस कोड का इस्तेमाल किया जाता है और किस कोड को हटाया जा सकता है. यह बताना मुश्किल हो सकता है कि कोई लाइब्रेरी, कोड जनरेशन या रिफ़्लेक्शन में से किसका इस्तेमाल करती है. हालांकि, इसके कुछ संकेत होते हैं. मदद पाने के लिए, सलाह देखें.
codegen बनाम रिफ़्लेक्शन के बारे में ज़्यादा जानने के लिए, लाइब्रेरी के लेखकों के लिए ऑप्टिमाइज़ेशन देखें.
लाइब्रेरी चुनते समय सामान्य सलाह
इन सुझावों का इस्तेमाल करके, पक्का करें कि आपकी लाइब्रेरी, ऐप्लिकेशन ऑप्टिमाइज़ेशन के साथ काम करती हों.
ऑप्टिमाइज़ेशन से जुड़ी समस्याओं की जांच करना
नई लाइब्रेरी चुनते समय, लाइब्रेरी के समस्या ट्रैकर और ऑनलाइन चर्चाओं को देखें. इससे यह पता चलेगा कि ऐप्लिकेशन को छोटा करने या ऑप्टिमाइज़ करने से जुड़ी कोई समस्या है या नहीं. अगर ऐसा है, तो आपको उस लाइब्रेरी के विकल्प ढूंढने चाहिए. इन बातों का ध्यान रखें:
- AndroidX लाइब्रेरी और Hilt जैसी लाइब्रेरी, ऐप्लिकेशन को ऑप्टिमाइज़ करने के लिए बेहतरीन तरीके से काम करती हैं. ऐसा इसलिए, क्योंकि ये रिफ़्लेक्शन के बजाय codegen का इस्तेमाल करती हैं. रिफ़्लेक्शन का इस्तेमाल करने पर, वे सिर्फ़ ज़रूरी कोड को सेव करने के लिए, कम से कम नियम देते हैं.
- ऑब्जेक्ट को इंस्टैंशिएट या सीरियलाइज़ करते समय, सीरियलाइज़ेशन लाइब्रेरी अक्सर रिफ़्लेक्शन का इस्तेमाल करती हैं, ताकि बोइलरप्लेट कोड से बचा जा सके. रिफ़्लेक्शन पर आधारित तरीकों (जैसे, JSON के लिए Gson) के बजाय, ऐसी लाइब्रेरी खोजें जो इन समस्याओं से बचने के लिए codegen का इस्तेमाल करती हैं. उदाहरण के लिए, Kotlin Serialization का इस्तेमाल करें.
- अगर हो सके, तो पैकेज के लिए बनाए गए सभी नियमों को शामिल करने वाली लाइब्रेरी का इस्तेमाल न करें. पैकेज के लिए बनाए गए, 'रखें' नियमों से गड़बड़ियों को ठीक करने में मदद मिल सकती है. हालांकि, 'रखें' के लिए बनाए गए ब्रॉड नियमों को बेहतर बनाया जाना चाहिए, ताकि सिर्फ़ ज़रूरी कोड ही रखा जा सके. ज़्यादा जानकारी के लिए, ऑप्टिमाइज़ेशन को धीरे-धीरे अपनाना लेख पढ़ें.
नई लाइब्रेरी जोड़ने के बाद, ऑप्टिमाइज़ेशन की सुविधा चालू करना
नई लाइब्रेरी जोड़ने के बाद, ऑप्टिमाइज़ेशन चालू करें और देखें कि कोई गड़बड़ी तो नहीं है. अगर गड़बड़ियां हैं, तो उस लाइब्रेरी के विकल्प खोजें या रखे गए नियम लिखें. अगर कोई लाइब्रेरी ऑप्टिमाइज़ेशन के साथ काम नहीं करती है, तो उस लाइब्रेरी के लिए गड़बड़ी की शिकायत करें.
नियम जोड़े जाते हैं
ध्यान रखें कि 'डेटा को सेव रखें' नियम जोड़ने वाले होते हैं. इसका मतलब है कि लाइब्रेरी डिपेंडेंसी में शामिल कुछ नियमों को हटाया नहीं जा सकता. साथ ही, इन नियमों से आपके ऐप्लिकेशन के अन्य हिस्सों के कंपाइल होने पर असर पड़ सकता है. उदाहरण के लिए, अगर किसी लाइब्रेरी में कोड ऑप्टिमाइज़ेशन को बंद करने का नियम शामिल है, तो वह नियम आपके पूरे प्रोजेक्ट के लिए ऑप्टिमाइज़ेशन बंद कर देता है.
रिफ़्लेक्शन (ऐडवांस) का इस्तेमाल किया गया है या नहीं
लाइब्रेरी के कोड की जांच करके यह पता लगाया जा सकता है कि वह रिफ़्लेक्शन का इस्तेमाल करती है या नहीं. अगर लाइब्रेरी में रिफ़्लेक्शन का इस्तेमाल किया जाता है, तो देखें कि उसमें डेटा को सेव रखने के नियम दिए गए हैं या नहीं. अगर कोई लाइब्रेरी इन कामों को करती है, तो हो सकता है कि वह रिफ़्लेक्शन का इस्तेमाल कर रही हो:
kotlin.reflect
याjava.lang.reflect
के पैकेज में मौजूद क्लास या तरीकों का इस्तेमाल करता हैClass.forName
याclassLoader.getClass
फ़ंक्शन का इस्तेमाल किया गया हो- रनटाइम के दौरान एनोटेशन पढ़ता है. उदाहरण के लिए, अगर यह
val value = myClass.getAnnotation()
याval value = myMethod.getAnnotation()
का इस्तेमाल करके एनोटेशन की वैल्यू सेव करता है और फिरvalue
के साथ कुछ करता है स्ट्रिंग के तौर पर, तरीके के नाम का इस्तेमाल करके तरीके को कॉल करता है. उदाहरण के लिए:
// Calls the private `processData` API with reflection myObject.javaClass.getMethod("processData", DataType::class.java) ?.invoke(myObject, data)
'रखें' के लिए गलत नियमों को फ़िल्टर करना (ऐडवांस)
आपको ऐसी लाइब्रेरी से बचना चाहिए जिनमें ऐसे नियम हों जिनकी वजह से, कोड को बनाए रखा जाता है. हालांकि, अगर आपको इनका इस्तेमाल करना है, तो नियमों को फ़िल्टर किया जा सकता है. इसके लिए, नीचे दिए गए कोड का इस्तेमाल करें:
// If you're using AGP 8.4 and higher
buildTypes {
release {
optimization.keepRules {
it.ignoreFrom("com.somelibrary:somelibrary")
}
}
}
// If you're using AGP 7.3-8.3
buildTypes {
release {
optimization.keepRules {
it.ignoreExternalDependencies("com.somelibrary:somelibrary")
}
}
}
केस स्टडी: ऑप्टिमाइज़ेशन के साथ Gson क्यों काम नहीं करता
Gson एक सीरियलाइज़ेशन लाइब्रेरी है. इसकी वजह से, ऐप्लिकेशन को ऑप्टिमाइज़ करने में अक्सर समस्याएं आती हैं, क्योंकि यह रिफ़्लेक्शन का ज़्यादा इस्तेमाल करती है. नीचे दिए गए कोड स्निपेट में बताया गया है कि Gson का इस्तेमाल आम तौर पर कैसे किया जाता है. इससे रनटाइम के दौरान आसानी से क्रैश हो सकता है. ध्यान दें कि User ऑब्जेक्ट की सूची पाने के लिए Gson का इस्तेमाल करने पर, कन्स्ट्रक्टर को कॉल नहीं किया जाता या fromJson()
फ़ंक्शन में फ़ैक्ट्री को पास नहीं किया जाता. ऐप्लिकेशन की तय की गई क्लास को इनमें से किसी के बिना बनाना या इस्तेमाल करना, इस बात का संकेत है कि लाइब्रेरी में ओपन-एंडेड रिफ़्लेक्शन का इस्तेमाल किया जा रहा है:
- लाइब्रेरी, स्टैंडर्ड इंटरफ़ेस या क्लास को लागू करने वाली ऐप्लिकेशन क्लास
- केएसपी जैसा कोड जनरेशन प्लग इन
class User(val name: String)
class UserList(val users: List<User>)
// This code runs in debug mode, but crashes when optimizations are enabled
Gson().fromJson("""[{"name":"myname"}]""", User::class.java).toString()
जब R8 इस कोड का विश्लेषण करता है और उसे कहीं भी UserList
या User
का इस्तेमाल नहीं दिखता है, तो वह फ़ील्ड का नाम बदल सकता है या ऐसे कन्स्ट्रक्टर हटा सकता है जिनका इस्तेमाल नहीं किया जा रहा है. इससे आपका ऐप्लिकेशन क्रैश हो सकता है. अगर किसी दूसरी लाइब्रेरी का इस्तेमाल इसी तरह किया जा रहा है, तो आपको यह देखना चाहिए कि वे ऐप्लिकेशन के ऑप्टिमाइज़ेशन में रुकावट न डालें. अगर ऐसा होता है, तो उनका इस्तेमाल न करें.
ध्यान दें कि Room और Hilt, दोनों ऐप्लिकेशन के तय किए गए टाइप बनाते हैं. हालांकि, रिफ़्लेक्शन की ज़रूरत से बचने के लिए, codegen का इस्तेमाल करते हैं.