R8 कॉन्फ़िगरेशन ऐनलिसिस टूल को इस तरह से डिज़ाइन किया गया है कि यह आपके ऐप्लिकेशन के कॉन्फ़िगरेशन की क्वालिटी के बारे में अहम जानकारी देता है. इससे आपको R8 की परफ़ॉर्मेंस से जुड़े फ़ायदों को ज़्यादा से ज़्यादा पाने में मदद मिलती है. इसकी मदद से, R8 ऑप्टिमाइज़ेशन को ट्रैक किया जा सकता है और उसे बेहतर बनाया जा सकता है. इसके लिए, मुख्य मेट्रिक पर नज़र रखें. खास तौर पर, कोड को छोटा करने, ऑप्टिमाइज़ करने, और कोड को उलझाकर पढ़ने में मुश्किल बनाने के स्कोर पर नज़र रखें. इनसे पता चलता है कि ऑप्टिमाइज़ेशन के लिए, आपके कोडबेस का कितना प्रतिशत उपलब्ध है. विश्लेषक, उन नियमों की पहचान करता है जिनमें कोड कॉम्पोनेंट को लागू करना ज़रूरी नहीं होता या जो ज़रूरी नहीं होते. इनमें तीसरे पक्ष की लाइब्रेरी से जुड़े नियम भी शामिल होते हैं. इससे आपको अपने कॉन्फ़िगरेशन को बेहतर बनाने में मदद मिलती है, ताकि R8 आपकी ज़्यादा से ज़्यादा क्लास, फ़ील्ड, और तरीकों को असरदार तरीके से ऑप्टिमाइज़ कर सके.
रिपोर्ट जनरेट करना
AGP 9.3.0-alpha05 और इसके बाद के वर्शन में, R8 बिल्ड चलाने पर रिपोर्ट build/outputs/mapping/release/configanalyzer.html में अपने-आप जनरेट हो जाती है. आउटपुट अपने-आप जनरेट होने की सुविधा बंद करने के लिए, यहां दी गई Gradle प्रॉपर्टी सेट करें:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
AGP 9.2 और इससे पहले के वर्शन के लिए, R8 की मदद से चालू किए गए बिल्ड के साथ Gradle टास्क चलाते समय, com.android.tools.r8.dumpkeepradiushtmltodirectory सिस्टम प्रॉपर्टी सेट करें.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
उदाहरण के लिए, /tmp/r8analysis डायरेक्ट्री में एचटीएमएल रिपोर्ट जनरेट करने के लिए, इस कमांड का इस्तेमाल करें:
// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis
// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis
रिपोर्ट को समझना
R8 कॉन्फ़िगरेशन ऐनलिसिस टूल, आपके ऐप्लिकेशन के R8 कॉन्फ़िगरेशन के बारे में अहम जानकारी देता है. साथ ही, यह बताता है कि हर कीप नियम का आपके ऐप्लिकेशन पर क्या असर पड़ता है. इससे आपको R8 से ज़्यादा से ज़्यादा ऑप्टिमाइज़ेशन हासिल करने में मदद मिलती है. साथ ही, आपके ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर होती है. यहां दिए गए स्कोर का इस्तेमाल करके जानें कि आपके कोडबेस का कितना हिस्सा, R8 की मदद से ऑप्टिमाइज़ किया जा सकता है.
स्कोर में गिरावट
R8, आपके ऐप्लिकेशन के साइज़ को कम करता है. इसके लिए, वह इस्तेमाल न होने वाले कोड और संसाधनों की पहचान करता है और उन्हें हटा देता है. इससे यह पक्का होता है कि आपका फ़ाइनल बिल्ड जितना हो सके उतना छोटा हो. श्रिंकिंग स्कोर से, उन क्लास, फ़ील्ड, और तरीकों का प्रतिशत पता चलता है जिन पर श्रिंकिंग लागू होती है. उदाहरण के लिए, 66% के श्रिंक होने का मतलब है कि R8, आपके कोडबेस के 66% हिस्से को श्रिंक कर सकता है.
ऑप्टिमाइज़ेशन स्कोर
R8, ऑप्टिमाइज़ेशन करता है. जैसे, मेथड इनलाइनिंग और क्लास मर्जिंग. इससे आपके ऐप्लिकेशन के स्टार्टअप और मेमोरी में सुधार होता है. ऑप्टिमाइज़ेशन स्कोर, क्लास, फ़ील्ड, और तरीकों के उस प्रतिशत को ट्रैक करता है जिन पर R8 ऑप्टिमाइज़ेशन लागू होते हैं. उदाहरण के लिए, अगर ऑप्टिमाइज़ेशन स्कोर 66% है, तो इसका मतलब है कि R8, आपके कोडबेस के सिर्फ़ 66% हिस्से को ऑप्टिमाइज़ कर सकता है.
ऑब्फ़स्केशन स्कोर
क्लास, फ़ील्ड, और तरीकों के नामों को छोटा करके, R8 ऐप्लिकेशन के मेटाडेटा के फ़ुटप्रिंट को कम करता है, ताकि मेमोरी बचाई जा सके. ऑब्फ़स्केशन स्कोर से यह पता चलता है कि आपके कोडबेस में, ऑब्फ़स्केट किए जा सकने वाले कोड का प्रतिशत कितना है.
डेटा को सुरक्षित रखने के नियमों को बेहतर बनाना
स्कोर को बेहतर बनाने और R8 ऑप्टिमाइज़ेशन को बेहतर तरीके से अनलॉक करने के लिए, आपको अपने कीप नियमों को बेहतर बनाना चाहिए. इससे R8 को आपके ऐप्लिकेशन को ऑप्टिमाइज़ करने से बेवजह रोकने से बचा जा सकेगा. आपको सिर्फ़ उन क्लास, तरीकों या फ़ील्ड को रखना चाहिए जिन्हें रिफ़्लेक्शन का इस्तेमाल करके ऐक्सेस किया जाता है.
इसके लिए, नियम के विश्लेषण को बनाए रखें का इस्तेमाल करें.
किसी नियम का ज़्यादा जानकारी वाला विश्लेषण देखने के लिए, उस पर क्लिक करें. इससे, ज़्यादा जानकारी वाली स्क्रीन खुल जाएगी.
डेटा सुरक्षित रखने के नियमों को बेहतर बनाने का तरीका
अपने ऐप्लिकेशन के लिए, R8 ऑप्टिमाइज़ेशन की पूरी क्षमता का इस्तेमाल करने और कीप नियमों को बेहतर बनाने के लिए, यह तरीका अपनाएं:
- हर कीप नियम के लिए, कॉन्फ़िगरेशन ऐनलिसिस में उन क्लास, फ़ील्ड, और तरीकों का प्रतिशत देखें जिन्हें R8 ऑप्टिमाइज़ नहीं कर सकता. इसका इस्तेमाल करके, उन नियमों की पहचान करें जिनकी वजह से कई क्लास, फ़ील्ड या तरीकों को ऑप्टिमाइज़ नहीं किया जा सकता. हर कीप नियम के हिसाब से, ऑप्टिमाइज़ेशन प्रॉपर्टी को भी सूची में शामिल किया जाता है.
- अगर आपको कोई ऐसा कीप रूल दिखता है जिसकी वजह से कई क्लास ऑप्टिमाइज़ नहीं हो पा रही हैं, तो आपको यह देखना चाहिए कि कीप रूल की वजह से कौनसी क्लास, फ़ील्ड, और तरीके ऑप्टिमाइज़ नहीं हो पा रहे हैं. इससे यह पता चलेगा कि यह नियम, रिफ़्लेक्शन का इस्तेमाल करके डाइनैमिक तौर पर लागू नहीं किए गए आइटम को सुरक्षित रख रहा है या नहीं.
- सिर्फ़ ज़रूरी क्लास, फ़ील्ड या तरीकों को टारगेट करके, कीप नियमों की वजह से ब्लॉक किए गए ऑप्टिमाइज़ेशन को कम करें. इसके लिए, सही कीप विकल्प चुनें और सबसे सही तरीकों का पालन करें.
- उन क्लास, फ़ील्ड, और तरीकों की जांच करें जिन पर कीप नियम का असर पड़ा है. साथ ही, उन पर टेस्ट चलाएं. इसके बाद, कीप नियमों को बेहतर बनाएं.
लाइब्रेरी के ऑप्टिमाइज़ेशन की जांच करना
तीसरे पक्ष की लाइब्रेरी को इंटिग्रेट करने पर, वे अक्सर R8 के साथ काम करने के लिए, उपभोक्ता के डेटा को सुरक्षित रखने से जुड़े अपने कीप नियम शामिल करती हैं. लाइब्रेरी तैयार करने वाला डेवलपर, आपके खास तरीके के बारे में अनुमान नहीं लगा सकता. इसलिए, वह कभी-कभी ऐसे नियम लिखता है जो ज़्यादा से ज़्यादा लोगों तक पहुंच सकें. इन नियमों की वजह से, ज़रूरत से ज़्यादा क्लास, फ़ील्ड, और तरीकों को ऑप्टिमाइज़ नहीं किया जा सकता. इससे R8 को आपके ऐप्लिकेशन के उन हिस्सों को ऑप्टिमाइज़ करने से रोका जा सकता है जिनका लाइब्रेरी के रनटाइम एक्ज़ीक्यूशन से कोई लेना-देना नहीं है. R8 कॉन्फ़िगरेशन ऐनलिसिस टूल का इस्तेमाल करके, उन लाइब्रेरी का पता लगाया जा सकता है जो ऐसे नियम लागू करती हैं जिनसे आपके ऐप्लिकेशन के ऑप्टिमाइज़ेशन पर बुरा असर पड़ता है.
कॉन्फ़िगरेशन विश्लेषक का इस्तेमाल करके, उपभोक्ताओं के लिए बनाए गए सभी मर्ज किए गए नियमों का असर देखें. तीसरे पक्ष की लाइब्रेरी से मिले हर कीप नियम के असर का विश्लेषण करके, तीसरे पक्ष की उन लाइब्रेरी का पता लगाया जा सकता है जिनकी वजह से आपके ऐप्लिकेशन को ऑप्टिमाइज़ करने में समस्या आ रही है.
लाइब्रेरी को ऑप्टिमाइज़ करने का तरीका
- अगर किसी लाइब्रेरी में बहुत सामान्य नियम शामिल है, तो हमारा सुझाव है कि आप लाइब्रेरी के रखरखाव करने वाले व्यक्ति से संपर्क करें. साथ ही, अपनी रिपोर्ट का डेटा शेयर करके बताएं कि उनके मौजूदा नियमों से आपके ऐप्लिकेशन के ऑप्टिमाइज़ेशन स्कोर पर क्या असर पड़ता है. अगर यह कोई बाहरी लाइब्रेरी है, तो समस्याएं सबमिट करने से पहले, लाइब्रेरी में मौजूद बग देखें.
- अगर ज़रूरी हो, तो किसी लाइब्रेरी से नियमों को फ़िल्टर करके, संभावित सुधारों को टेस्ट किया जा सकता है. लाइब्रेरी के नियमों को अपने प्रोजेक्ट में इंपोर्ट किया जा सकता है. साथ ही, ज़्यादा नियमों को छोड़कर, कॉन्फ़िगरेशन के विश्लेषण करने वाले टूल को फिर से चलाया जा सकता है. इससे, साइज़ और परफ़ॉर्मेंस में होने वाले संभावित फ़ायदों का आकलन किया जा सकता है.
शामिल किए गए नियम
ऐसा हो सकता है कि कई कीप रूल एक-दूसरे से ओवरलैप हो रहे हों. साथ ही, यह भी हो सकता है कि उनमें से कोई एक रूल, ज़रूरत से ज़्यादा ऑप्टिमाइज़ेशन को रोक रहा हो. अगर आपके कोडबेस में दो कीप नियम मौजूद हैं.
# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }
# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass
पहला कीप रूल, पूरे पैकेज में ऑप्टिमाइज़ेशन को रोकता है. यह दूसरे कीप रूल को शामिल करता है. दूसरा कीप रूल, पैकेज में मौजूद किसी क्लास को टारगेट करता है. इस क्लास को पहले कीप रूल के ज़रिए सुरक्षित रखा जाता है. जब कीप रूल ओवरलैप होते हैं, तो हो सकता है कि एक रूल, ज़रूरत से ज़्यादा ऑप्टिमाइज़ेशन को ब्लॉक कर दे. एक जैसी शर्तों वाले इन नियमों को बेहतर बनाकर, R8 ऑप्टिमाइज़ेशन को ज़्यादा से ज़्यादा किया जा सकता है. साथ ही, तकनीकी कर्ज़ को कम किया जा सकता है. इस प्रोसेस में, आपके कॉन्फ़िगरेशन को बेहतर बनाया जाता है, ताकि सिर्फ़ ज़रूरी कोड को रखा जा सके. साथ ही, R8 की ऑप्टिमाइज़ेशन सुविधाओं का पूरा फ़ायदा लिया जा सके.
शामिल किए गए नियमों को ऑप्टिमाइज़ करना
- R8 कॉन्फ़िगरेशन ऐनलिसिस टूल का इस्तेमाल करके, कोड कॉम्पोनेंट को लागू करने वाले नियमों का पता लगाएं.
- अपने कोडबेस में उन क्लास, फ़ील्ड या तरीकों की पहचान करें जो असल में रिफ़्लेक्शन पर निर्भर करते हैं. इन्हें कीप नियमों का इस्तेमाल करके सुरक्षित रखना ज़रूरी है. इससे आपको डेटा को सुरक्षित रखने से जुड़े नियमों को बेहतर बनाने में मदद मिलेगी.
- कॉन्फ़िगरेशन विश्लेषक का इस्तेमाल करके, उन नियमों के असर की तुलना करें जो एक ही क्लास, फ़ील्ड या तरीकों को टारगेट कर रहे हैं. हर कीप रूल की वजह से, ऑप्टिमाइज़ेशन में आने वाली रुकावट के प्रतिशत का इस्तेमाल करके यह पता लगाया जा सकता है कि कौन-सा कीप रूल ज़्यादा और कौन-सा कम असरदार है.
- अगर संकीर्ण नियम को सटीक तरीके से लिखा गया है, जिसमें सिर्फ़ उन सदस्यों या क्लास को शामिल किया गया है जिन्हें रिफ़्लेक्टिव तरीके से ऐक्सेस किया जाता है, तो बड़े कीप नियम को हटा दें. इससे आपके पैकेज के बाकी हिस्सों के लिए, R8 ऑप्टिमाइज़ेशन सुरक्षित तरीके से अनलॉक हो जाते हैं.
- अगर ब्रॉड रूल सही क्लास को टारगेट कर रहा है, तो ब्रॉड रूल को सेव रखें और नैरो रूल को मिटा दें. पतली लाइन सिर्फ़ ज़रूरत से ज़्यादा जगह घेरती है. पक्का करें कि आपने सामान्य नियम को इस तरह से बेहतर बनाया हो कि सिर्फ़ उन क्लास, फ़ील्ड या तरीकों को टारगेट किया जा सके जिनकी आपने पहचान की है.
बदलावों की पुष्टि करें और उन्हें टेस्ट करें: कॉन्फ़िगरेशन विश्लेषक को फिर से चलाएं, ताकि यह पक्का किया जा सके कि टकराव ठीक हो गया है. इसके बाद, रिलीज़ बिल्ड को कंपाइल करें और अपने बदलावों की जांच करें. इससे यह पक्का किया जा सकेगा कि कोडबेस आपकी उम्मीद के मुताबिक काम कर रहा है.
ग़ैर-ज़रूरी नियम हटाएं
कॉन्फ़िगरेशन के विश्लेषण की सुविधा का इस्तेमाल करके, अपने कोडबेस का व्यवस्थित तरीके से ऑडिट किया जा सकता है. इससे आपको ऐसे पुराने कीप नियमों की पहचान करने और उन्हें हटाने में मदद मिलती है जो आपके कॉन्फ़िगरेशन को खराब करते हैं. R8 कॉन्फ़िगरेशन ऐनलिसिस टूल, खास तौर पर दो मुख्य सोर्स को हाइलाइट करता है. ये सोर्स, गैर-ज़रूरी नियमों से जुड़े होते हैं:
- ऐसे नियम जिनका इस्तेमाल नहीं किया गया है: ऐसे नियम जो आपके मौजूदा बिल्ड में किसी भी क्लास, तरीके या फ़ील्ड से मेल नहीं खाते. ये समस्याएं, अक्सर कोड को फिर से व्यवस्थित करने, डिपेंडेंसी हटाने या कॉपी-पेस्ट किए गए उन कॉन्फ़िगरेशन की वजह से बनी रहती हैं जो अब काम के नहीं हैं. इससे कॉन्फ़िगरेशन की जटिलता बढ़ जाती है.
- एक जैसे नियम: एक जैसे कीप रूल का मतलब है कि ऐसे नियम जो एक ही क्लास, फ़ील्ड, और तरीकों को टारगेट करते हैं या एक ही कीप रूल फ़ाइल में कीप रूल के डुप्लीकेट एलान करते हैं.
दोनों तरह के नियमों से आपके कॉन्फ़िगरेशन में काफ़ी डेटा जुड़ जाता है. इससे उन्हें मैनेज करना और डीबग करना मुश्किल हो जाता है. इनकी पहचान करके, अपने कॉन्फ़िगरेशन को बेहतर बनाया जा सकता है.