ग्लोबल विकल्प जोड़ना

R8, ग्लोबल विकल्प उपलब्ध कराता है. ये विकल्प, पूरे ऐप्लिकेशन में R8 के ऑप्टिमाइज़ेशन में बदलाव करते हैं या हर कीप नियम पर असर डालते हैं. इन विकल्पों को कीप नियमों के साथ, proguard-rules.pro फ़ाइल में सेव किया जाता है. इन ग्लोबल विकल्पों में से कुछ, अतिरिक्त ऑप्टिमाइज़ेशन के लिए कॉन्फ़िगर किए जाते हैं. वहीं, कुछ विकल्प ऑप्टिमाइज़ेशन के कुछ पहलुओं को बंद कर देते हैं.

R8, ProGuard से मिले कुछ लेगसी विकल्पों को स्वीकार करता है, लेकिन उन्हें अनदेखा करता है. ज़्यादा जानकारी के लिए, ProGuard के लेगसी वर्शन के विकल्प हटाना लेख पढ़ें.

अतिरिक्त ऑप्टिमाइज़ेशन के लिए ग्लोबल विकल्प

यहां दिए गए ग्लोबल विकल्पों की मदद से, अतिरिक्त ऑप्टिमाइज़ेशन किया जा सकता है:

  • -repackageclasses [<optional-package-name>]: यह क्लास को एक ही पैकेज में फिर से पैक करता है, ताकि ऐप्लिकेशन का साइज़ कम किया जा सके. अगर आपने पैकेज का नाम नहीं दिया है, तो क्लास को बिना नाम वाले (डिफ़ॉल्ट) पैकेज में ले जाया जाता है. ऐप्लिकेशन के लिए, यह सेटिंग इस्तेमाल करने का सुझाव दिया जाता है. ऐसा इसलिए, क्योंकि इससे क्लास के नामों से पैकेज प्रीफ़िक्स हटाकर, छोटी DEX फ़ाइलें बनाई जाती हैं. Android Gradle प्लगिन (AGP) 9.1 के बाद से, यह ऐप्लिकेशन के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन होता है. इस ऑप्टिमाइज़ेशन से ऑप्ट आउट करने के लिए, -dontrepackage का इस्तेमाल करें.
  • -allowaccessmodification: R8 को क्लास, फ़ील्ड, और तरीकों को ऐक्सेस करने की अनुमति देता है, ताकि वह अतिरिक्त ऑप्टिमाइज़ेशन कर सके. आम तौर पर, इससे R8 को ज़्यादा क्लास, फ़ील्ड, और तरीकों को ऐक्सेस करने की अनुमति मिलती है. proguard-android-optimize.txt का इस्तेमाल करने पर, यह सुविधा चालू हो जाती है. Android Gradle प्लगिन (AGP) 8.2 के बाद से, R8 के साथ पूरा ऑप्टिमाइज़ेशन चालू करने पर, यह डिफ़ॉल्ट कॉन्फ़िगरेशन होता है.
  • -processkotlinnullchecks [level]: R8 को Kotlin Intrinsics के नल चेक में बदलाव करने की अनुमति देता है. इससे R8, गड़बड़ी के मैसेज को हटा सकता है या नल चेक को पूरी तरह से हटा सकता है.

    level वैल्यू को सबसे कम से लेकर सबसे ज़्यादा तक के क्रम में लगाया गया है. इनका असर इस तरह होता है:

    • keep से जांचों में कोई बदलाव नहीं होता.
    • remove_message, जांच करने के हर तरीके के कॉल को कॉल के पहले आर्ग्युमेंट पर getClass() के कॉल में बदलता है. इससे, शून्य की जांच करने की सुविधा चालू रहती है, लेकिन कोई मैसेज नहीं दिखता.
    • remove से, जांच के निशान पूरी तरह से हट जाते हैं.

    डिफ़ॉल्ट रूप से, R8 remove_message का इस्तेमाल करता है. -processkotlinnullchecks की कोई भी जानकारी, इस वैल्यू को बदल देती है. एक से ज़्यादा बार तय करने पर, सबसे सटीक वैल्यू का इस्तेमाल किया जाता है.

    -processkotlinnullchecks, AGP 9.0.0 के साथ काम करता है.

यहां अतिरिक्त ऑप्टिमाइज़ेशन की सुविधा चालू होने पर, कॉन्फ़िगरेशन का एक उदाहरण दिया गया है:

-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 प्लगिन (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 यह एट्रिब्यूट, एनोटेशन सेव करता है. ये एनोटेशन, सिर्फ़ टाइप के इस्तेमाल पर लागू होते हैं, न कि सिर्फ़ एलान पर. यह एट्रिब्यूट, रनटाइम में नहीं दिखता.

ऐप्लिकेशन डेवलपर को इस एट्रिब्यूट को नहीं रखना चाहिए. लाइब्रेरी तैयार करने वालों के लिए, यह एट्रिब्यूट उपभोक्ता के डेटा को सुरक्षित रखने से जुड़े नियमों में काम का नहीं है. हालांकि, लाइब्रेरी बनाते समय इसका इस्तेमाल अक्सर किया जाता है. लाइब्रेरी को ऑप्टिमाइज़ करने के बारे में जानकारी के लिए, लाइब्रेरी तैयार करने वालों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें.

लेगसी ProGuard के विकल्प हटाना

R8, कुछ ऐसे विकल्पों को स्वीकार करता है जो सिर्फ़ ProGuard में काम करते थे. हालांकि, R8 उन्हें अनदेखा करता है. ये विकल्प अक्सर उन कॉन्फ़िगरेशन में मौजूद रहते हैं जिन्हें ProGuard से माइग्रेट किया गया था या पुराने प्रोजेक्ट से कॉपी किया गया था. इनका R8 आउटपुट पर कोई असर नहीं पड़ता. इसलिए, इन्हें अपनी proguard-rules.pro फ़ाइल से हटा दें, ताकि कॉन्फ़िगरेशन को समझना और उसे बनाए रखना आसान हो.

R8, बिना किसी चेतावनी के इन विकल्पों को अनदेखा करता है:

  • -adaptkotlinmetadata
  • -android
  • -dontpreverify
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -dontusemixedcaseclassnames
  • -forceprocessing
  • -mergeinterfacesaggressively
  • -optimizationpasses
  • -optimizations
  • -overloadaggressively
  • -target
  • -verbose

R8 इन विकल्पों को अनदेखा करता है और बिल्ड के दौरान चेतावनी दिखाता है:

R8, -skipnonpubliclibraryclasses के साथ काम नहीं करता. अगर आपके कॉन्फ़िगरेशन में यह शामिल है, तो R8 गड़बड़ी की सूचना देता है.