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