डिफ़ॉल्ट सेटिंग के साथ ऐप्लिकेशन ऑप्टिमाइज़ेशन की सुविधा चालू करने पर, R8 आपके ऐप्लिकेशन को बड़े पैमाने पर ऑप्टिमाइज़ करता है, ताकि आपको परफ़ॉर्मेंस के ज़्यादा से ज़्यादा फ़ायदे मिल सकें. R8, कोड में काफ़ी बदलाव करता है. जैसे, क्लास, फ़ील्ड, और तरीकों का नाम बदलना, उन्हें दूसरी जगह ले जाना, और उन्हें हटाना. अगर आपको लगता है कि इन बदलावों की वजह से गड़बड़ियां हो रही हैं, तो आपको यह बताना होगा कि R8 को कोड के किन हिस्सों में बदलाव नहीं करना चाहिए. इसके लिए, आपको उन हिस्सों को 'सुरक्षित रखने के नियमों' में शामिल करना होगा.
ऐसी सामान्य स्थितियां जिनमें डेटा को सेव रखने के नियम लागू करने की ज़रूरत होती है
R8, आपके कोड में मौजूद सभी डायरेक्ट कॉल की पहचान करता है और उन्हें सुरक्षित रखता है. हालांकि, R8, कोड के अप्रत्यक्ष इस्तेमाल को नहीं देख सकता. इसकी वजह से, यह ऐसे कोड को हटा सकता है जिसकी आपके ऐप्लिकेशन को ज़रूरत है. इससे ऐप्लिकेशन क्रैश हो सकते हैं. कीप रूल का इस्तेमाल करके, R8 को यह निर्देश दें कि वह ऐसे कोड को सुरक्षित रखे जिसका इस्तेमाल सीधे तौर पर नहीं किया जाता. यहां कुछ ऐसी सामान्य स्थितियां दी गई हैं जिनमें आपको डेटा सेव रखने के नियम लागू करने की ज़रूरत पड़ सकती है:
- रिफ़्लेक्शन से ऐक्सेस किया गया कोड: R8 यह पता नहीं लगा सकता कि क्लास, फ़ील्ड या तरीकों को रिफ़्लेक्शन से कब ऐक्सेस किया जाता है. उदाहरण के लिए, R8 किसी ऐसे तरीके की पहचान नहीं कर सकता जिसे
Class.getDeclaredMethod()का इस्तेमाल करके उसके नाम से खोजा गया हो याClass.getAnnotation()से वापस लाए गए एनोटेशन की पहचान नहीं कर सकता. ऐसे मामलों में, R8 इन तरीकों और एनोटेशन का नाम बदल सकता है या उन्हें पूरी तरह से हटा सकता है. इससे रनटाइम के दौरान,ClassNotFoundExceptionयाNoSuchMethodExceptionकी गड़बड़ी हो सकती है. - Java नेटिव इंटरफ़ेस (जेएनआई) से कॉल किया गया कोड: जब नेटिव (C या C++) कोड, Java या Kotlin मेथड को कॉल करता है या Java या Kotlin कोड, जेएनआई के साथ C++ कोड को कॉल करता है, तो कॉल, मेथड के नाम की डाइनैमिक स्ट्रिंग लुकअप पर आधारित होता है. R8, डाइनैमिक स्ट्रिंग पर आधारित मेथड कॉल को नहीं देख सकता. इसलिए, इसके ऑप्टिमाइज़ेशन से आपका कोड काम करना बंद कर सकता है.
यह उन स्थितियों की पूरी सूची नहीं है जिनमें डेटा को बनाए रखने के नियमों की ज़रूरत होती है. हालांकि, इस सूची में ऐसी ज़्यादातर स्थितियां शामिल हैं जिनमें आपको डेटा को बनाए रखने के नियमों की ज़रूरत पड़ सकती है.
अगर आपका कोड, रिफ़्लेक्शन का इस्तेमाल करता है या उसे जेएनआई से कॉल किया जाता है, तो मैन्युअल तरीके से नियम लिखने के बजाय, उस कोड को Jetpack Keep एनोटेशन के साथ एनोटेट किया जा सकता है. इसका Gradle प्लगिन, बिल्ड के समय एनोटेशन से कीप नियम जनरेट करता है.
अपने ऐप्लिकेशन में डेटा बनाए रखने के नियम जोड़ने का तरीका
आपके इस्तेमाल किए जा रहे AGP के वर्शन के हिसाब से, डेटा बनाए रखने के नियमों का कॉन्फ़िगरेशन तय होता है.
बड़े ऐप्लिकेशन में, आम तौर पर कई लाइब्रेरी मॉड्यूल में कोड होता है. ऐसे मामलों में, अक्सर यह बेहतर होता है कि कीप नियमों को उस कोड के साथ रखा जाए जिस पर वे लागू होते हैं. ऐसा किसी खास लाइब्रेरी मॉड्यूल में किया जाता है. लाइब्रेरी के लिए कीप नियमों को बनाए रखने में मुख्य अंतर यह है कि लाइब्रेरी मॉड्यूल की build.gradle.kts (या build.gradle) फ़ाइल में इन नियमों को कैसे तय किया जाता है. ज़्यादा जानने के लिए, लाइब्रेरी तैयार करने वालों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें.
एजीपी के 9.3 और इसके बाद के वर्शन के लिए
अपने नियमों को src/<variant>/keepRules डायरेक्ट्री में, .keep सफ़िक्स वाली फ़ाइल में जोड़ें. उदाहरण के लिए,
src/main/keepRules/custom-rules.keep. ध्यान दें कि AGP 9.3 और इसके बाद के वर्शन के लिए अपडेट किए गए डीएसएल का इस्तेमाल करने से, कोड और संसाधन, दोनों को ऑप्टिमाइज़ किया जा सकता है. इसके लिए, आपको Android की डिफ़ॉल्ट कीप रूल्स फ़ाइल (proguard-android-optimize.txt) को साफ़ तौर पर तय करने की ज़रूरत नहीं है, क्योंकि यह डिफ़ॉल्ट रूप से शामिल होती है. हालांकि, अगर इसे साफ़ तौर पर हटाया गया है, तो आपको इसे तय करना होगा.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Android प्लैटफ़ॉर्म के डिफ़ॉल्ट कीप रूल को छोड़ें (ऐडवांस)
एजीपी, Android प्लैटफ़ॉर्म के डिफ़ॉल्ट नियमों का एक सेट उपलब्ध कराता है. अगर आपको इन नियमों को अपने प्रोजेक्ट के कॉन्फ़िगरेशन से हटाना है और सभी कीप रूल खुद मैनेज करने हैं, तो optimization.keepRules.includeDefault को false पर सेट करें.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
एजीपी के 9.3 से पहले के वर्शन के लिए लेगसी डीएसएल
ऐप्लिकेशन मॉड्यूल की रूट डायरेक्ट्री में मौजूद proguard-rules.pro फ़ाइल में अपने नियम जोड़ें. हो सकता है कि यह फ़ाइल पहले से मौजूद हो. अगर ऐसा नहीं है, तो इसे बनाएं. फ़ाइल में मौजूद नियमों को लागू करने के लिए, आपको मॉड्यूल-लेवल की build.gradle.kts (या build.gradle) फ़ाइल में, फ़ाइल का एलान करना होगा.
डिफ़ॉल्ट रूप से, आपकी बिल्ड फ़ाइल में proguard-android-optimize.txt फ़ाइल भी शामिल होती है. इस फ़ाइल में ऐसे नियम शामिल होते हैं जो ज़्यादातर Android प्रोजेक्ट के लिए ज़रूरी होते हैं. इसलिए, आपको इसे बिल्ड फ़ाइल में ही रहने देना चाहिए. यह फ़ाइल, proguard-common.txt फ़ाइल पर आधारित है और इसका कॉन्टेंट भी इसी फ़ाइल से लिया गया है.
लेगसी डीएसएल (Kotlin)
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
// Default file with default optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
}
}
}
लेगसी डीएसएल (Groovy)
android {
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
// Default file with default optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
डेटा को सुरक्षित रखने का नियम जोड़ना
कीप रूल जोड़ते समय, ग्लोबल विकल्प शामिल किए जा सकते हैं. साथ ही, अपने कीप रूल भी तय किए जा सकते हैं.
ग्लोबल विकल्प: ग्लोबल विकल्प, सामान्य निर्देश होते हैं. इनसे यह तय होता है कि R8, आपके पूरे कोडबेस पर कैसे काम करेगा. ज़्यादा जानने के लिए, ग्लोबल विकल्प देखें.
कीप नियम: कीप नियमों को सावधानी से डिज़ाइन किया जाना चाहिए, ताकि यह पक्का किया जा सके कि आपको कोड ऑप्टिमाइज़ेशन को ज़्यादा से ज़्यादा करने और गलती से अपने ऐप्लिकेशन को तोड़ने के बीच सही संतुलन मिले. कीप नियम लिखने का तरीका जानने के लिए, कीप नियम जोड़ें लेख पढ़ें.
लाइब्रेरी तैयार करने वालों के लिए कीप नियम
कीप नियमों के लिए ग्लोबल विकल्पों और सिंटैक्स के बारे में जानने के बाद, ज़्यादा जानकारी के लिए लाइब्रेरी तैयार करने वालों के लिए ऑप्टिमाइज़ेशन लेख पढ़ें.