Android डिवाइस पर, ऐप्लिकेशन बंद होने और ANR की समस्याओं की वजह से स्टैक ट्रेस बनता है. स्टैक ट्रेस, नेस्ट किए हुए उन फ़ंक्शन के क्रम का स्नैपशॉट होता है जिन्हें ऐप्लिकेशन बंद होने तक आपके प्रोग्राम में रन किया गया था. ये स्नैपशॉट, सोर्स कोड में मौजूद किसी भी समस्या का पता लगाने और उसे ठीक करने में आपकी मदद कर सकते हैं.
यह मुमकिन है कि आपका ऐप्लिकेशन या गेम, Java का इस्तेमाल करके बनाया गया हो और आपने अपने ऐप्लिकेशन को ऑप्टिमाइज़ करने और उसके सोर्स कोड को इस तरह उलझाने के लिए ProGuard का इस्तेमाल किया हो कि वह आम लोगों की समझ में न आए. ऐसे में, Play Console में अपने ऐप्लिकेशन के हर वर्शन के लिए ProGuard मैपिंग फ़ाइल अपलोड की जा सकती है. अगर आपके ऐप्लिकेशन या गेम को C++ जैसे नेटिव कोड का इस्तेमाल करके बनाया गया है, तो Play Console में अपने ऐप्लिकेशन के हर वर्शन के लिए डीबग सिंबल वाली फ़ाइल अपलोड की जा सकती है. इससे आपके ऐप्लिकेशन के बंद होने और ANR की समस्याओं का विश्लेषण करना और उन्हें ठीक करना आसान हो जाता है.
ज़रूरी जानकारी: Java का इस्तेमाल करके बनाए गए ऐप्लिकेशन को डिकोड करने में, सिर्फ़ ReTrace वाली मैपिंग फ़ाइलें ही काम करती हैं. यही फ़ॉर्मैट ProGuard या R8 में भी इस्तेमाल किया जाता है.
पहला चरण: डिकोड करने वाली फ़ाइल या सिम्बॉलिकेशन फ़ाइल जनरेट करना
अपने ऐप्लिकेशन के किसी वर्शन के मामले में, उसके बंद होने और ANR की समस्याओं को डिकोड करने या सिम्बॉलिकेट करने के लिए, आपको सबसे पहले उस वर्शन के लिए ज़रूरी फ़ाइलें जनरेट करनी होंगी. डिकोड करने या सिम्बॉलिकेशन के लिए, आपको अपने ऐप्लिकेशन के हर नए वर्शन के लिए एक फ़ाइल जनरेट और अपलोड करनी होगी.
Java: ProGuard मैपिंग फ़ाइल जनरेट करनाJava का इस्तेमाल करके बनाए गए ऐप्लिकेशन के स्टैक ट्रेस को डिकोड करने के लिए, आपको सबसे पहले ProGuard मैपिंग फ़ाइल जनरेट करनी होगी. इसका तरीका जानने के लिए, Google Developers साइट पर जाएं.
'Android Gradle प्लग इन' 4.1 और इसके बाद वाले वर्शन
अगर आपके प्रोजेक्ट में Android ऐप्लिकेशन बंडल बनाया जाता है, तो इसमें डीबग सिंबल वाली फ़ाइल को अपने-आप शामिल होने के लिए सेट किया जा सकता है. इस फ़ाइल को शामिल करने के लिए, अपने ऐप्लिकेशन की build.gradle
फ़ाइल में इस सेटिंग का इस्तेमाल करें:
android.defaultConfig.ndk.debugSymbolLevel = 'FULL'
ध्यान दें: डीबग सिंबल वाली फ़ाइल 800 एमबी से ज़्यादा की नहीं होनी चाहिए. अगर आपका डीबग सिंबल फ़ुटप्रिंट बहुत बड़ा है, तो फ़ाइल का साइज़ घटाने के लिए, 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 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
ध्यान दें: अगर किसी दूसरे बिल्ड सिस्टम का इस्तेमाल किया जाता है, तो ज़्यादा जानकारी वाली लाइब्रेरी को डायरेक्ट्री में स्टोर करने के लिए, ऊपर दिए गए स्ट्रक्चर के हिसाब से इसमें बदलाव किया जा सकता है.
- इस डायरेक्ट्री के कॉन्टेंट की ज़िप फ़ाइल बनाएं:
$ cd app/build/intermediates/cmake/universal/release/obj
$ zip -r symbols.zip .
- Play Console में symbols.zip फ़ाइल को मैन्युअल तरीके से अपलोड करें, जैसा कि दूसरे चरण में बताया गया है. दूसरा चरण: सिम्बॉलिकेशन फ़ाइल या डिकोड करने वाली फ़ाइल अपलोड करना.
डीबग सिंबल वाली फ़ाइल 800 एमबी से ज़्यादा की नहीं होनी चाहिए. अगर आपकी फ़ाइल का साइज़ बहुत बड़ा है, तो ऐसा हो सकता है कि आपकी .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
दूसरा चरण: सिम्बॉलिकेशन फ़ाइल या डिकोड करने वाली फ़ाइल अपलोड करना
अपने ऐप्लिकेशन के किसी वर्शन के मामले में, उसके बंद होने या ANR की समस्याओं को डिकोड करने या सिम्बॉलिकेट करने के लिए, आपको हर वर्शन के लिए डिकोड करने वाली फ़ाइल या सिम्बॉलिकेशन फ़ाइलें अपलोड करनी होंगी.
ज़रूरी जानकारी: यह चरण सिर्फ़ उन डेवलपर के लिए ज़रूरी है जो APK का इस्तेमाल करते हैं. अगर आपने किसी ऐप्लिकेशन बंडल और 'Android Gradle प्लग इन' के 4.1 या उसके बाद वाले वर्शन का इस्तेमाल किया है, तो आपको कुछ भी करने की ज़रूरत नहीं है. हम बंडल में से डिकोड करने वाली फ़ाइल अपने-आप निकाल लेंगे. अब आप तीसरे चरण पर जाएं. तीसरा चरण: डिकोड किए जा चुके क्रैश स्टैक ट्रेस देखना. ऐप्लिकेशन बंडल के बारे में ज़्यादा जानकारी के लिए Android Developers साइट पर जाएं.
Play Console का इस्तेमाल करके फ़ाइलें अपलोड करनाडिकोड करने वाली या सिम्बॉलिकेशन फ़ाइल अपलोड करने के लिए:
- Play Console खोलें.
- कोई ऐप्लिकेशन चुनें.
- बाएं मेन्यू में मौजूद,
जांच करें और रिलीज़ करें
> ऐप्लिकेशन बंडल एक्सप्लोरर को चुनें. - सबसे ऊपर दाएं कोने में मौजूद पिकर के ज़रिए, ज़रूरी आर्टफ़ैक्ट चुनें.
- डाउनलोड टैब को चुनें और नीचे की ओर स्क्रोल करके "ऐसेट" सेक्शन पर जाएं.
- मैपिंग फ़ाइल या डीबग सिंबल फ़ाइल के लिए, फ़ाइल अपलोड ऐरो पर क्लिक करें. इसके बाद, अपने ऐप्लिकेशन के वर्शन की सिम्बॉलिकेशन फ़ाइल या डिकोड करने वाली फ़ाइल (इनमें से जो लागू हो) अपलोड करें.
Google Play Developer API का इस्तेमाल करके फ़ाइलें अपलोड करने के लिए, Google Developers साइट पर जाएं.
तीसरा चरण: डिकोड की गई क्रैश स्टैक ट्रेस देखना
अगर आपने अपने ऐप्लिकेशन के किसी वर्शन के लिए ProGuard मैपिंग फ़ाइल या डीबग सिंबल वाली फ़ाइल अपलोड की है, तो इसके बाद ऐप्लिकेशन बंद होने और ANR की समस्याएं ही डिकोड की जाएंगी. आप ऐप्लिकेशन बंद होने और ANR से जुड़ी हर समस्या के लिए, डिकोड की गई स्टैक ट्रेस को ऐप्लिकेशन बंद होने और ANR की समस्याएं पेज पर देखा जा सकता है.
- Play Console खोलें.
- कोई ऐप्लिकेशन चुनें.
- बाएं मेन्यू में मौजूद, नज़र रखें और बेहतर बनाएं > Android की ज़रूरी जानकारी > क्रैश और एएनआर को चुनें.
- ऐप्लिकेशन बंद होने की कोई समस्या चुनें.
- "स्टैक ट्रेस" सेक्शन में, आपको डिकोड की गई और सिम्बॉलिकेट की हुई स्टैक ट्रेस दिखेंगी.
ज़रूरी जानकारी: अपने ऐप्लिकेशन के किसी वर्शन के लिए मैपिंग फ़ाइल अपलोड करने के बाद, सिर्फ़ आने वाले समय में उस वर्शन के बंद होने और ANR से जुड़ी समस्याओं को डिकोड किया जाएगा. मैपिंग फ़ाइल अपलोड करने से पहले, उस ऐप्लिकेशन वर्शन के बंद होने या ANR की समस्याओं को डिकोड नहीं किया जाएगा.
अक्सर पूछे जाने वाले सवाल
मुझे Play Console की डिकोड करने या सिम्बॉलिकेट करने की सुविधा का इस्तेमाल नहीं करना. क्या इसे ऑफ़लाइन इस्तेमाल किया जा सकता है?Play Console, खास ऐप्लिकेशन में स्टैक ट्रेस दिखाने के लिए ndk-stack का इस्तेमाल करता है. Java में बनाए गए ऐप्लिकेशन के बंद होने की समस्याओं को दिखाने के लिए, यह ReTrace का इस्तेमाल करता है. अगर आपको डिकोड करने वाली फ़ाइलों को शेयर नहीं करना है, तो ऐप्लिकेशन बंद होने से जुड़े, उलझाए गए स्टैक को Play Console से कॉपी किया जा सकता है. इसके बाद, उन्हें सिम्बॉलिकेट करने के लिए सही ऑफ़लाइन टूल का इस्तेमाल किया जा सकता है. हालांकि, ऐप्लिकेशन बंद होने से जुड़े हर स्टैक के लिए, इस प्रोसेस को मैन्युअल तरीके से पूरा करना चाहिए. ऐसा करने पर, यह प्रोसेस धीमी हो जाती है और इसमें ज़्यादा समय लगता है. अगर डिकोड करने वाली अपनी फ़ाइलें उपलब्ध कराई जाती हैं, तो Play Console आपके लिए इसे मैनेज कर देगा.
अगर आपने अपने ऐप्लिकेशन के किसी वर्शन के लिए ProGuard मैपिंग फ़ाइल या डीबग सिंबल वाली फ़ाइल अपलोड की है, तो इसके बाद ऐप्लिकेशन बंद होने और ANR की समस्याएं ही डिकोड की जाएंगी. उपयोगकर्ता के डिवाइस से, ऐप्लिकेशन बंद होने और ANR की नई समस्याओं की शिकायत मिलने में कुछ समय लगता है. इसलिए, आपको ऐप्लिकेशन के बंद होने और ANR की डिकोड की गई समस्याएं, Play Console में दिखने में भी कुछ समय लगेगा.
डिकोड की जाने वाली/सिम्बॉलिकेशन वाली अधूरी फ़ाइल अपलोड करने से ऐसा होता है. पक्का करें कि आपने अपने पूरे ऐप्लिकेशन के लिए सिम्बॉलिकेशन वाली फ़ाइलें अपलोड की हों. खास तौर पर तब, जब किसी मुश्किल या एक से ज़्यादा स्टेज वाले बिल्ड प्रोसेस का इस्तेमाल किया जा रहा हो. पूरी तरह से डिकोड न होने की कई सामान्य वजहें हैं. इनमें से एक वजह, तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करना है. ऐसी स्थिति में, लाइब्रेरी की सेवा देने वाली कंपनी से डिकोड करने वाली फ़ाइलें ली जा सकती हैं.
अगर डिकोड करने वाली फ़ाइलें अपलोड नहीं की जाती हैं, तो 32-बिट और 64-बिट के डिवाइस या फिर ARM और Intel डिवाइस पर, ऐप्लिकेशन बंद होने और ANR की एक ही समस्या अलग-अलग दिखेगी. डिकोड की गई फ़ाइलें उपलब्ध कराकर, हम ऐप्लिकेशन बंद होने की इन समस्याओं को एक साथ इकट्ठा कर सकते हैं. इससे आपको अपने ऐप्लिकेशन के बंद होने और ANR की मुख्य समस्याओं के बारे में पता चलेगा.
अपने ऐप्लिकेशन के नए वर्शन के लिए फ़ाइल अपलोड करना भूल जाने पर, ऐप्लिकेशन बंद होने और ANR की समस्याओं की जानकारी, वापस उलझे हुए कोड में बदल जाएगी. इसे अभी अपलोड करने के लिए, ऊपर दिए गए निर्देशों का पालन करें. अगर आपने अपने ऐप्लिकेशन के किसी वर्शन के लिए ProGuard मैपिंग फ़ाइल या डीबग सिंबल वाली फ़ाइल अपलोड की है, तो इसके बाद ऐप्लिकेशन बंद होने और ANR की समस्याएं ही डिकोड की जाएंगी. उपयोगकर्ता के डिवाइस से, ऐप्लिकेशन बंद होने और ANR की नई समस्याओं की शिकायत मिलने में कुछ समय लगता है. इसलिए, आपको ऐप्लिकेशन के बंद होने और ANR की डिकोड की गई समस्याएं, Play Console में दिखने में भी कुछ समय लगेगा.
कहीं आप फ़ाइल अपलोड करना भूल न जाएं, इसके लिए अपनी बिल्ड प्रोसेस में बदलाव करें. इससे 'Android Gradle प्लग इन' के 4.1 या उसके बाद वाले वर्शन की मदद से बनाए गए ऐप्लिकेशन बंडल इस्तेमाल किए जा सकेंगे. इस स्थिति में, Android Developers साइट पर दिए गए निर्देशों का पालन करके, ऐप्लिकेशन बंडल में डीबग सिंबल फ़ाइल को अपने-आप शामिल किया जा सकता है.
अपने ऐप्लिकेशन के किसी वर्शन के लिए गलत फ़ाइल अपलोड करने पर, उस वर्शन में ऐप्लिकेशन बंद होने और ANR की समस्याओं की जानकारी वापस उलझे हुए कोड में बदल जाएगी. सही किया गया वर्शन अपलोड करने के लिए:
- Play Console खोलें.
- कोई ऐप्लिकेशन चुनें.
- बाएं मेन्यू में मौजूद,
जांच करें और रिलीज़ करें
> ऐप्लिकेशन बंडल एक्सप्लोरर को चुनें - सबसे ऊपर दाएं कोने में मौजूद पिकर के ज़रिए, ज़रूरी आर्टफ़ैक्ट चुनें.
- डाउनलोड टैब को चुनें और नीचे की ओर स्क्रोल करके "ऐसेट" सेक्शन पर जाएं.
- गलत सिम्बॉलिकेशन फ़ाइल या डिकोड करने वाली गलत फ़ाइल के बगल में, मिटाएं आइकॉन पर क्लिक करें.
- गलत वर्शन को मिटाने के बाद, अपलोड आइकॉन पर क्लिक करें और अपने ऐप्लिकेशन के वर्शन के लिए सही फ़ाइल अपलोड करें.
अपने ऐप्लिकेशन के किसी वर्शन के लिए सही ProGuard मैपिंग फ़ाइल या डीबग सिंबल वाली फ़ाइल अपलोड करने पर, इसके बाद ऐप्लिकेशन बंद होने और ANR की समस्याएं ही डिकोड की जाएंगी. उपयोगकर्ता के डिवाइस से, ऐप्लिकेशन बंद होने और ANR की नई समस्याओं की शिकायत मिलने में कुछ समय लगता है. इसलिए, आपको ऐप्लिकेशन के बंद होने और ANR की डिकोड की गई समस्याएं, Play Console में दिखने में भी कुछ समय लगेगा.
सलाह: कहीं फ़ाइल का गलत वर्शन अपलोड न हो जाए, इसके लिए अपनी बिल्ड प्रोसेस में बदलाव करें. इससे 'Android Gradle प्लग इन' के 4.1 या उसके बाद वाले वर्शन की मदद से बनाए गए ऐप्लिकेशन बंडल इस्तेमाल किए जा सकेंगे. इस स्थिति में, Android Developers साइट पर दिए गए निर्देशों का पालन करके, ऐप्लिकेशन बंडल में डीबग सिंबल फ़ाइल को अपने-आप शामिल किया जा सकता है.
शुरू करने के लिए Android Developers साइट पर जाएं.
हां.
कभी-कभी ऐसा होता है कि सिस्टम को ANR की गड़बड़ी से जुड़ी जानकारी तो मिल जाती है, लेकिन वह स्टैक ट्रेस इकट्ठा नहीं कर पाता. इस इवेंट में, ANR की गड़बड़ी इसलिए दिखती है, ताकि आपको अपने ऐप्लिकेशन की स्थिरता से जुड़ी पूरी जानकारी मिल सके. हालांकि, स्टैक ट्रेस अपने-आप नहीं दिखती. बिना स्टैक ट्रेस वाली ANR की गड़बड़ियों को उनके टाइप और गतिविधि के हिसाब से अलग-अलग ग्रुप में बांटा जाता है, ताकि ANR की मिलती-जुलती गड़बड़ियों की समीक्षा करके उन्हें ठीक किया जा सके. इससे, बिना स्टैक ट्रेस वाली ANR की गड़बड़ियों की संख्या घटाने में मदद मिल सकती है.