डिफ़ॉल्ट सेटिंग के साथ ऐप्लिकेशन ऑप्टिमाइज़ेशन चालू करने पर, 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 आपके पूरे कोडबेस पर कैसे काम करेगा. ज़्यादा जानने के लिए, ग्लोबल विकल्प देखें.
- कोड को सुरक्षित रखने के नियम: कोड को सुरक्षित रखने के नियमों को सावधानी से डिज़ाइन किया जाना चाहिए, ताकि यह पक्का किया जा सके कि आपको कोड ऑप्टिमाइज़ेशन को ज़्यादा से ज़्यादा करने और ऐप्लिकेशन को अनजाने में खराब होने से बचाने के बीच सही संतुलन मिले. कोड को सुरक्षित रखने के अपने नियमों के लिए सिंटैक्स जानने के लिए, कोड को सुरक्षित रखने के नियमों का सिंटैक्स देखें.
लाइब्रेरी के लेखकों के लिए नियम बनाए रखना
डेटा बनाए रखने के नियमों के लिए ग्लोबल विकल्पों और सिंटैक्स के बारे में जानने के बाद, ज़्यादा जानकारी के लिए लाइब्रेरी के लेखकों के लिए ऑप्टिमाइज़ेशन देखें.