क्रैश स्टैक ट्रेस को डिकोड करना या सिम्बॉलिकेट करना

 

Android डिवाइस पर ऐप्लिकेशन बंद होने और ANRs की समस्याओं की वजह से स्टैक ट्रेस बनती है. स्टैक ट्रेस, नेस्ट किए हुए उन फंक्शन के क्रम का स्नैपशॉट होती है जो कि ऐप्लिकेशन के बंद होने के समय तक आपके प्रोग्राम में इस्तेमाल किए जाते हैं. ये स्नैपशॉट, सोर्स कोड में मौजूद किसी भी समस्या का पता लगाने और उसे ठीक करने में आपकी मदद कर सकते हैं.

अगर आपका ऐप्लिकेशन या गेम, Java की मदद से बनाया गया है और आप अपनी APK फ़ाइलों को ऑप्टिमाइज़ करने और उन्हें कोड करने के लिए ProGuard का इस्तेमाल करते हैं, तो आप Play Console पर अपने ऐप्लिकेशन के हर वर्शन के लिए ProGuard मैपिंग फ़ाइल अपलोड कर सकते हैं. अगर आपके ऐप्लिकेशन या गेम को C++ जैसे नेटिव कोड का इस्तेमाल करके बनाया गया है, तो आप Play Console में अपने ऐप्लिकेशन के हर वर्शन के लिए डीबग सिंबल वाली फ़ाइल अपलोड कर सकते हैं. इससे, आपके ऐप्लिकेशन बंद होने और ANRs जैसी समस्याओं का विश्लेषण करना और उन्हें ठीक करना आसान हो जाता है.

ज़रूरी: Java में कंपाइल किए गए ऐप्लिकेशन को डिकोड करने के लिए, सिर्फ़ ReTrace वाली मैपिंग फ़ाइलें ही काम करती हैं. यही फ़ॉर्मैट ProGuard या R8 में भी इस्तेमाल किया जाता है.

पहला कदम: डिकोड की गई फ़ाइल या सिम्बॉलिकेशन फ़ाइल जनरेट करना

अपने ऐप्लिकेशन के किसी वर्शन के लिए, ऐप्लिकेशन के बंद होने और ANRs की समस्याओं को डिकोड करने या सिम्बॉलिकेट करने के लिए, आपको सबसे पहले अपने ऐप्लिकेशन के उस वर्शन के लिए ज़रूरी फ़ाइलें जनरेट करनी होंगी. डिकोड करने या सिम्बॉलिकेशन के लिए, आपको अपने ऐप्लिकेशन के हर नए वर्शन के लिए फ़ाइल जनरेट और अपलोड करनी होगी.

Java: ProGuard मैपिंग फ़ाइल जनरेट करना

Java स्टैक ट्रेस को डिकोड करने के लिए, आपको सबसे पहले ProGuard मैपिंग फ़ाइल जनरेट करनी होगी. इसका तरीका जानने के लिए, Google Developers साइट पर जाएं.

नेटिव: डीबग सिंबल वाली फ़ाइल जनरेट करना

'Android Gradle प्लग इन' 4.1 और इसके बाद के वर्शन

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

  • android.defaultConfig.ndk.debugSymbolLevel = 'FULL'

ध्यान दें: डीबग सिंबल वाली फ़ाइल की सीमा 300 एमबी है. अगर आपका डीबग सिंबल फ़ुटप्रिंट बहुत बड़ा है, तो फ़ाइल का साइज़ घटाने के लिए, FULL की बजाय SYMBOL_TABLE का इस्तेमाल करें.

अगर आपके प्रोजेक्ट में APK बनाया जाता है, तो डीबग सिंबल वाली फ़ाइल जनरेट करने के लिए ऊपर दी गई build.gradle बिल्ड सेटिंग का इस्तेमाल करें. Google Play Console में डीबग सिंबल वाली फ़ाइल को मैन्युअल तरीके से अपलोड करें, जैसा कि नीचे दूसरे चरण में बताया गया है. दूसरा चरण: डिकोड करने वाली या सिम्बॉलिकेशन फ़ाइल अपलोड करना. बिल्ड प्रोसेस का हिस्सा होने के चलते, 'Android Gradle प्लग इन' प्रोजेक्ट की नीचे बताई गई जगह पर इस फ़ाइल का आउटपुट देता है:

  • app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip

'Android Gradle प्लग इन' 4.0 और इससे पहले का वर्शन (और अन्य बिल्ड सिस्टम)

APK या 'Android ऐप्लिकेशन बंडल' के लिए बिल्ड प्रोसेस का हिस्सा होने के चलते, 'Android Gradle प्लग इन' प्रोजेक्ट डायरेक्ट्री में ज़्यादा जानकारी वाली लाइब्रेरी की एक कॉपी रखता है. इस डायरेक्ट्री की संरचना इस तरह की है:

app/build/intermediates/cmake/universal/release/obj

├── armeabi-v7a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── arm64-v8a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── x86/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

└── x86_64/

    ├── libgameengine.so

    ├── libothercode.so

    └── libvideocodec.so

ध्यान दें: अगर आप किसी दूसरे बिल्ड सिस्टम का इस्तेमाल करते हैं, तो आप ज़्यादा जानकारी वाली लाइब्रेरी को डायरेक्ट्री में स्टोर करने के लिए ऊपर दी गई ज़रूरी संरचना की मदद से इसमें बदलाव कर सकते हैं.

  1. इस डायरेक्ट्री के कॉन्टेंट को ज़िप अप करें:
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip .
  2. Play Console में symbols.zip फ़ाइल को मैन्युअल तरीके से अपलोड करें, जैसा कि नीचे दूसरे चरण में बताया गया है. दूसरा चरण: डिकोड करना या सिम्बॉलिकेशन फ़ाइल को अपलोड करना.

डीबग सिंबल वाली फ़ाइल का साइज़ ज़्यादा से ज़्यादा 300 एमबी हो सकता है. अगर आपकी फ़ाइल का साइज़ बहुत बड़ा है, तो ऐसा हो सकता है कि आपकी .so फ़ाइलों में सिंबल टेबल (फ़ंक्शन के नाम) और DWARF डीबग की जानकारी (फ़ाइलों के नाम और कोड की लाइनें) शामिल हो. आपको अपने कोड को सिम्बॉलिकेट करने के लिए इन चीज़ों की ज़रूरत नहीं है. इस निर्देश की मदद से इन्हें हटाया जा सकता है:

  • $OBJCOPY --strip-debug lib.so lib.so.sym

ध्यान दें: $OBJCOPY उस खास एबीआई वर्शन की ओर इशारा करता है जिसे आप अलग कर रहे हैं, उदाहरण के लिए:ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

दूसरा चरण: डिकोड की गई या सिम्बॉलिकेशन फ़ाइल अपलोड करना

अपने ऐप्लिकेशन के किसी वर्शन के लिए, ऐप्लिकेशन के बंद होने या ANRs को डिकोड करने या सिम्बॉलिकेट करने के लिए, आपको अपने ऐप्लिकेशन के हर वर्शन के लिए डिकोड की गई या सिम्बॉलिकेशन फ़ाइलें अपलोड करनी होंगी.

ज़रूरी: यह चरण सिर्फ़ उन डेवलपर के लिए ज़रूरी है जो APKs का इस्तेमाल करते हैं. अगर आप 'Android ऐप्लिकेशन बंडल' और 'Android Gradle प्लग इन' का 4.1 या उससे बाद वाला वर्शन इस्तेमाल कर रहे हैं, तो आपको कुछ भी करने की ज़रूरत नहीं है. हम बंडल में से डिकोड की गई फ़ाइल अपने-आप निकाल लेंगे और आप तीसरे चरण पर जा सकते हैं. तीसरा चरण: डिकोड करने वाली क्रैश स्टैक ट्रेस देखें. आप Android डेवलपर साइट पर ऐप्लिकेशन बंडल के बारे में और ज़्यादा जान सकते हैं.

Play Console का इस्तेमाल करके फ़ाइलें अपलोड करना

