R8 के ऑप्टिमाइज़ेशन, आपके ऐप्लिकेशन के कोड को अपडेट करते हैं. इसलिए, यह ज़रूरी है कि आप अपने ऐप्लिकेशन के व्यवहार की अच्छी तरह से जांच करें. इससे यह पक्का किया जा सकेगा कि आपका ऐप्लिकेशन उम्मीद के मुताबिक काम कर रहा है. अगर आपको कोई समस्या आती है, तो इस पेज का इस्तेमाल करके ऑप्टिमाइज़ेशन के बाद संभावित समस्याओं को हल करें.
समस्या हल करते समय, इन स्थितियों पर ध्यान दें:
- ज़्यादा ऑप्टिमाइज़ेशन की वजह से ऐप्लिकेशन बंद हो रहा है: R8 ने बहुत ज़्यादा कोड ऑप्टिमाइज़ किया है. इस वजह से, आपका ऐप्लिकेशन बंद हो रहा है.
- ऑप्टिमाइज़ेशन के बारे में साफ़ तौर पर नहीं बताया गया है या ऑप्टिमाइज़ेशन की जानकारी अधूरी है: R8 ने आपके ऐप्लिकेशन को आपकी उम्मीद के मुताबिक ऑप्टिमाइज़ नहीं किया है या आपको ऑप्टिमाइज़ेशन के बारे में ज़्यादा जानकारी चाहिए.
ऐप्लिकेशन क्रैश होना
अगर R8 का इस्तेमाल करके ऐप्लिकेशन को ऑप्टिमाइज़ करने के बाद वह क्रैश हो जाता है, तो आम तौर पर इसकी वजह रिफ़्लेक्शन का काम न करना होता है. टूटे हुए रिफ़्लेक्शन की पहचान करने के लिए, इन दिशा-निर्देशों का इस्तेमाल करें:
- आपको एक अपवाद दिखता है. इसका आम तौर पर मतलब यह होता है कि बताई गई क्लास, तरीके या फ़ील्ड का इस्तेमाल रिफ़्लेक्शन के ज़रिए किया जा रहा है.
ये अपवाद आम तौर पर इनमें से कोई एक होते हैं:
ClassNotFoundException,NoSuchMethodException,NoSuchFieldException,NoClassDefFoundError,NoSuchMethodError,NoSuchFieldError. - आपको ऐसा कोड दिखता है जिसमें
import kotlin.reflect.*याimport java.lang.reflect.*के साथ रिफ़्लेक्शन का रेफ़रंस दिया गया हो. - आपको क्लास कंस्ट्रक्टर का इस्तेमाल इस तरह से दिखता है:
Something::class.constructors. - आपको
Class.forName(...)दिखता है.
समाधान: डेटा बनाए रखने का नियम जोड़ें.
ऑप्टिमाइज़ेशन की जानकारी साफ़ तौर पर नहीं दी गई है या अधूरी है
नियम आपके ऐप्लिकेशन के साथ-साथ शामिल की गई लाइब्रेरी पर भी लागू होते हैं. इसलिए, आपको लागू किए गए नियमों के बारे में ज़्यादा जानकारी चाहिए हो सकती है. इसके अलावा, आपको यह भी जानना पड़ सकता है कि R8 ने कोड के कुछ ऐसे सेक्शन क्यों बनाए रखे जिन्हें ऑप्टिमाइज़ किया जाना था.
लागू किए गए नियमों के बारे में जानकारी न होना: शामिल की गई लाइब्रेरी के नियम भी आपके ऐप्लिकेशन पर लागू होते हैं. साथ ही, इन लाइब्रेरी के ग्लोबल विकल्प भी आपके ऐप्लिकेशन पर लागू होते हैं. इसलिए, आपको यह पता नहीं चल सकता कि कौनसे नियम लागू किए गए हैं.
समस्या का हल: यह देखने के लिए कि कौनसे नियम लागू किए गए हैं, उन सभी नियमों की रिपोर्ट देखें जिन्हें R8, आपके प्रोजेक्ट को बिल्ड करते समय लागू करता है. यह रिपोर्ट
./app/build/outputs/mapping/configuration.txtपर देखी जा सकती है. इस रिपोर्ट में, R8 को कॉन्फ़िगर करने के लिए इस्तेमाल की गई हर लाइब्रेरी और मॉड्यूल के सभी मर्ज किए गए नियम शामिल होते हैं. इसका इस्तेमाल, कम असरदार नियमों की पहचान करने के लिए किया जा सकता है.बहुत ज़्यादा कोड रखा जा रहा है: R8 का ऑप्टिमाइज़ेशन, ऐसे कोड को बनाए रख सकता है जिसे आपको हटाना था.
समाधान: कॉन्फ़िगरेशन विकल्प
-whyareyoukeepingका इस्तेमाल करके, यह समझने में मदद पाएं कि कोड को क्यों रखा गया था. आउटपुट में, रखे गए कोड से लेकर आपके ऐप्लिकेशन के किसी एंट्री पॉइंट तक का पाथ शामिल होता है. ज़्यादा जानकारी के लिए,-whyareyoukeepingदेखें.ओरिजनल स्टैक ट्रेस को समझने में मुश्किल होना: R8, कोड में कई तरह के बदलाव करता है. इस वजह से, स्टैक ट्रेस अब ओरिजनल कोड को रेफ़र नहीं करता. उदाहरण के लिए, लाइन नंबर और क्लास और तरीकों के नाम बदल सकते हैं.
समाधान: Android Studio Otter 3 Feature Drop और AGP 9.0 से, Logcat अपने-आप स्टैक ट्रेस को डीऑब्फ़स्केट करता है. हालांकि, अगर Android Studio के पुराने वर्शन का इस्तेमाल किया जा रहा है, तो आपको ओरिजनल स्टैक ट्रेस को मैन्युअल तरीके से वापस लाना होगा. ओरिजनल स्टैक ट्रेस को वापस लाने के लिए,
retraceकमांड-लाइन टूल का इस्तेमाल करें. यह कमांड-लाइन टूल पैकेज के साथ बंडल किया गया है.retraceका इस्तेमाल करने के लिए, मैपिंग फ़ाइल और स्टैक ट्रेस फ़ाइल के पाथ के साथ कमांड दें. मैपिंग फ़ाइल कोmapping.txtकहा जाता है. यह आपके Android ऐप्लिकेशन बंडल (AAB) के साथ अपने-आप बंडल हो जाती है. ज़्यादा जानकारी के लिए, retrace का दस्तावेज़ पढ़ें. साथ ही, Play Console के सहायता केंद्र का यह लेख पढ़ें: क्रैश स्टैक ट्रेस को डीऑब्फ़स्केट करने का तरीका. Play और Firebase Crashlytics का इस्तेमाल करते समय,mapping.txtफ़ाइल का इस्तेमाल करें. इसमें वे क्रैश शामिल होते हैं जिन्हें सेवा, ऐप्लिकेशन के उपयोगकर्ताओं से इकट्ठा करती है. नीचे दिए गए निर्देश में बताया गया है कि अपने प्रोजेक्ट के रूट सेretraceको कैसे चलाया जा सकता है:$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
बग की रिपोर्ट करें
अगर आपको R8 से जुड़ी किसी समस्या को हल करने में परेशानी आ रही है, तो बग की शिकायत करें.