ANR की गड़बड़ियों को डीबग करें

अपने Unity गेम में ANR की समस्या हल करने के लिए, यह तरीका अपनाएं:

पहली इमेज. Unity गेम में एएनआर की समस्याओं को हल करने का तरीका.

रिपोर्टिंग सेवाओं को इंटिग्रेट करना

Android की ज़रूरी जानकारी, Firebase Crashlytics, और Backtrace (सर्टिफ़ाइड Unity पार्टनर) जैसी रिपोर्टिंग सेवाएं, आपके गेम के लिए बड़े पैमाने पर गड़बड़ी की लॉगिंग और विश्लेषण की सुविधा देती हैं. डेवलपमेंट साइकल की शुरुआत में ही, रिपोर्टिंग सेवाओं के एसडीके टूल को अपने गेम में इंटिग्रेट करें. विश्लेषण करें कि आपके गेम की ज़रूरतों और बजट के हिसाब से, कौनसी रिपोर्टिंग सेवा सबसे सही है.

रिपोर्टिंग सेवाएं देने वाली अलग-अलग कंपनियों के पास, एएनआर को कैप्चर करने के अलग-अलग तरीके होते हैं. दूसरी रिपोर्टिंग सेवा को शामिल करें, ताकि आपको मान्य डेटा मिल सके. इससे एएनआर ठीक करने के फ़ैसले लेने में मदद मिलेगी.

रिपोर्टिंग एसडीके इंटिग्रेट करने से, गेम की परफ़ॉर्मेंस या APK के साइज़ पर कोई असर नहीं पड़ता.

सिंबल का विश्लेषण करना

रिपोर्टिंग सेवा से मिली रिपोर्ट का विश्लेषण करें. साथ ही, यह देखें कि स्टैक ट्रेस, इंसान के पढ़ने लायक फ़ॉर्मैट में हैं या नहीं. ज़्यादा जानकारी के लिए, Unity गेम के लिए Android क्रैश और एएनआर को सिंबोलाइज करना लेख पढ़ें.

दूसरी इमेज. Crashlytics में बिल्ड आईडी दिख रहा है और libil2cpp.so सिंबल मौजूद नहीं हैं.

सिंबल बिल्ड आईडी देखने का तरीका

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

Windows या macOS पर:

  1. अपने स्क्रिप्टिंग बैकएंड के हिसाब से, सिंबल फ़ोल्डर पर जाएं. इसके लिए, रिज़ॉल्यूशन देखें:
    1. इस निर्देश का इस्तेमाल करें. Windows पर, readelf यूटिलिटी चलाने के लिए Cygwin का इस्तेमाल करें
    2. टेक्स्ट आउटपुट को फ़िल्टर करने के लिए, Grep का इस्तेमाल करना ज़रूरी नहीं है
    3. बिल्ड आईडी ढूंढना
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

गेम कोड की जांच करना

जब स्टैक ट्रेस में libil2cpp.so लाइब्रेरी में मौजूद कोई फ़ंक्शन दिखता है, तो इसका मतलब है कि गड़बड़ी C# कोड में हुई है. इस कोड को C++ में बदल दिया जाता है. libil2cpp.so लाइब्रेरी में, आपके गेम कोड के साथ-साथ प्लगिन और पैकेज भी होते हैं.

C++ फ़ाइल का नाम, Unity प्रोजेक्ट में तय किए गए असेंबली के नाम के हिसाब से होता है. अगर ऐसा नहीं है, तो फ़ाइल का नाम डिफ़ॉल्ट रूप से Assembly-C# होता है. उदाहरण के लिए, तीसरी इमेज में फ़ाइल Game.cpp (नीले रंग में हाइलाइट किया गया) में मौजूद गड़बड़ी दिखाई गई है. यह नाम, असेंबली डेफ़िनिशन फ़ाइल में तय किया गया है. Logger C# स्क्रिप्ट में क्लास का नाम (लाल रंग में हाइलाइट किया गया) है. इसके बाद, फ़ंक्शन का नाम (हरे रंग में हाइलाइट किया गया) है. आखिर में, IL2CPP कन्वर्टर से जनरेट किया गया पूरा नाम (नारंगी रंग में हाइलाइट किया गया) है.

तीसरी इमेज. Backtrace से टेस्ट प्रोजेक्ट कॉल स्टैक.

