Android की सुविधाएं
GitHub पर देखेंR8 कॉन्फ़िगरेशन एनलाइज़र
android skills add --skill r8-analyzerAnalyze the R8 configurationR8 कॉन्फ़िगरेशन एनलाइज़र एक ऐसा टूल है जो आपके ऐप्लिकेशन के कॉन्फ़िगरेशन की क्वालिटी के बारे में, ज़रूरी जानकारी देकर 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 और इससे पहले के वर्शन के लिए,
com.android.tools.r8.dumpkeepradiushtmltodirectory सिस्टम प्रॉपर्टी सेट करें जब
R8 के साथ बिल्ड चालू करके, Gradle का टास्क चला रहे हों.
./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 ऑप्टिमाइज़ेशन की पूरी क्षमता का इस्तेमाल करने के लिए, यह तरीका अपनाएं:
- कॉन्फ़िगरेशन एनलाइज़र में, कीप के हर नियम के लिए, क्लास, फ़ील्ड, और तरीकों का वह प्रतिशत देखें जिसे R8 ऑप्टिमाइज़ नहीं कर सकता. इसका इस्तेमाल करके, कीप के उन नियमों की पहचान करें जिनकी वजह से, ज़्यादा संख्या में क्लास, फ़ील्ड या तरीकों को ऑप्टिमाइज़ नहीं किया जा सकता. कीप के हर नियम की वजह से, ऑप्टिमाइज़ेशन की जिन प्रॉपर्टी को ऑप्टिमाइज़ नहीं किया जा सकता उनकी सूची भी दी गई है.
- अगर आपको कीप का कोई ऐसा नियम दिखता है जिसकी वजह से, ज़्यादा संख्या में क्लास को ऑप्टिमाइज़ नहीं किया जा सकता, तो आपको यह देखना चाहिए कि कीप के उस नियम की वजह से, किन क्लास, फ़ील्ड, और तरीकों को ऑप्टिमाइज़ नहीं किया जा सकता. साथ ही, यह भी देखना चाहिए कि क्या इस नियम की वजह से, उन आइटम को सुरक्षित रखा जा रहा है जिन्हें रिफ़्लेक्शन का इस्तेमाल करके डाइनैमिक तरीके से लागू नहीं किया जाता.
- कीप के सही विकल्प को चुनकर और सबसे सही तरीकों का पालन करके, सिर्फ़ ज़रूरी क्लास, फ़ील्ड या तरीकों को टारगेट करें. इससे, कीप के नियमों की वजह से ब्लॉक किए गए ऑप्टिमाइज़ेशन को कम किया जा सकता है.
- कीप के नियम की वजह से, जिन क्लास, फ़ील्ड, और तरीकों पर असर पड़ा है उनकी जांच करें और उन पर टेस्ट चलाएं. इसके बाद, कीप के नियमों को बेहतर बनाएं.
लाइब्रेरी के ऑप्टिमाइज़ेशन की जांच करना
तीसरे पक्ष की लाइब्रेरी को इंटिग्रेट करने पर, उनमें अक्सर R8 के साथ काम करने के लिए, कीप के अपने नियम शामिल होते हैं. लाइब्रेरी तैयार करने वाला व्यक्ति, आपके खास तौर पर लागू करने के तरीके का अनुमान नहीं लगा सकता. इसलिए, वे कभी-कभी ऐसे नियम लिखते हैं जो ज़्यादा क्लास, फ़ील्ड, और तरीकों को ऑप्टिमाइज़ होने से रोकते हैं. ये नियम, ज़रूरत से ज़्यादा और व्यापक होते हैं. इससे, R8 आपके ऐप्लिकेशन के उन हिस्सों को ऑप्टिमाइज़ नहीं कर पाता जिनका लाइब्रेरी के रनटाइम में होने वाले असल एक्ज़ीक्यूशन से कोई लेना-देना नहीं होता. R8 कॉन्फ़िगरेशन एनलाइज़र का इस्तेमाल करके, उन लाइब्रेरी की पहचान की जा सकती है जिनके नियमों की वजह से, आपके ऐप्लिकेशन के ऑप्टिमाइज़ेशन पर बुरा असर पड़ता है.
मर्ज किए गए, कीप के सभी नियमों के मिले-जुले असर की जांच करने के लिए, कॉन्फ़िगरेशन एनलाइज़र का इस्तेमाल करें. तीसरे पक्ष की लाइब्रेरी से आने वाले कीप के हर नियम के असर का विश्लेषण करके, उन खास तीसरे पक्ष की लाइब्रेरी की पहचान की जा सकती है और उनका पता लगाया जा सकता है जिनकी वजह से, आपके ऐप्लिकेशन में ज़्यादा ऑप्टिमाइज़ेशन नहीं किया जा सकता.
लाइब्रेरी को ऑप्टिमाइज़ करने का तरीका
तीसरे पक्ष की लाइब्रेरी से जुड़े कीप के नियमों को ठीक करने के लिए, यह तरीका अपनाएं:
- अगर किसी लाइब्रेरी में बहुत व्यापक नियम शामिल है, तो हमारा सुझाव है कि आप लाइब्रेरी के रखरखाव करने वाले व्यक्ति से संपर्क करें. साथ ही, अपनी रिपोर्ट का डेटा देकर उसे यह दिखाएं कि उसके मौजूदा नियमों से, आपके ऐप्लिकेशन के ऑप्टिमाइज़ेशन स्कोर पर कैसे असर पड़ता है. अगर यह कोई बाहरी लाइब्रेरी है, तो समस्याएं सबमिट करने से पहले, लाइब्रेरी में मौजूद गड़बड़ियों को देखें.
- ज़रूरत पड़ने पर, किसी खास लाइब्रेरी से नियमों को फ़िल्टर करके, संभावित सुधारों को टेस्ट किया जा सकता है by filtering out rules from a specific library. लाइब्रेरी के नियमों को अपने प्रोजेक्ट में इंपोर्ट किया जा सकता है. इसके बाद, व्यापक नियमों को हटाया जा सकता है. साथ ही, साइज़ और परफ़ॉर्मेंस में होने वाले संभावित फ़ायदों को मेज़र करने के लिए, कॉन्फ़िगरेशन एनलाइज़र को फिर से चलाया जा सकता है.
सब्स्यूम किए गए नियम
ऐसा हो सकता है कि कीप के कई नियम ओवरलैप हो रहे हों और उनमें से कोई एक नियम, ज़रूरत से ज़्यादा ऑप्टिमाइज़ेशन को रोक रहा हो. अगर आपके कोडबेस में कीप के दो नियम हैं.
# 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 कॉन्फ़िगरेशन एनलाइज़र, खास तौर पर गैर-ज़रूरी नियमों के दो मुख्य सोर्स को हाइलाइट करता है:
- इस्तेमाल न किए गए नियम: ऐसे नियम जो आपके मौजूदा बिल्ड में, किसी भी क्लास, तरीके या फ़ील्ड से मेल नहीं खाते. ये नियम, कोड को फिर से फ़ैक्टर करने, डिपेंडेंसी हटाने या कॉपी-पेस्ट किए गए उन कॉन्फ़िगरेशन के बाद भी बने रहते हैं जो अब काम के नहीं हैं. इससे, कॉन्फ़िगरेशन की जटिलता बढ़ जाती है.
- एक जैसे नियम: कीप के एक जैसे नियमों का मतलब है कि ऐसे नियम जो एक ही क्लास, फ़ील्ड, और तरीकों को टारगेट करते हैं या कीप के नियम की डुप्लीकेट घोषणाएं, कीप के नियम वाली एक या एक से ज़्यादा फ़ाइलों में मौजूद होती हैं.
दोनों तरह के नियम, आपके कॉन्फ़िगरेशन में गैर-ज़रूरी जानकारी जोड़ते हैं. इससे, इन्हें बनाए रखना और डीबग करना मुश्किल हो जाता है. इनकी पहचान करके, अपने कॉन्फ़िगरेशन को साफ़ किया जा सकता है.