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

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

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

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

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

अलग-अलग रिपोर्टिंग सेवाओं में, ANRs की जानकारी कैप्चर करने के अलग-अलग तरीके होते हैं. शामिल करें के लिए मान्य डेटा हासिल करने की संभावना बढ़ाने के लिए, ANR की गड़बड़ियों को ठीक करने के फ़ैसले में मदद करें.

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

प्रतीकों का विश्लेषण करें

रिपोर्टिंग सेवा की रिपोर्ट का विश्लेषण करें और जांच करें क्या स्टैक ट्रेस ऐसे फ़ॉर्मैट में हैं जिसे कोई भी व्यक्ति आसानी से पढ़ सकता है. सिम्बॉलिकेट Android Unity गेम के लिए क्रैश और ANR वाली गड़बड़ियों की जानकारी देखें.

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

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

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

Windows या macOS पर:

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

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

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

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

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

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

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

Unity इंजन कोड

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

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

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

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

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

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

बाहर निकलने की वजहें

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

Crashlytics, ApplicationExitInfo का भी इस्तेमाल करता है; हालांकि, आपके अपने लागू करने पर आपको ज़्यादा बेहतर कंट्रोल मिलता है. साथ ही, आपको ज़्यादा काम की जानकारी.