यहां दिए गए तरीके से, अपने गेम के कोड की जांच करें:

  • C# प्रोजेक्ट में किसी भी संदिग्ध कोड की जांच करें. आम तौर पर, C# के अनहैंडल किए गए अपवादों की वजह से, एएनआर या ऐप्लिकेशन क्रैश नहीं होता. हालांकि, यह पक्का करें कि कोड अलग-अलग स्थितियों में ठीक से काम कर रहा हो. देखें कि कोड में तीसरे पक्ष के इंजन मॉड्यूल का इस्तेमाल तो नहीं किया गया है. साथ ही, यह भी देखें कि हाल ही में रिलीज़ किए गए किसी मॉड्यूल की वजह से तो गड़बड़ी नहीं हुई है. इसके अलावा, यह भी देखें कि आपने हाल ही में Unity को अपडेट किया है या यह गड़बड़ी सिर्फ़ कुछ डिवाइसों पर हो रही है.
  • गेम को Android Studio प्रोजेक्ट के तौर पर एक्सपोर्ट करें. आपके पास गेम के कनवर्ट किए गए C# सोर्स कोड का पूरा ऐक्सेस होता है. इससे आपको उस फ़ंक्शन का पता लगाने में मदद मिलती है जिसकी वजह से एएनआर की समस्या हो रही है. C++ कोड, आपके C# कोड से बहुत अलग दिखता है. साथ ही, कोड कन्वर्ज़न में कभी-कभार ही कोई समस्या आती है. अगर आपको कोई समस्या मिलती है, तो Unity को सहायता टिकट भेजें.
  • गेम के सोर्स कोड की समीक्षा करें. साथ ही, यह पक्का करें कि OnApplicationFocus() और OnApplicationPause() कॉलबैक में चलने वाले लॉजिक को सही तरीके से हटाया गया हो.
    • Unity इंजन में, इसके एक्ज़ीक्यूशन को रोकने के लिए टाइम आउट होता है. इन कॉलबैक पर बहुत ज़्यादा वर्कलोड होने की वजह से, ANR की समस्या हो सकती है.
    • डेटा विश्लेषण को बेहतर बनाने के लिए, कोड के कुछ हिस्सों में लॉग या ब्रेडक्रंब जोड़ें.
  • गेम की परफ़ॉर्मेंस की जांच करने के लिए, Unity Profiler का इस्तेमाल करें. अपने ऐप्लिकेशन की प्रोफ़ाइलिंग करने से, उन रुकावटों का पता लगाने में भी मदद मिल सकती है जिनकी वजह से एएनआर की समस्या हो रही है.
  • मुख्य थ्रेड पर लंबे समय तक चलने वाली I/O कार्रवाइयों की पहचान करने का सबसे अच्छा तरीका है कि स्ट्रिक्ट मोड का इस्तेमाल किया जाए.
  • Android Vitals या रिपोर्टिंग की किसी अन्य सेवा के इतिहास का विश्लेषण करें. साथ ही, गेम के उन रिलीज़ वर्शन की जांच करें जिनमें गड़बड़ी सबसे ज़्यादा हो रही है. अपने वर्शन कंट्रोल के इतिहास में मौजूद सोर्स कोड की समीक्षा करें. साथ ही, रिलीज़ के बीच कोड में हुए बदलावों की तुलना करें. अगर आपको कुछ संदिग्ध लगता है, तो हर बदलाव या संभावित समाधान को अलग-अलग आज़माएं.
  • उन डिवाइसों और Android वर्शन के लिए, Google Play पर ANR रिपोर्टिंग का इतिहास देखें जिन पर सबसे ज़्यादा ANR मिले हैं. अगर डिवाइस या वर्शन पुराने हैं, तो हो सकता है कि उन्हें नज़रअंदाज़ करने से गेम के मुनाफ़े पर कोई असर न पड़े. ऐसे में, उन्हें नज़रअंदाज़ किया जा सकता है. डेटा को ध्यान से देखें, क्योंकि उपयोगकर्ताओं का कोई ग्रुप अब आपका गेम नहीं खेल पाएगा. ज़्यादा जानकारी के लिए, वितरण डैशबोर्ड देखें.
  • गेम के सोर्स कोड की समीक्षा करें. इससे यह पक्का किया जा सकेगा कि आपने ऐसा कोई कोड कॉल नहीं किया है जिसकी वजह से समस्या हो सकती है. उदाहरण के लिए, finish का इस्तेमाल सही तरीके से न करने पर, समस्या हो सकती है. Android डेवलपमेंट के बारे में ज़्यादा जानने के लिए, Android डेवलपर गाइड देखें.
  • डेटा की समीक्षा करने और गेम बिल्ड को Android Studio में एक्सपोर्ट करने के बाद, आपको C और C++ कोड का इस्तेमाल करना होगा. इसलिए, Unity के स्टैंडर्ड समाधानों के अलावा, अन्य टूल का पूरा फ़ायदा लिया जा सकता है. जैसे, Android Memory Profiler, Android CPU Profiler, और perfetto.