डिकोड करने वाली या सिम्बॉलिकेशन फ़ाइल अपलोड करने के लिए:

  1. Play Console खोलें.
  2. कोई ऐप्लिकेशन चुनें.
  3. बाईं ओर मेन्यू पर, रिलीज़ > डिवाइस और वर्शन> ऐप्लिकेशन बंडल एक्सप्लोरर चुनें.
  4. सबसे ऊपर दाएं कोने पर दिए गए पिकर की मदद से, ज़रूरी आर्टफ़ैक्ट चुनें.
  5. डाउनलोड टैब को चुनें और नीचे की ओर स्क्रोल करके “एसेट” सेक्शन पर जाएं.
  6. मैपिंग फ़ाइल या डीबग सिंबल के लिए, अपलोड वाले ऐरो पर क्लिक करें. इससे आपके ऐप्लिकेशन के वर्शन के लिए, डिकोड की गई या सिम्बॉलिकेशन फ़ाइल अपलोड हो जाएगी.
Google Play डेवलपर API (एपीआई) का इस्तेमाल करके फ़ाइलें अपलोड करना

Google Play डेवलपर API (एपीआई) का इस्तेमाल करके फ़ाइलें अपलोड करने के लिए, Google डेवलपर साइट पर जाएं.

तीसरा चरण: डिकोड करने वाली क्रैश स्टैक ट्रेस देखना

जब आप अपने ऐप्लिकेशन के किसी वर्शन के लिए ProGuard मैपिंग फ़ाइल या डीबग सिंबल फ़ाइल अपलोड कर देते हैं, तो उसके बाद ऐप्लिकेशन के बंद होने और ANRs की समस्याएं डिकोड हो जाती हैं. आप ऐप्लिकेशन बंद होने और ANRs से जुड़ी हर समस्या के लिए, अपने ऐप्लिकेशन के ऐप्लिकेशन बंद होना और ANRs की समस्याएं पेज पर जाकर, डिकोड करने वाली स्टैक ट्रेस देख सकते हैं.

  1. Play Console खोलें.
  2. कोई ऐप्लिकेशन चुनें.
  3. बाईं ओर मेन्यू पर, क्वालिटी > Android की ज़रूरी जानकारी > ऐप्लिकेशन बंद होना और ANRs चुनें.
  4. ऐप्लिकेशन बंद होने की कोई समस्या चुनें.
  5. "स्टैक ट्रेस" सेक्शन में, आपको डिकोड की गई और सिम्बॉलिकेट की हुई स्टैक ट्रेस दिखेंगी.

ज़रूरी: अपने ऐप्लिकेशन के किसी वर्शन के लिए मैपिंग फ़ाइल अपलोड करने के बाद, उस वर्शन के लिए सिर्फ़ भविष्य में होने वाली, ऐप्लिकेशन बंद होने और ANRs की समस्याओं को डिकोड किया जाएगा. आपके ऐप्लिकेशन के किसी वर्शन के लिए मैपिंग फ़ाइल अपलोड करने से पहले, उस वर्शन में आ चुकीं ऐप्लिकेशन बंद होने या ANRs की समस्याओं को डिकोड नहीं किया जाएगा.

अक्सर पूछे जाने वाले सवाल

मैं Play Console को डिकोड करने या सिम्बॉलिकेट करने की सुविधा का इस्तेमाल नहीं करना चाहता/चाहती हूं. क्या मैं इसे ऑफ़लाइन इस्तेमाल कर सकता/सकती हूं?

Play Console किसी खास ऐप्लिकेशन में स्टैक ट्रेस दिखाने के लिए, ndk-stack का इस्तेमाल करता है और Java में ऐप्लिकेशन बंद होने की समस्याओं को दिखाने के लिए, ReTrace का इस्तेमाल करता है. अगर आप डिकोड की गई अपनी फ़ाइलों को शेयर नहीं करना चाहते हैं, तो आप कोड किए गए क्रैश स्टैक को Play Console से कॉपी कर सकते हैं. इसके बाद, उन्हें सिम्बॉलिकेट करने के लिए सही ऑफ़लाइन टूल का इस्तेमाल कर सकते हैं. हालांकि, यह प्रोसेस ऐप्लिकेशन बंद होने से जुड़े हर स्टैक के लिए मैन्युअल तरीके से पूरी की जानी चाहिए. इस वजह से यह प्रोसेस धीमी हो जाती है और इसमें ज़्यादा समय लगता है. डिकोड करने वाली आपकी फ़ाइलें उपलब्ध कराकर, Play Console आपके लिए इसे मैनेज करेगा.

