डिफ़ॉल्ट सेटिंग के साथ ऐप्लिकेशन ऑप्टिमाइज़ेशन चालू करने पर, R8 कई तरह के ऑप्टिमाइज़ेशन करता है, ताकि आपको परफ़ॉर्मेंस से जुड़े ज़्यादा से ज़्यादा फ़ायदे मिल सकें. R8, कोड में कई तरह के बदलाव करता है. जैसे, क्लास, फ़ील्ड, और तरीकों के नाम बदलना, उन्हें एक जगह से दूसरी जगह ले जाना, और उन्हें हटाना. अगर आपको लगता है कि इन बदलावों की वजह से गड़बड़ियां हो रही हैं, तो आपको यह बताना होगा कि R8 को कोड के किन हिस्सों में बदलाव नहीं करना चाहिए. इसके लिए, उन हिस्सों को कीप नियमों में शामिल करें.
ऐसे सामान्य उदाहरण जिनमें डेटा बनाए रखने के नियमों की ज़रूरत होती है
R8, आपके कोड में मौजूद सभी डायरेक्ट कॉल की पहचान करता है और उन्हें सुरक्षित रखता है. हालांकि, R8, कोड के अप्रत्यक्ष इस्तेमाल को नहीं देख सकता. इसकी वजह से, यह ऐसे कोड को हटा सकता है जिसकी आपके ऐप्लिकेशन को ज़रूरत है. इससे ऐप्लिकेशन क्रैश हो सकते हैं. कीप रूल का इस्तेमाल करके, R8 को यह निर्देश दें कि वह ऐसे कोड को सुरक्षित रखे जिसका इस्तेमाल सीधे तौर पर नहीं किया जाता. यहां कुछ ऐसी सामान्य स्थितियां दी गई हैं जिनमें आपको नियमों को लागू रखने की ज़रूरत पड़ सकती है:
- रिफ़्लेक्शन के ज़रिए ऐक्सेस किया गया कोड: R8 यह पता नहीं लगा सकता कि क्लास, फ़ील्ड या तरीकों को रिफ़्लेक्शन के ज़रिए कब ऐक्सेस किया जाता है. उदाहरण के लिए, R8,
Class.getDeclaredMethod()का इस्तेमाल करके नाम से ढूंढे गए किसी तरीके की पहचान नहीं कर सकता. इसके अलावा,Class.getAnnotation()से वापस लाए गए किसी एनोटेशन की पहचान भी नहीं कर सकता. ऐसे मामलों में, R8 इन तरीकों और एनोटेशन का नाम बदल सकता है या उन्हें पूरी तरह से हटा सकता है. इससे रनटाइम मेंClassNotFoundExceptionयाNoSuchMethodExceptionहो सकता है. - Java नेटिव इंटरफ़ेस (जेएनआई) से कॉल किया गया कोड: जब नेटिव (C या C++) कोड, Java या Kotlin के किसी तरीके को कॉल करता है या Java या Kotlin कोड, जेएनआई की मदद से C++ कोड को कॉल करता है, तो कॉल, तरीके के नाम के डाइनैमिक स्ट्रिंग लुकअप पर आधारित होता है. R8 को डाइनैमिक स्ट्रिंग पर आधारित तरीके का कॉल नहीं दिख रहा है. इसलिए, इसके ऑप्टिमाइज़ेशन आपके कोड को खराब कर सकते हैं.
यह उन सभी स्थितियों की पूरी सूची नहीं है जिनमें डेटा को सुरक्षित रखने के नियमों की ज़रूरत होती है. हालांकि, इन स्थितियों में ऐसे ज़्यादातर मामले शामिल हैं जिनमें आपको डेटा को सुरक्षित रखने के नियमों की ज़रूरत पड़ सकती है.
अपने ऐप्लिकेशन में डेटा बनाए रखने के नियम जोड़ने का तरीका
आपको अपने नियम, ऐप्लिकेशन मॉड्यूल की रूट डायरेक्ट्री में मौजूद proguard-rules.pro फ़ाइल में जोड़ने चाहिए. हो सकता है कि यह फ़ाइल पहले से मौजूद हो. अगर ऐसा नहीं है, तो इसे बनाएं. फ़ाइल में दिए गए नियमों को लागू करने के लिए, आपको अपनी मॉड्यूल-लेवल की build.gradle.kts (या build.gradle) फ़ाइल में फ़ाइल का एलान करना होगा. इसके लिए, यहां दिया गया कोड इस्तेमाल करें:
Kotlin
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules "proguard-rules.pro" ) // ... } } // ... }
Groovy
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) // ... } } // ... }
डिफ़ॉल्ट रूप से, आपकी बिल्ड फ़ाइल में proguard-android-optimize.txt फ़ाइल भी शामिल होती है. इस फ़ाइल में ऐसे नियम शामिल होते हैं जो ज़्यादातर Android प्रोजेक्ट के लिए ज़रूरी होते हैं. इसलिए, आपको इसे बिल्ड फ़ाइल में रहने देना चाहिए. यह फ़ाइल, proguard-common.txt फ़ाइल पर आधारित है और इसका कॉन्टेंट भी उससे मिलता-जुलता है.
बड़े ऐप्लिकेशन में आम तौर पर, कई लाइब्रेरी मॉड्यूल में कोड होता है. ऐसे मामलों में, अक्सर यह बेहतर होता है कि कोड को सुरक्षित रखने के नियमों को उसी लाइब्रेरी मॉड्यूल में रखा जाए जिस पर वे लागू होते हैं. लाइब्रेरी के लिए कीप नियमों को बनाए रखने में मुख्य अंतर यह है कि लाइब्रेरी मॉड्यूल की build.gradle.kts (या build.gradle) फ़ाइल में इन नियमों को कैसे तय किया जाता है. ज़्यादा जानने के लिए, लाइब्रेरी तैयार करने वालों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें.
डेटा को सुरक्षित रखने का नियम जोड़ना
डेटा बनाए रखने के नियम जोड़ते समय, ग्लोबल विकल्प शामिल किए जा सकते हैं. साथ ही, डेटा बनाए रखने के अपने नियम भी तय किए जा सकते हैं.
ग्लोबल विकल्प: ग्लोबल विकल्प, सामान्य निर्देश होते हैं. इनसे यह तय होता है कि R8, आपके पूरे कोडबेस पर कैसे काम करेगा. ज़्यादा जानने के लिए, ग्लोबल विकल्प देखें.
सुरक्षित रखने के नियम: सुरक्षित रखने के नियमों को सावधानी से डिज़ाइन किया जाना चाहिए, ताकि यह पक्का किया जा सके कि आपको कोड ऑप्टिमाइज़ेशन को ज़्यादा से ज़्यादा करने और गलती से अपने ऐप्लिकेशन को तोड़ने के बीच सही संतुलन मिले. सुरक्षित रखने के नियम लिखने का तरीका जानने के लिए, सुरक्षित रखने के नियम जोड़ें लेख पढ़ें.
स्टैंडर्ड नियमों के अलावा, शर्त के साथ डेटा बनाए रखने के नियम भी तय किए जा सकते हैं. ये नियम, सिर्फ़ कुछ खास शर्तों के पूरा होने पर लागू होते हैं. ये नियम, खास तौर पर रिफ़्लेक्शन जैसे मामलों में काम आते हैं. इनकी मदद से, किसी कीप नियम के स्कोप को सिर्फ़ तब तक सीमित किया जा सकता है, जब तक कोई खास क्लास या सदस्य मौजूद हो. इससे आपको ज़्यादा सटीक कंट्रोल मिलता है और गैर-ज़रूरी कोड को कम से कम समय तक बनाए रखने में मदद मिलती है.
लाइब्रेरी तैयार करने वालों के लिए कीप नियम
डेटा सुरक्षित रखने के नियमों के लिए ग्लोबल विकल्पों और सिंटैक्स के बारे में जानने के बाद, ज़्यादा जानकारी के लिए लाइब्रेरी तैयार करने वालों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें.