अपने Unity गेम में ANR को ठीक करने की प्रोसेस व्यवस्थित होती है:

रिपोर्टिंग सेवाओं को इंटिग्रेट करना
Android की ज़रूरी जानकारी, Firebase Crashlytics, और Backtrace (Unity का सर्टिफ़ाइड पार्टनर) जैसी रिपोर्टिंग सेवाएं, आपके गेम के लिए बड़े पैमाने पर गड़बड़ी की जानकारी लॉग करती हैं और उसका विश्लेषण करती हैं. डेवलपमेंट साइकल की शुरुआत में ही, अपने गेम में रिपोर्टिंग सेवाओं के एसडीके टूल इंटिग्रेट करें. विश्लेषण करें कि आपके गेम की ज़रूरतों और बजट के हिसाब से, कौनसी रिपोर्टिंग सेवा सबसे सही है.
अलग-अलग रिपोर्टिंग सेवाओं में, ANR को कैप्चर करने के अलग-अलग तरीके होते हैं. एएनआर ठीक करने के लिए, सही डेटा पाने की संभावना बढ़ाने के लिए, एक दूसरी रिपोर्टिंग सेवा शामिल करें.
रिपोर्टिंग एसडीके टूल इंटिग्रेट करने से, गेम की परफ़ॉर्मेंस या APK के साइज़ पर कोई असर नहीं पड़ता.
सिंबल का विश्लेषण करना
अपनी रिपोर्टिंग सेवा की रिपोर्ट का विश्लेषण करें और देखें कि स्टैक ट्रेस, ऐसे फ़ॉर्मैट में हैं या नहीं जिन्हें कोई भी व्यक्ति पढ़ सकता है. ज़्यादा जानकारी के लिए, Unity गेम के लिए Android क्रैश और ANR को सिम्बॉलाइज़ करना लेख पढ़ें.