मैंने डिकोड करने वाली/सिम्बॉलिकेशन फ़ाइल अपलोड कर दी है, फिर भी ऐप्लिकेशन बंद होने और ANRs से जुड़ी उलझनें अब तक कम क्यों नहीं हुईं?

जब आप अपने ऐप्लिकेशन के किसी वर्शन के लिए ProGuard मैपिंग फ़ाइल या डीबग सिंबल वाली फ़ाइल अपलोड कर देते हैं, तो सिर्फ़ उसके बाद आने वाली, ऐप्लिकेशन बंद होने और ANRs की समस्याएं डिकोड की जाएंगी. Play Console में, ऐप्लिकेशन बंद होने और ANRs की समस्याएं डिकोड करने से पहले आपको समय देना होगा, ताकि डिवाइस इस्तेमाल करने वाले लोग, ऐप्लिकेशन बंद होने और ANRs की नई समस्याओं की शिकायत दर्ज करा सकें.

डिकोड की गई/सिम्बॉलिकेशन फ़ाइल अपलोड करने के बाद भी, ऐप्लिकेशन बंद होने और ANRs की समस्याएं पूरी तरह से खत्म क्यों नहीं हुई हैं?

डिकोड की गई/सिम्बॉलिकेशन वाली अधूरी फ़ाइल अपलोड करने से ऐसा होता है. पक्का करें कि आपने अपने पूरे ऐप्लिकेशन के लिए सिम्बॉलिकेशन वाली फ़ाइलें अपलोड की हों. खास तौर पर, अगर आप एक से ज़्यादा स्टेज वाले या किसी मुश्किल बिल्ड प्रोसेस पर काम कर रहे हैं. पूरी तरह से डिकोड न होने की सबसे सामान्य वजहों में से एक वजह, तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करना है. ऐसी स्थिति में आप लाइब्रेरी की सेवा देने वाली कंपनी से, डिकोड करने वाली फ़ाइलें पा सकते हैं.

डिकोड की गई/सिम्बॉलिकेशन वाली फ़ाइल अपलोड करने के बाद, मुझे ऐप्लिकेशन बंद होने और ANRs से जुड़ी कम, लेकिन ज़्यादा गंभीर समस्याएं क्यों मिल रही हैं?

डिकोड करने वाली फ़ाइलों के बिना, 32-बिट और 64-बिट के डिवाइस पर या फिर ARM और Intel डिवाइस पर, ऐप्लिकेशन बंद होने या ANR की एक ही समस्या अलग-अलग दिखेगी. डिकोड की गई फ़ाइलें उपलब्ध कराकर, हम ऐप्लिकेशन बंद होने की इन समस्याओं को एक साथ इकट्ठा कर सकते हैं. इससे आपको अपने ऐप्लिकेशन के बंद होने और ANRs की मुख्य समस्याओं के बारे में पता चलेगा.

अगर मैं फ़ाइल अपलोड करना भूल जाऊं, तो क्या होगा?

अगर आप अपने ऐप्लिकेशन के नए वर्शन के लिए फ़ाइल अपलोड करना भूल जाते हैं, तो ऐप्लिकेशन बंद होने और ANRs की समस्याएं, फिर से कोड वाले वर्शन में बदल जाएंगी. इसे अभी अपलोड करने के लिए, ऊपर दिए गए निर्देशों का पालन करें. जब आप अपने ऐप्लिकेशन के किसी वर्शन के लिए ProGuard मैपिंग फ़ाइल या डीबग सिंबल वाली फ़ाइल अपलोड कर देते हैं, तो सिर्फ़ उसके बाद आने वाली, ऐप्लिकेशन बंद होने और ANRs की समस्याएं डिकोड की जाएंगी. Play Console में, ऐप्लिकेशन बंद होने और ANRs की समस्याएं डिकोड करने से पहले आपको समय देना होगा, ताकि डिवाइस इस्तेमाल करने वाले लोग, ऐप्लिकेशन बंद होने और ANRs की नई समस्याओं की शिकायत दर्ज करा सकें.

