ऑप्टिमाइज़ेशन से जुड़ी समस्याएं ठीक करना

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

समस्या हल करते समय, इन स्थितियों पर फ़ोकस करें:

  • ज़्यादा ऑप्टिमाइज़ेशन की वजह से ऐप्लिकेशन क्रैश होना: R8 ने आपके ऐप्लिकेशन के कोड को ज़रूरत से ज़्यादा ऑप्टिमाइज़ कर दिया है. इस वजह से, ऐप्लिकेशन क्रैश हो जाता है.
  • ऑप्टिमाइज़ेशन का सही तरीके से न होना या ज़रूरत से कम होना: R8 ने आपके ऐप्लिकेशन को उतना ऑप्टिमाइज़ नहीं किया जितना आपने सोचा था. इसके अलावा, आपको ऑप्टिमाइज़ेशन के बारे में ज़्यादा जानकारी चाहिए.

ऐप्लिकेशन क्रैश होना

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

  • आपको एक अपवाद दिखता है. इसका मतलब है कि बताई गई क्लास, तरीका या फ़ील्ड का इस्तेमाल रिफ़्लेक्शन के ज़रिए किया जा रहा है. आम तौर पर, ये अपवाद इनमें से कोई एक होते हैं: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • आपको ऐसा कोड दिखता है जो import kotlin.reflect.* या import java.lang.reflect.* के साथ रिफ़्लेक्शन को रेफ़र करता है.
  • आपको क्लास कंस्ट्रक्टर का इस्तेमाल इस तरह दिखता है: Something::class.constructors.
  • आपको Class.forName(...) दिखता है.

समस्या का हल: एक कीप नियम जोड़ें.

अगर रिफ़्लेक्शन आपके कोड से हो रहा है, तो कीप नियम जोड़ने के बजाय, उस कोड को Jetpack Keep एनोटेशन के साथ एनोटेट किया जा सकता है. Jetpack Keep लिंट की जांच में, रिफ़्लेक्शन के उन अन्य कॉल को भी फ़्लैग किया जाता है जिन्हें एनोटेट नहीं किया गया है. इससे, आपको इसी तरह के क्रैश से बचने में मदद मिलती है.

ऑप्टिमाइज़ेशन का सही तरीके से न होना या ज़रूरत से कम होना

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