R8 कॉन्फ़िगरेशन ऐनालाइज़र का इस्तेमाल करना

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

रिपोर्ट जनरेट करना

AGP 9.3.0 और इसके बाद के वर्शन में, R8 कॉन्फ़िगरेशन ऐनलाइज़र की रिपोर्ट जनरेट की जा सकती है. इसके लिए, Gradle का अलग से टास्क इस्तेमाल किया जा सकता है. इसके अलावा, R8 बिल्ड के दौरान यह रिपोर्ट अपने-आप जनरेट हो जाती है.

Gradle का अलग से टास्क चलाना (स्थानीय तौर पर इस्तेमाल करने के लिए, यह हमारा सुझाव है)

कीप के नियमों पर बार-बार बदलाव करते समय, Gradle का अलग से टास्क इस्तेमाल करें. इससे, APK या बंडल को पूरी तरह से बनाए बिना, अपने बदलावों के असर का तुरंत आकलन किया जा सकता है:

./gradlew :app:analyzeReleaseR8Config

यह टास्क, APK या बंडल जनरेट नहीं करता. इसलिए, इससे आपको बहुत कम समय में फ़ीडबैक मिल जाता है. इससे, यह तेज़ी से विश्लेषण किया जा सकता है कि कीप के नियमों से, रिसॉर्स को हटाने, ऑप्टिमाइज़ेशन, और कोड को अस्पष्ट बनाने के स्कोर पर कैसे असर पड़ता है. साथ ही, इन नियमों को तुरंत बेहतर बनाया जा सकता है. HTML रिपोर्ट, 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 की स्थानीय कॉपी को नए वर्शन में अपडेट करें. इसके लिए, इसे अपने प्रोजेक्ट की settings.gradle या settings.gradle.kts फ़ाइल में, क्लासपाथ डिपेंडेंसी के तौर पर जोड़ें:

pluginManagement {
    repositories {
        google()
        mavenCentral()
    }
    buildscript {
        dependencies {
            // Update to a more recent R8 version.
            classpath("com.android.tools:r8:9.4.14")
        }
    }
}

इससे, R8 के नए वर्शन का इस्तेमाल किया जाता है. इसमें, कॉन्फ़िगरेशन ऐनलाइज़र का नया वर्शन भी शामिल है. R8 कॉन्फ़िगरेशन का विश्लेषण करते समय, इसे सिर्फ़ अस्थायी तौर पर इस्तेमाल किया जा सकता है.

अब, R8 के साथ बिल्ड चालू करके, Gradle का टास्क चलाते समय, com.android.tools.r8.dumpkeepradiushtmltodirectory सिस्टम प्रॉपर्टी सेट की जा सकती है.

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

उदाहरण के लिए, /tmp/r8analysis डायरेक्ट्री में HTML रिपोर्ट जनरेट करने के लिए, यह कमांड इस्तेमाल करें:

