R8 कॉन्फ़िगरेशन ऐनलाइज़र एक टूल है. इसे इस तरह से डिज़ाइन किया गया है कि यह आपके ऐप्लिकेशन के कॉन्फ़िगरेशन की क्वालिटी के बारे में अहम जानकारी देता है. इससे आपको R8 की परफ़ॉर्मेंस से जुड़े फ़ायदों को ज़्यादा से ज़्यादा पाने में मदद मिलती है. इसकी मदद से, R8 ऑप्टिमाइज़ेशन को ट्रैक किया जा सकता है और उसे बेहतर बनाया जा सकता है. इसके लिए, मुख्य मेट्रिक पर नज़र रखें. जैसे, कोड को छोटा करने, ऑप्टिमाइज़ करने, और कोड को छिपाने के स्कोर. इनसे पता चलता है कि आपके कोडबेस का कितना प्रतिशत ऑप्टिमाइज़ेशन के लिए उपलब्ध है. विश्लेषक, उन नियमों की पहचान करता है जिनमें कोड कॉम्पोनेंट को लागू करना ज़रूरी नहीं होता या जो ज़रूरी नहीं होते. इनमें तीसरे पक्ष की लाइब्रेरी से जुड़े नियम भी शामिल हैं. इससे आपको अपने कॉन्फ़िगरेशन को बेहतर बनाने में मदद मिलती है, ताकि R8 आपकी ज़्यादा से ज़्यादा क्लास, फ़ील्ड, और तरीकों को असरदार तरीके से ऑप्टिमाइज़ कर सके.
रिपोर्ट जनरेट करना
AGP 9.3.0 और इसके बाद के वर्शन में, R8 कॉन्फ़िगरेशन ऐनलिसिस की रिपोर्ट जनरेट की जा सकती है. इसके लिए, अलग से उपलब्ध Gradle टास्क का इस्तेमाल किया जा सकता है. इसके अलावा, R8 बिल्ड के दौरान यह रिपोर्ट अपने-आप जनरेट हो जाती है.
स्टैंडअलोन Gradle टास्क चलाएं (स्थानीय तौर पर इस्तेमाल करने के लिए सुझाव दिया गया है)
कीप नियमों में लगातार बदलाव करते समय, स्टैंडअलोन Gradle टास्क का इस्तेमाल करें. इससे, APK या बंडल को पूरी तरह से बनाए बिना, अपने बदलावों के असर का तुरंत आकलन किया जा सकता है:
./gradlew :app:analyzeReleaseR8Config
इस टास्क में APK या बंडल जनरेट करने की प्रोसेस को छोड़ दिया जाता है. इसलिए, इसमें बहुत कम समय लगता है. इससे आपको यह तुरंत विश्लेषण करने में मदद मिलती है कि कीप नियमों का असर, कोड छोटा करने, ऑप्टिमाइज़ करने, और कोड को उलझाने के स्कोर पर कैसे पड़ता है. साथ ही, इन स्कोर को तुरंत बेहतर बनाने में मदद मिलती है. एचटीएमएल रिपोर्ट, app/build/reports/r8/r8-config-analyzer-release.html पर जनरेट होती है.
नियमित बिल्ड के दौरान अपने-आप जनरेट होता है
R8 की पूरी रिलीज़ (जैसे, assembleRelease) को चलाने पर, रिपोर्ट build/outputs/mapping/release/configanalyzer.html पर अपने-आप जनरेट हो जाती है.
नियमित बिल्ड के दौरान आउटपुट अपने-आप जनरेट होने की सुविधा बंद करने के लिए, यह Gradle प्रॉपर्टी सेट करें:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
AGP 9.2 और इससे पहले के वर्शन के लिए
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 कॉन्फ़िगरेशन ऐनललाइज़र, खास तौर पर दो मुख्य सोर्स को हाइलाइट करता है. ये सोर्स, गैर-ज़रूरी नियमों के लिए ज़िम्मेदार होते हैं:
- ऐसे नियम जिनका इस्तेमाल नहीं किया गया है: ऐसे नियम जो आपके मौजूदा बिल्ड में किसी भी क्लास, तरीके या फ़ील्ड से मेल नहीं खाते. ये अक्सर कोड रीफ़ैक्टरिंग, डिपेंडेंसी हटाने या कॉपी-पेस्ट किए गए उन कॉन्फ़िगरेशन के बाद भी बने रहते हैं जो अब काम के नहीं हैं. इससे कॉन्फ़िगरेशन की जटिलता बढ़ जाती है.
- एक जैसे नियम: एक जैसे कीप रूल का मतलब है कि ऐसे नियम जो एक ही क्लास, फ़ील्ड, और तरीकों को टारगेट करते हैं या एक ही कीप रूल फ़ाइल में कीप रूल के डुप्लीकेट एलान करते हैं.
दोनों तरह के नियमों से आपके कॉन्फ़िगरेशन में गड़बड़ी हो सकती है. इससे उन्हें मैनेज करना और डीबग करना मुश्किल हो जाता है. इनकी पहचान करके, अपने कॉन्फ़िगरेशन को बेहतर बनाया जा सकता है.