R8, ग्लोबल विकल्प उपलब्ध कराता है. ये विकल्प, पूरे ऐप्लिकेशन में R8 के ऑप्टिमाइज़ेशन में बदलाव करते हैं या हर कीप नियम पर असर डालते हैं. इन विकल्पों को proguard-rules.pro फ़ाइल में सेव किया जाता है. साथ ही, इसमें डेटा को सुरक्षित रखने से जुड़े नियम भी सेव किए जाते हैं. इन ग्लोबल विकल्पों में से कुछ, बेहतर ऑप्टिमाइज़ेशन के लिए कॉन्फ़िगर किए जाते हैं. वहीं, कुछ विकल्प ऑप्टिमाइज़ेशन के कुछ पहलुओं को बंद कर देते हैं.
ज़्यादा ऑप्टिमाइज़ेशन के लिए ग्लोबल विकल्प
यहां दिए गए ग्लोबल विकल्पों की मदद से, बेहतर तरीके से ऑप्टिमाइज़ेशन किया जा सकता है:
-repackageclasses [<optional-package-name>]: ऐप्लिकेशन का साइज़ कम करने के लिए, क्लास को एक पैकेज में फिर से पैक करता है. अगर आपने पैकेज का नाम नहीं दिया है, तो क्लास को बिना नाम वाले डिफ़ॉल्ट पैकेज में ले जाया जाता है. ऐप्लिकेशन के लिए, यह सेटिंग इस्तेमाल करने का सुझाव दिया जाता है. ऐसा इसलिए, क्योंकि इससे क्लास के नामों से पैकेज प्रीफ़िक्स हटाकर, DEX फ़ाइलों का साइज़ कम किया जा सकता है.-allowaccessmodification: इससे R8, क्लास, फ़ील्ड, और तरीकों को ज़्यादा से ज़्यादा लोगों को दिखाने के लिए बदल सकता है. इससे ज़्यादा ऑप्टिमाइज़ेशन किए जा सकते हैं.proguard-android-optimize.txtका इस्तेमाल करने पर, यह सुविधा चालू हो जाती है. Android Gradle प्लग इन (AGP) 8.2 से, अगर R8 का इस्तेमाल फ़ुल मोड में किया जाता है, तो यह डिफ़ॉल्ट कॉन्फ़िगरेशन होता है.
यहां अतिरिक्त ऑप्टिमाइज़ेशन की सुविधा चालू होने पर, कॉन्फ़िगरेशन का एक उदाहरण दिया गया है:
-repackageclasses
-allowaccessmodification
ऑप्टिमाइज़ेशन को सीमित करने के लिए ग्लोबल विकल्प
यहां दिए गए ग्लोबल विकल्पों की मदद से, ऐप्लिकेशन ऑप्टिमाइज़ेशन के कुछ पहलुओं को बंद किया जा सकता है. ये विकल्प तब काम आते हैं, जब आपको अपने कीप नियमों को बेहतर बनाना हो या पहली बार R8 चालू करना हो.
-dontoptimize: यह कोड ऑप्टिमाइज़ेशन को रोकता है. उदाहरण के लिए, मेथड इनलाइनिंग. इस विकल्प का इस्तेमाल डेवलपमेंट के दौरान किया जा सकता है. हालांकि, प्रोडक्शन बिल्ड में इसका इस्तेमाल नहीं किया जाना चाहिए.-dontshrink: इससे बिना रेफ़रंस वाले कोड को हटाने और कोड को ऑप्टिमाइज़ करने से रोका जाता है. इस विकल्प का इस्तेमाल डेवलपमेंट के दौरान किया जा सकता है. हालांकि, प्रोडक्शन बिल्ड में इसका इस्तेमाल नहीं किया जाना चाहिए.-dontobfuscate: इससे क्लास और मेथड के नाम छोटे नहीं किए जाते. डीबग करने के दौरान, अस्पष्ट करने की सुविधा को बंद करना खास तौर पर मददगार हो सकता है. इससे स्टैक ट्रेस को आसानी से पढ़ा जा सकता है. इस विकल्प का इस्तेमाल डेवलपमेंट के दौरान किया जा सकता है. हालांकि, प्रोडक्शन बिल्ड में इसका इस्तेमाल नहीं किया जाना चाहिए.-keepattributes <attributes>: यह कॉमा से अलग किए गए एट्रिब्यूट की सूची स्वीकार करता है. इन एट्रिब्यूट को सुरक्षित रखा जाना चाहिए. अगर डिफ़ॉल्टproguard-android-optimize.txtका इस्तेमाल नहीं किया जा रहा है, तो R8,RuntimeVisibleAnnotationsऔरSignatureके साथ-साथ सभी एट्रिब्यूट हटा देता है. हालांकि, अगर रिफ़्लेक्शन जैसे मामलों में इन एट्रिब्यूट की ज़रूरत होती है, तो इन्हें बनाए रखना फ़ायदेमंद हो सकता है. जिन एट्रिब्यूट की वैल्यू दी जा सकती है उनकी सूची देखने के लिए, एट्रिब्यूट बनाए रखें लेख पढ़ें.
एट्रिब्यूट बनाए रखें
एट्रिब्यूट, आपके कोड के अलग-अलग हिस्सों से जुड़ी अतिरिक्त जानकारी होती है. एट्रिब्यूट, आपके कोड से एनोटेशन और सामान्य सिग्नेचर जैसी जानकारी सेव करते हैं.
कुछ रिफ़्लेक्टिव ऑपरेशन के लिए, खास एट्रिब्यूट को सेव करके रखना ज़रूरी होता है, ताकि उन्हें सही तरीके से लागू किया जा सके. उदाहरण के लिए:
getEnclosingMethod()याgetDeclaredClasses()का इस्तेमाल करके इनर या आउटर क्लास स्ट्रक्चर को ऐक्सेस करते समय,EnclosingMethodऔरInnerClassesएट्रिब्यूट की ज़रूरत होती है.getTypeParameters()का इस्तेमाल करके सामान्य हस्ताक्षर ऐक्सेस करते समय,Signatureएट्रिब्यूट की ज़रूरत होती है.getAnnotation()का इस्तेमाल करके एनोटेशन ऐक्सेस करते समय,RuntimeVisibleAnnotationsएट्रिब्यूट का होना ज़रूरी है.
आम तौर पर ज़रूरी एट्रिब्यूट
डिफ़ॉल्ट Proguard फ़ाइल (proguard-android-optimize.txt या proguard-android.txt) का इस्तेमाल करने पर, Android Gradle प्लगइन (AGP) इन एट्रिब्यूट को सेव रखता है. ध्यान दें कि इनमें से कुछ एट्रिब्यूट के लिए, AGP के नए वर्शन की ज़रूरत होती है:
| एट्रिब्यूट | ब्यौरा |
|---|---|
AnnotationDefault |
यह एट्रिब्यूट, एनोटेशन टाइप में मौजूद होता है. साथ ही, यह एनोटेशन एलिमेंट की डिफ़ॉल्ट वैल्यू सेव करता है. ध्यान दें: AGP 7.1 के बाद से, यह एट्रिब्यूट डिफ़ॉल्ट रूप से मौजूद होता है. इसे सिर्फ़ AGP के पुराने वर्शन का इस्तेमाल करने वाले ऐप्लिकेशन में साफ़ तौर पर रखा जाना चाहिए. |
EnclosingMethod |
यह एट्रिब्यूट, ऐसी इनर क्लास में मौजूद होता है जो लोकल या ऐनॉनमस क्लास नहीं होती हैं. इससे उस तरीके या इनिशियलाइज़र की पहचान होती है जिसमें क्लास मौजूद है. |
InnerClasses |
यह एट्रिब्यूट, किसी दूसरी क्लास में तय की गई नेस्ट की गई क्लास (इनर क्लास, स्टैटिक नेस्टेड क्लास, लोकल क्लास, और ऐनॉनमस क्लास) के बारे में जानकारी रिकॉर्ड करता है. |
LineNumberTable |
यह एट्रिब्यूट, बाइटकोड निर्देशों को ओरिजनल सोर्स फ़ाइल में मौजूद उनके लाइन नंबर से मैप करता है. ध्यान दें: Android Gradle Plugin (AGP) 8.6 के बाद से, इस एट्रिब्यूट को डिफ़ॉल्ट रूप से रखा जाता है. इसे सिर्फ़ उन ऐप्लिकेशन में साफ़ तौर पर रखना ज़रूरी है जो AGP के पुराने वर्शन का इस्तेमाल करते हैं. |
RuntimeVisibleAnnotations |
यह एट्रिब्यूट, ऐसे एनोटेशन सेव करता है जो रिफ़्लेक्शन के ज़रिए रनटाइम में दिखते हैं. आम तौर पर, अगर एनोटेशन का इस्तेमाल रनटाइम में किया जाता है, तो *Annotation एट्रिब्यूट से सिर्फ़ इस एनोटेशन की ज़रूरत होती है. यह एनोटेशन, ऐप्लिकेशन और लाइब्रेरी के उपभोक्ता नियमों में ज़रूरी होता है. |
RuntimeVisibleParameterAnnotations |
यह एट्रिब्यूट, एनोटेशन सेव करता है. ये एनोटेशन, किसी तरीके के पैरामीटर पर रिफ़्लेक्शन के ज़रिए रनटाइम में दिखते हैं. |
RuntimeVisibleTypeAnnotations |
यह एट्रिब्यूट, एनोटेशन सेव करता है. ये एनोटेशन, सिर्फ़ टाइप के इस्तेमाल पर लागू होते हैं, न कि सिर्फ़ एलान पर. यह एट्रिब्यूट रनटाइम पर दिखता है. |
Signature |
यह एट्रिब्यूट, क्लास, तरीकों, और फ़ील्ड के लिए ज़्यादा सामान्य टाइप सिग्नेचर सेव करता है. खास तौर पर, जब वे जेनरिक (जैसे कि List<String>) का इस्तेमाल करते हैं. |
SourceFile |
इस एट्रिब्यूट में, उस सोर्स फ़ाइल (.kt या .java फ़ाइल) का नाम सेव होता है जिससे क्लास को कंपाइल किया गया था. इसका इस्तेमाल मुख्य रूप से डिबगर करते हैं. इससे कंपाइल किए गए Java कोड में एक-एक करके आगे बढ़ते समय, सोर्स कोड की ओरिजनल लाइनें दिखती हैं. इससे डेवलपर को, लिखे गए कोड के हिसाब से एक्ज़ीक्यूशन को वापस ट्रैक करने में मदद मिलती है. ध्यान दें: AGP 8.2 के बाद से, इस एट्रिब्यूट को डिफ़ॉल्ट रूप से रखा जाता है. इसे सिर्फ़ AGP के पुराने वर्शन का इस्तेमाल करने वाले ऐप्लिकेशन में साफ़ तौर पर रखा जाना चाहिए. |
proguard-android-optimize.txt का इस्तेमाल करने वाले ऐप्लिकेशन के लिए, AGP के तय किए गए डेटा को बनाए रखने के नियम, ज़्यादातर मामलों में काफ़ी होते हैं. हालांकि, अगर आपको किसी लाइब्रेरी के लिए कोड लिखना है, तो आपको अपनी लाइब्रेरी के लिए ज़रूरी सभी एट्रिब्यूट, उपयोगकर्ता के लिए बनाए गए नियमों में बताने चाहिए. भले ही, वे इस सूची में तय किए गए हों. इससे यह पक्का होता है कि अगर डेवलपर proguard-android-optimize.txt को शामिल नहीं करते हैं, तो आपकी लाइब्रेरी मज़बूत हो.
बनाए रखने के लिए अन्य एट्रिब्यूट
आपको सेव किए जाने वाले अतिरिक्त एट्रिब्यूट तय करने का विकल्प मिलता है. हालांकि, रिफ़्लेक्टिव या जेएनआई ऐक्सेस के ज़्यादातर मामलों में इनकी ज़रूरत नहीं होती. हालांकि, लाइब्रेरी को ऑप्टिमाइज़ करते समय, इनमें से कुछ का इस्तेमाल अब भी अक्सर किया जा सकता है.
| एट्रिब्यूट | ब्यौरा |
|---|---|
MethodParameters |
इस एट्रिब्यूट से, किसी तरीके के पैरामीटर के बारे में जानकारी मिलती है. खास तौर पर, उनके नाम और ऐक्सेस फ़्लैग के बारे में. |
Exceptions |
इस एट्रिब्यूट में, उन चेक किए गए अपवादों की सूची होती है जिन्हें थ्रो करने के लिए किसी तरीके का एलान किया जाता है. आम तौर पर, इस एट्रिब्यूट का इस्तेमाल ऐप्लिकेशन के लिए नहीं किया जाता. लाइब्रेरी के लेखकों के लिए, इसका इस्तेमाल आम तौर पर उपभोक्ता के डेटा को सुरक्षित रखने से जुड़े नियमों में नहीं किया जाता. हालांकि, लाइब्रेरी बनाते समय इसका इस्तेमाल अक्सर किया जाता है. लाइब्रेरी को ऑप्टिमाइज़ करने के बारे में जानकारी के लिए, लाइब्रेरी के लेखकों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें. |
RuntimeInvisibleAnnotations |
यह एट्रिब्यूट, ऐसे एनोटेशन सेव करता है जो क्लास, फ़ील्ड या तरीके पर रनटाइम में रिफ़्लेक्शन के साथ नहीं दिखते. ऐप्लिकेशन डेवलपर को इस एट्रिब्यूट को नहीं रखना चाहिए. लाइब्रेरी के लेखकों के लिए, यह एट्रिब्यूट उपभोक्ता के डेटा को सुरक्षित रखने से जुड़े नियमों में काम का नहीं है. हालांकि, लाइब्रेरी बनाते समय इसका इस्तेमाल अक्सर किया जाता है. लाइब्रेरी को ऑप्टिमाइज़ करने के बारे में जानकारी के लिए, लाइब्रेरी के लेखकों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें. |
RuntimeInvisibleParameterAnnotations |
यह एट्रिब्यूट ऐसे एनोटेशन सेव करता है जो किसी तरीके के पैरामीटर पर रनटाइम में रिफ़्लेक्शन के साथ नहीं दिखते. ऐप्लिकेशन डेवलपर को इस एट्रिब्यूट को नहीं रखना चाहिए. लाइब्रेरी के लेखकों के लिए, यह एट्रिब्यूट उपभोक्ता के डेटा को सुरक्षित रखने से जुड़े नियमों में काम का नहीं है. हालांकि, लाइब्रेरी बनाते समय इसका इस्तेमाल अक्सर किया जाता है. लाइब्रेरी को ऑप्टिमाइज़ करने के बारे में जानकारी के लिए, लाइब्रेरी के लेखकों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें. |
RuntimeInvisibleTypeAnnotations |
यह एट्रिब्यूट, एनोटेशन सेव करता है. ये एनोटेशन, सिर्फ़ टाइप के इस्तेमाल पर लागू होते हैं, न कि सिर्फ़ एलान पर. यह एट्रिब्यूट, रनटाइम के दौरान नहीं दिखता. ऐप्लिकेशन डेवलपर को इस एट्रिब्यूट को नहीं रखना चाहिए. लाइब्रेरी के लेखकों के लिए, यह एट्रिब्यूट उपभोक्ता के डेटा को सुरक्षित रखने से जुड़े नियमों में काम का नहीं है. हालांकि, लाइब्रेरी बनाते समय इसका इस्तेमाल अक्सर किया जाता है. लाइब्रेरी को ऑप्टिमाइज़ करने के बारे में जानकारी के लिए, लाइब्रेरी के लेखकों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें. |