# 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 ऑप्टिमाइज़ेशन की पूरी क्षमता का इस्तेमाल करने के लिए, यह तरीका अपनाएं:

  1. कॉन्फ़िगरेशन ऐनलाइज़र में, कीप के हर नियम के लिए, क्लास, फ़ील्ड, और तरीकों का वह प्रतिशत देखें जिसे R8 ऑप्टिमाइज़ नहीं कर सकता. इसका इस्तेमाल करके, कीप के उन नियमों की पहचान करें जिनकी वजह से, ज़्यादा क्लास, फ़ील्ड या तरीकों को ऑप्टिमाइज़ नहीं किया जा सकता. कीप के हर नियम की वजह से, ऑप्टिमाइज़ेशन की जिन प्रॉपर्टी को ऑप्टिमाइज़ नहीं किया जा सकता उनकी सूची भी दी गई है.
  2. अगर आपको कीप का कोई ऐसा नियम दिखता है जिसकी वजह से, ज़्यादा क्लास को ऑप्टिमाइज़ नहीं किया जा सकता, तो आपको यह देखना चाहिए कि कीप के नियम की वजह से किन क्लास, फ़ील्ड, और तरीकों को ऑप्टिमाइज़ नहीं किया जा सकता. साथ ही, यह भी देखना चाहिए कि इस नियम की वजह से, रिफ़्लेक्शन का इस्तेमाल करके डाइनैमिक तरीके से लागू न किए जाने वाले आइटम सुरक्षित तो नहीं रखे जा रहे हैं.
  3. कीप के नियमों की वजह से, ऑप्टिमाइज़ेशन को ब्लॉक होने से बचाने के लिए, सिर्फ़ ज़रूरी क्लास, फ़ील्ड या तरीकों को टारगेट करें. इसके लिए, कीप का सही विकल्प चुनें और सबसे सही तरीकों का पालन करें.
  4. कीप के नियम की वजह से, जिन क्लास, फ़ील्ड, और तरीकों पर असर पड़ा है उनकी जांच करें और उन पर टेस्ट चलाएं. इसके बाद, कीप के नियमों को बेहतर बनाएं.

लाइब्रेरी के ऑप्टिमाइज़ेशन की जांच करना

तीसरे पक्ष की लाइब्रेरी को इंटिग्रेट करने पर, उनमें अक्सर 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 की ऑप्टिमाइज़ेशन क्षमताओं का पूरी तरह से इस्तेमाल किया जा सके.

रिपोर्ट की खास जानकारी वाले सेक्शन का उदाहरण
चौथी इमेज. रिपोर्ट में, शामिल किए गए नियमों का एक उदाहरण.

शामिल किए गए नियमों को ऑप्टिमाइज़ करना

  1. R8 कॉन्फ़िगरेशन ऐनलाइज़र का इस्तेमाल करके, कीप के उन नियमों को ढूंढें जो दूसरे नियमों को शामिल कर रहे हैं.
  2. अपने कोडबेस में उन क्लास, फ़ील्ड या तरीकों की पहचान करें जो असल में रिफ़्लेक्शन पर निर्भर करते हैं. इन्हें कीप के नियमों का इस्तेमाल करके सुरक्षित रखना ज़रूरी है. इससे आपको कीप के नियमों को बेहतर बनाने में मदद मिलेगी.
  3. कॉन्फ़िगरेशन ऐनलाइज़र का इस्तेमाल करके, एक ही क्लास, फ़ील्ड या तरीकों को टारगेट करने वाले हर नियम के असर की तुलना करें. कीप के हर नियम की वजह से, ऑप्टिमाइज़ेशन के प्रतिशत का इस्तेमाल करके, यह पहचाना जा सकता है कि कौनसे नियम ज़्यादा व्यापक हैं और कौनसे नियम कम व्यापक हैं.
    1. अगर कम व्यापक नियम सटीक तरीके से लिखा गया है—सिर्फ़ उन सदस्यों या क्लास को सुरक्षित रखा गया है जिन्हें रिफ़्लेक्शन का इस्तेमाल करके ऐक्सेस किया जाता है—तो ज़्यादा व्यापक नियम को हटा दें. इससे, आपके पैकेज के बाकी हिस्सों के लिए, R8 ऑप्टिमाइज़ेशन को सुरक्षित तरीके से चालू किया जा सकता है.
    2. अगर ज़्यादा व्यापक नियम, सही क्लास को टारगेट कर रहा है, तो ज़्यादा व्यापक नियम को सुरक्षित रखें और कम व्यापक नियम को मिटा दें. कम व्यापक नियम, सिर्फ़ फ़ालतू जानकारी है. पक्का करें कि आपने ज़्यादा व्यापक नियम को सिर्फ़ उन क्लास, फ़ील्ड या तरीकों को टारगेट करने के लिए बेहतर बनाया हो जिनकी आपने पहचान की है.

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

ज़रूरी नहीं नियमों को हटाना

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

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

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