Unity इंजन कोड

यह जानने के लिए कि Unity इंजन की वजह से ANR हो रहा है या नहीं, स्टैक ट्रेस में libUnity.so या libMain.so देखें. अगर आपको ये कुकी मिलती हैं, तो यह तरीका अपनाएं:

  • सबसे पहले, कम्यूनिटी चैनलों (Unity फ़ोरम, Unity Discussions, Stackoverflow) पर खोजें.
  • अगर आपको कुछ भी नहीं मिलता है, तो समस्या हल करने के लिए बग की शिकायत करें. सिंबोलाइज्ड स्टैक ट्रेस उपलब्ध कराएं, ताकि इंजन के इंजीनियर गड़बड़ी को बेहतर तरीके से समझ सकें और उसे ठीक कर सकें.
  • देखें कि क्या Unity LTS के नए वर्शन में, आपकी समस्याओं से जुड़े सुधार किए गए हैं. अगर ऐसा है, तो उस वर्शन का इस्तेमाल करने के लिए, अपने गेम को अपग्रेड करें. (यह समाधान सिर्फ़ कुछ डेवलपर के लिए उपलब्ध हो सकता है.)
  • अगर आपके कोड में डिफ़ॉल्ट Activity के बजाय कस्टम Activity का इस्तेमाल किया जाता है, तो Java कोड की समीक्षा करें. इससे यह पक्का किया जा सकेगा कि गतिविधि से कोई समस्या नहीं हो रही है.

तीसरे पक्ष का एसडीके टूल

  • देखें कि सभी तीसरे पक्ष की लाइब्रेरी अप-टू-डेट हों. साथ ही, Android के नए वर्शन के लिए, उनमें क्रैश या एएनआर की कोई रिपोर्ट न हो.
  • Unity फ़ोरम पर जाएं. देखें कि क्या बाद के किसी वर्शन में, गड़बड़ियों को पहले ही ठीक कर दिया गया है या Unity या कम्यूनिटी के किसी सदस्य ने कोई समाधान उपलब्ध कराया है.
  • Google Play की एएनआर रिपोर्ट देखें और पक्का करें कि Google ने पहले से ही गड़बड़ी की पहचान न कर ली हो. Google को कुछ एएनआर के बारे में पता है और वह उन्हें ठीक करने के लिए लगातार काम कर रहा है.

सिस्टम लाइब्रेरी

आम तौर पर, सिस्टम लाइब्रेरी को डेवलपर कंट्रोल नहीं कर सकता. हालांकि, ये एएनआर का ज़्यादा हिस्सा नहीं होती हैं. सिस्टम लाइब्रेरी के एएनआर को ठीक करना मुश्किल होता है. इसके लिए, लाइब्रेरी के डेवलपर से संपर्क करना या समस्या को कम करने के लिए लॉग जोड़ना होता है.

छोड़ने की वजहें

ApplicationExitInfo, Android का एक एपीआई है. इससे ANR की वजहों को समझने में मदद मिलती है. अगर आपका गेम Unity 6 या इसके बाद के वर्शन का इस्तेमाल कर रहा है, तो ApplicationExitInfo को सीधे कॉल किया जा सकता है. Unity के पुराने वर्शन के लिए, आपको अपना प्लगिन लागू करना होगा, ताकि Unity से ApplicationExitInfo कॉल किए जा सकें.

Crashlytics भी ApplicationExitInfo का इस्तेमाल करता है. हालांकि, खुद के लागू किए गए ApplicationExitInfo से आपको ज़्यादा कंट्रोल मिलता है. साथ ही, ज़्यादा काम की जानकारी शामिल करने की सुविधा मिलती है.