libil2cpp.so
सिंबल मौजूद नहीं हैं.सिंबल बिल्ड आईडी की जांच कैसे करें
अगर रिपोर्टिंग सिस्टम में, बिल्ड आईडी मौजूद नहीं है, लेकिन बिल्ड मशीन के स्टोरेज में बिल्ड सिंबल अब भी मौजूद हैं, तो सिंबल का बिल्ड आईडी देखा जा सकता है. इसके बाद, उन्हें रिपोर्टिंग सेवा में अपलोड किया जा सकता है. ऐसा न करने पर, सिंबल फ़ाइलों को अपलोड करने के लिए, एक नया बिल्ड ज़रूरी है.
Windows या macOS पर:
- अपनी स्क्रिप्टिंग के बैकएंड के आधार पर, सिंबल फ़ोल्डर पर जाएं (समाधान देखें:)
- नीचे दिए गए निर्देश का इस्तेमाल करें (
readelf
टूल को चलाने के लिए, Windows पर Cygwin का इस्तेमाल करें) - टेक्स्ट आउटपुट को फ़िल्टर करने के लिए, Grep का इस्तेमाल करना ज़रूरी नहीं है
- बिल्ड आईडी देखना
- नीचे दिए गए निर्देश का इस्तेमाल करें (
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 कन्वर्टर से जनरेट किया गया पूरा नाम (नारंगी रंग में हाइलाइट किया गया).

अपने गेम कोड की जांच करने के लिए, यह तरीका अपनाएं:
- C# प्रोजेक्ट में किसी भी तरह के संदिग्ध कोड की जांच करें. आम तौर पर, C# के ऐसे अपवाद जिन पर ध्यान नहीं दिया जाता है उनकी वजह से, ऐप्लिकेशन क्रैश नहीं होता या ANR नहीं होता. इसके बावजूद, पक्का करें कि कोड अलग-अलग स्थितियों में सही तरीके से काम करे. देखें कि कोड में तीसरे पक्ष के इंजन मॉड्यूल का इस्तेमाल किया गया है या नहीं. साथ ही, यह भी देखें कि हाल ही में रिलीज़ किए गए वर्शन की वजह से गड़बड़ी हुई है या नहीं. इसके अलावा, देखें कि आपने हाल ही में Unity को अपडेट किया है या नहीं. इसके अलावा, यह भी देखें कि गड़बड़ी सिर्फ़ कुछ डिवाइसों पर होती है या नहीं.
- गेम को Android Studio प्रोजेक्ट के तौर पर एक्सपोर्ट करें. अपने गेम के बदले गए C# सोर्स कोड का पूरा ऐक्सेस होने पर, उस फ़ंक्शन को ढूंढा जा सकता है जिसकी वजह से ANR हो रहा है. 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 मेमोरी प्रोफ़ाइलर, Android सीपीयू प्रोफ़ाइलर, और perfetto जैसे टूल का पूरा फ़ायदा लिया जा सकता है.
Unity इंजन कोड
यह जानने के लिए कि Unity इंजन में ANR हो रहा है या नहीं, स्टैक ट्रेस में libUnity.so
या libMain.so
देखें. अगर आपको वे प्रॉडक्ट मिलते हैं, तो यह तरीका अपनाएं:
- सबसे पहले, कम्यूनिटी चैनल (Unity फ़ोरम, Unity के डिस्कस पैनल, Stackoverflow) खोजें.
- अगर आपको कुछ नहीं मिलता है, तो समस्या को हल करने के लिए बग की शिकायत करें. सिंबल वाले स्टैक ट्रेस की जानकारी दें, ताकि इंजन के इंजीनियर, गड़बड़ी को बेहतर तरीके से समझ सकें और उसे ठीक कर सकें.
- देखें कि Unity के सबसे नए LTS वर्शन में, आपकी समस्याओं से जुड़े सुधार किए गए हैं या नहीं. अगर ऐसा है, तो उस वर्शन का इस्तेमाल करने के लिए, अपने गेम को अपग्रेड करें. (यह तरीका सिर्फ़ कुछ डेवलपर के लिए उपलब्ध हो सकता है.)
- अगर आपका कोड डिफ़ॉल्ट के बजाय कस्टम
Activity
का इस्तेमाल करता है, तो Java कोड की समीक्षा करके पक्का करें कि गतिविधि से कोई समस्या न हो रही हो.
तीसरे पक्ष का SDK टूल
- देखें कि तीसरे पक्ष की सभी लाइब्रेरी अप-टू-डेट हों और Android के नए वर्शन के लिए, क्रैश या ANR की कोई रिपोर्ट न हो.
- Unity फ़ोरम पर जाकर देखें कि क्या किसी नई गड़बड़ी को पहले ही ठीक कर दिया गया है या Unity या कम्यूनिटी के किसी सदस्य ने कोई समाधान दिया है.
- Google Play की एएनआर रिपोर्ट देखें और पक्का करें कि Google ने पहले ही गड़बड़ी की पहचान कर ली हो. Google को कुछ ANR के बारे में पता है और वह इन्हें ठीक करने के लिए लगातार काम कर रहा है.
सिस्टम लाइब्रेरी
आम तौर पर, सिस्टम लाइब्रेरी को डेवलपर कंट्रोल नहीं कर सकता. हालांकि, इनसे होने वाले ANR का प्रतिशत बहुत कम होता है. लाइब्रेरी के डेवलपर से संपर्क करने या समस्या को कम करने के लिए लॉग जोड़ने के अलावा, सिस्टम लाइब्रेरी के एएनआर को हल करना मुश्किल होता है.
बाहर निकलने की वजहें
ApplicationExitInfo
, ANR की वजहों को समझने के लिए Android एपीआई है.
अगर आपका गेम Unity 6 या इसके बाद के वर्शन का इस्तेमाल कर रहा है, तो ApplicationExitInfo
को सीधे तौर पर कॉल किया जा सकता है. Unity के पुराने वर्शन के लिए, आपको अपना प्लगिन लागू करना होगा, ताकि Unity से ApplicationExitInfo
कॉल करने की सुविधा चालू की जा सके.
Crashlytics भी ApplicationExitInfo
का इस्तेमाल करता है. हालांकि, इसे खुद लागू करने पर, आपको बेहतर कंट्रोल मिलता है और ज़्यादा काम की जानकारी शामिल की जा सकती है.