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

अपने Unity गेम में ANR (ऐप्लिकेशन के काम न करने) की गड़बड़ियों को ठीक करने के लिए, यह तरीका अपनाएं:

पहली इमेज. Unity गेम में ANR (ऐप्लिकेशन के काम न करने) की गड़बड़ियों को ठीक करने का तरीका.

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

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

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

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

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

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

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

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

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

Windows या macOS पर:

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

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

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

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

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

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

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

Unity इंजन कोड

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

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

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

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

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

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

ऐप्लिकेशन बंद होने की वजहें

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

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