फ़ाइल अपलोड करना भूल जाने के जोखिम से बचने के लिए, अपनी बिल्ड प्रोसेस बदलें. ऐसा करके आप 'Android Gradle प्लग इन' के 4.1 या उसके बाद वाले वर्शन की मदद से, ऐप्लिकेशन बंडल इस्तेमाल कर सकते हैं. इस स्थिति में, आप Android डेवलपर साइट पर दिए गए निर्देशों का पालन करके, ऐप्लिकेशन बंडल में डीबग सिंबल फ़ाइल को अपने-आप शामिल कर सकते हैं.

अगर मैं गलत फ़ाइल अपलोड कर दूं, तो क्या होगा?

अगर आप अपने ऐप्लिकेशन के किसी वर्शन के लिए गलत फ़ाइल अपलोड कर देते हैं, तो ऐप्लिकेशन बंद होने और ANRs की समस्याएं, फिर से कोड वाले वर्शन में बदल जाएंगी. सही किया गया वर्शन अपलोड करने के लिए:

  1. Play Console खोलें.
  2. कोई ऐप्लिकेशन चुनें.
  3. बाईं ओर मेन्यू पर, रिलीज़ > डिवाइस और वर्शन> ऐप्लिकेशन बंडल एक्सप्लोरर चुनें.
  4. सबसे ऊपर दाएं कोने पर दिए गए पिकर की मदद से, ज़रूरी आर्टफ़ैक्ट चुनें.
  5. डाउनलोड टैब को चुनें और नीचे की ओर स्क्रोल करके “एसेट” सेक्शन पर जाएं.
  6. डिकोड करने वाली या सिम्बॉलिकेशन की गलत फ़ाइल के बगल में, मिटाएं आइकॉन पर क्लिक करें.
  7. गलत वर्शन को मिटाने के बाद, अपलोड आइकॉन पर क्लिक करें और अपने ऐप्लिकेशन के वर्शन के लिए सही फ़ाइल अपलोड करें.

जब आप अपने ऐप्लिकेशन के किसी वर्शन के लिए ProGuard मैपिंग फ़ाइल या डीबग सिंबल फ़ाइल अपलोड कर देते हैं, तो उसके बाद ऐप्लिकेशन के बंद होने और ANRs की समस्याएं डिकोड हो जाती हैं. उपयोगकर्ता के डिवाइस से, ऐप्लिकेशन के बंद होने और ANRs की नई समस्याओं की शिकायत होने में कुछ समय लगता है. इसके बाद ही, आपको ऐप्लिकेशन के बंद होने और ANRs की डिकोड की गई समस्याएं Play Console में दिखती हैं.

सलाह: फ़ाइल का गलत वर्शन अपलोड करने के जोखिम से बचने के लिए, अपनी बिल्ड प्रोसेस बदलें. ऐसा करके आप 'Android Gradle प्लग इन' के 4.1 या उसके बाद वाले वर्शन की मदद से, ऐप्लिकेशन बंडल इस्तेमाल कर सकते हैं. इस स्थिति में, आप Android डेवलपर साइट पर दिए गए निर्देशों का पालन करके, ऐप्लिकेशन बंडल में डीबग सिंबल फ़ाइल को अपने-आप शामिल कर सकते हैं.

मैं अभी APKs का इस्तेमाल कर रहा / रही हूं. मैं ऐप्लिकेशन बंडल का इस्तेमाल करने के लिए क्या करूं?

शुरू करने के लिए Android डेवलपर साइट पर जाएं.

मेरे ऐप्लिकेशन में नेटिव और Java कोड, दोनों हैं. क्या मैं नेटिव सिम्बॉलिकेशन फ़ाइल और Java की डिकोड की गई फ़ाइल, दोनों अपलोड कर सकता / सकती हूं?

हां.

क्या यह उपयोगी था?
हम उसे किस तरह बेहतर बना सकते हैं?

और मदद चाहिए?

मदद के दूसरे तरीकों के लिए साइन इन करें ताकि आपकी समस्या झटपट सुलझ सके