Crashlytics डैशबोर्ड में, ANR टैग के आधार पर अपने Android ऐप्लिकेशन को डीबग करने का तरीका

ऐप्लिकेशन काम नहीं कर रहा है (एएनआर) वाली गड़बड़ियां तब ट्रिगर होती हैं, जब ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) थ्रेड पांच सेकंड से ज़्यादा समय तक जवाब नहीं देता है. एएनआर और उनका पता लगाने के बारे में ज़्यादा जानने के लिए, Android का दस्तावेज़ पढ़ें.

इसके अलावा, Crashlytics की मदद से, समस्या वाली थ्रेड का पता लगाया जा सकता है. हम एएनआर का विश्लेषण करते हैं. इसके बाद, DevOps & Engagement > Crashlytics डैशबोर्ड में, हम एएनआर को डीबग करने के बारे में सुझाव देने के लिए, लागू होने वाले थ्रेड को टैग करते हैं.

इस पेज पर दिए गए सेक्शन में, हर एएनआर टैग का मतलब बताया गया है. साथ ही, उस टैग के साथ एएनआर का उदाहरण दिखाया गया है. इसके अलावा, एएनआर को डीबग करने का सुझाया गया तरीका भी बताया गया है.

Triggered ANR

जिस थ्रेड को लंबे समय तक ब्लॉक किया गया था और जिसकी वजह से एएनआर ट्रिगर हुआ था उसे इस Triggered ANR टैग के साथ एनोटेट किया जाता है.

समस्या वाली थ्रेड, ऐप्लिकेशन की मुख्य थ्रेड हो सकती है. इसके अलावा, यह कोई ऐसी थ्रेड भी हो सकती है जो काम नहीं कर रही है. हालांकि, Triggered ANR के तौर पर टैग की गई थ्रेड, एएनआर की असली वजह हो सकती है या नहीं भी हो सकती है. इन एएनआर को डीबग करने और ठीक करने के लिए इनसाइट देने के लिए, Crashlytics एएनआर में शामिल किसी भी अन्य थ्रेड को भी टैग करता है. इस पेज के नीचे दिए गए सेक्शन में, उन अन्य टैग के बारे में जानें जिन्हें किसी थ्रेड पर लागू किया जा सकता है.

Deadlocked

डेडलॉक में शामिल किसी भी थ्रेड की वजह से एएनआर की समस्या होती है. ऐसी थ्रेड को इस Deadlocked टैग से एनोटेट किया जाता है.

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

सुझाव

डेडलॉक में शामिल थ्रेड देखें. साथ ही, उन थ्रेड के ज़रिए हासिल किए गए संसाधन/लॉक देखें. समस्या हल करने के तरीके जानने के लिए, डेडलॉक और डेडलॉक रोकने के एल्गोरिदम लेख पढ़ें.

IO Root blocking

जो थ्रेड धीमी I/O कार्रवाइयां कर रही थी और जिसने Triggered ANR थ्रेड को ब्लॉक किया था उसे IO Root blocking टैग के साथ एनोटेट किया जाता है. अगर Triggered ANR थ्रेड को अन्य थ्रेड ब्लॉक नहीं करती हैं, तो IO Root blocking थ्रेड भी Root blocking थ्रेड होती है.

सुझाव

आम तौर पर, आपके ऐप्लिकेशन को मुख्य थ्रेड पर I/O की महंगी कार्रवाइयां नहीं करनी चाहिए. अगर मुख्य थ्रेड IO Root blocking है, तो स्ट्रिक्ट मोड का इस्तेमाल करके यह पता लगाया जा सकता है कि मुख्य थ्रेड पर अनजाने में कोई I/O कार्रवाई तो नहीं हो रही है.

Root blocking

Triggered ANR के तौर पर टैग की गई थ्रेड को ब्लॉक करने वाली किसी भी थ्रेड को Root blocking टैग से एनोटेट किया जाता है. अगर किसी थ्रेड को Root blocking और Triggered ANR, दोनों के तौर पर टैग किया गया है, तो इसका मतलब है कि कोई दूसरी थ्रेड उस थ्रेड को ब्लॉक नहीं करती है.

अगर कोई Triggered ANR थ्रेड, अन्य थ्रेड के लिए इंतज़ार कर रहा था (ऐसा ट्रांज़िटिव तरीके से हो सकता है), तो वह Root blocking है. किसी थ्रेड के एएनआर की मुख्य वजह होने की कई वजहें हो सकती हैं.

सुझाव

मुख्य थ्रेड में सीपीयू का इस्तेमाल करने वाले काम को कम से कम करें. सीपीयू का ज़्यादा इस्तेमाल करने वाले टास्क पूरे करने के लिए, वर्कर या बैकग्राउंड थ्रेड का इस्तेमाल करें.

मुख्य थ्रेड पर, डेटाबेस से लोड करने जैसे I/O इंटेंसिव काम को कम से कम करें.

Unknown root cause

किसी थ्रेड को Unknown root cause टैग तब किया जाता है, जब उस थ्रेड की वजह से एएनआर की गड़बड़ी हुई हो, लेकिन एएनआर की गड़बड़ी होने के दौरान वह थ्रेड काम नहीं कर रहा हो. Crashlytics के पास मुख्य वजह का पता लगाने के लिए ज़रूरी जानकारी नहीं है. इस एएनआर की कोई साफ़ वजह नहीं है.

सुझाव

ANR की समस्याओं को रोकने के बारे में सामान्य सलाह अपनाएं. उदाहरण के लिए, अपने कोड में उन जगहों की पहचान करें जहां ऐप्लिकेशन की मुख्य थ्रेड पांच सेकंड से ज़्यादा समय तक व्यस्त रह सकती है.

Waiting for binder call

जिस थ्रेड को बाइंडर कॉल का इंतज़ार था और जिसने Triggered ANR थ्रेड को ब्लॉक किया था उसे Waiting for binder call टैग के साथ एनोटेट किया जाता है. अगर Triggered ANR थ्रेड को अन्य थ्रेड ब्लॉक नहीं करती हैं, तो Waiting for binder call थ्रेड भी Root blocking थ्रेड होती है.

सुझाव

बाइंडर कॉल की लेटेन्सी का अनुमान नहीं लगाया जा सकता. इसलिए, बाइंडर कॉल को I/O कार्रवाइयों की तरह इस्तेमाल करें. साथ ही, जब भी हो सके, मुख्य थ्रेड पर इनका इस्तेमाल करने से बचें. बाइंडर कॉल को ट्रिगर करने वाले कोड (इसमें ऐसे प्लैटफ़ॉर्म एपीआई कॉल भी शामिल हैं जिनसे बाइंडर लेन-देन होते हैं) को बैकग्राउंड थ्रेड में ले जाएं. इसके अलावा, अगर मुख्य थ्रेड से कॉल करना ज़रूरी है, तो नतीजों को कैश मेमोरी में सेव करें.