ANR ডিবাগ করুন

আপনার ইউনিটি গেমে ANR সমাধান করা একটি নিয়মতান্ত্রিক প্রক্রিয়া:

চিত্র 1. ইউনিটি গেমগুলিতে ANRগুলি সমাধানের পদক্ষেপগুলি৷

রিপোর্টিং পরিষেবাগুলি একত্রিত করুন

রিপোর্টিং পরিষেবা যেমন Android vitals , Firebase Crashlytics , এবং Backtrace (একটি প্রত্যয়িত ইউনিটি অংশীদার) স্কেলে আপনার গেমের জন্য ত্রুটি লগিং এবং বিশ্লেষণ প্রদান করে৷ ডেভেলপমেন্ট চক্রের প্রথম দিকে আপনার গেমে রিপোর্টিং পরিষেবা SDKগুলিকে একীভূত করুন। আপনার গেমের চাহিদা এবং বাজেটের সাথে কোন রিপোর্টিং পরিষেবাটি সবচেয়ে ভাল ফিট করে তা বিশ্লেষণ করুন।

বিভিন্ন রিপোর্টিং পরিষেবার ANR ক্যাপচার করার বিভিন্ন উপায় রয়েছে। ANR ঠিক করার ক্ষেত্রে আপনার সিদ্ধান্তকে সমর্থন করার জন্য বৈধ ডেটা পাওয়ার সুযোগ বাড়ানোর জন্য একটি দ্বিতীয় রিপোর্টিং পরিষেবা অন্তর্ভুক্ত করুন।

রিপোর্টিং SDKগুলিকে একীভূত করা গেমের কার্যক্ষমতা বা APK আকারকে প্রভাবিত করে না৷

প্রতীক বিশ্লেষণ করুন

আপনার রিপোর্টিং পরিষেবা থেকে রিপোর্ট বিশ্লেষণ করুন এবং স্ট্যাক ট্রেস মানব-পাঠযোগ্য বিন্যাসে আছে কিনা তা পরীক্ষা করুন। আরও তথ্যের জন্য ইউনিটি গেমের জন্য সিম্বলিকেট অ্যান্ড্রয়েড ক্র্যাশ এবং ANR দেখুন।

চিত্র 2. ক্র্যাশলিটিক্স বিল্ড আইডি এবং অনুপস্থিত libil2cpp.so চিহ্ন দেখাচ্ছে।

প্রতীক বিল্ড আইডি কিভাবে চেক করবেন

যদি রিপোর্টিং সিস্টেম অনুপস্থিত বিল্ড আইডি দেখায় কিন্তু বিল্ড চিহ্নগুলি এখনও বিল্ড মেশিন স্টোরেজে বিদ্যমান থাকে, তাহলে চিহ্নগুলির বিল্ড আইডি পরীক্ষা করা এবং তারপরে রিপোর্টিং পরিষেবাতে আপলোড করা সম্ভব৷ অন্যথায়, প্রতীক ফাইল আপলোড করার জন্য একটি নতুন বিল্ড প্রয়োজন।

উইন্ডোজ বা ম্যাকোসে:

  1. আপনার স্ক্রিপ্টিং ব্যাকএন্ডের উপর ভিত্তি করে প্রতীক ফোল্ডারে নেভিগেট করুন ( রেজোলিউশন দেখুন :)
    1. নিম্নলিখিত কমান্ডটি ব্যবহার করুন (উইন্ডোজে, readelf ইউটিলিটি চালানোর জন্য সাইগউইন ব্যবহার করুন)
    2. টেক্সট আউটপুট ফিল্টার করতে গ্রেপ ব্যবহার ঐচ্ছিক
    3. বিল্ড আইডি সন্ধান করুন
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

গেম কোড পরিদর্শন করুন

যখন স্ট্যাক ট্রেস libil2cpp.so লাইব্রেরিতে একটি ফাংশন দেখায়, তখন ত্রুটিটি C# কোডে ঘটে, যা C++ এ রূপান্তরিত হয়। libil2cpp.so লাইব্রেরিতে শুধু আপনার গেম কোডই নয় প্লাগইন এবং প্যাকেজও রয়েছে।

C++ ফাইলের নাম ইউনিটি প্রকল্পে সংজ্ঞায়িত সমাবেশের নাম অনুসরণ করে। অন্যথায়, ফাইলের নামটিতে ডিফল্ট অ্যাসেম্বলি-সি# নাম রয়েছে। উদাহরণস্বরূপ, চিত্র 3 Game.cpp ফাইলের ত্রুটি দেখায় (নীল রঙে হাইলাইট করা), যা অ্যাসেম্বলি সংজ্ঞা ফাইলে সংজ্ঞায়িত নাম। Logger হল C# স্ক্রিপ্টে ক্লাসের নাম (লাল রঙে হাইলাইট করা), তারপরে ফাংশনের নাম (সবুজ রঙে হাইলাইট করা)। অবশেষে IL2CPP কনভার্টার তৈরি করা পুরো নামটি (কমলা রঙে হাইলাইট করা হয়েছে)।

চিত্র 3. ব্যাকট্রেস থেকে প্রজেক্ট কল স্ট্যাক পরীক্ষা করুন।

নিম্নলিখিত কাজ করে আপনার গেম কোড পরিদর্শন করুন:

  • কোনো সন্দেহজনক কোডের জন্য C# প্রকল্পটি পরীক্ষা করুন। সাধারণত, C# আন-হ্যান্ডেল করা ব্যতিক্রমগুলি ANR বা অ্যাপ্লিকেশন ক্র্যাশের কারণ হয় না। তবুও, কোডটি বিভিন্ন পরিস্থিতিতে সঠিকভাবে চলে তা নিশ্চিত করুন। কোডটি তৃতীয় পক্ষের ইঞ্জিন মডিউল ব্যবহার করে কিনা তা পরীক্ষা করে দেখুন এবং সাম্প্রতিক রিলিজ ত্রুটিটি প্রবর্তন করেছে কিনা তা বিশ্লেষণ করুন। এছাড়াও, আপনি সম্প্রতি ইউনিটি আপডেট করেছেন কিনা বা ত্রুটি শুধুমাত্র নির্দিষ্ট ডিভাইসে ঘটছে কিনা তা পর্যালোচনা করুন।
  • একটি Android স্টুডিও প্রকল্প হিসাবে গেম রপ্তানি করুন . আপনার গেমের রূপান্তরিত C# সোর্স কোডে সম্পূর্ণ অ্যাক্সেস সহ, আপনি যে ফাংশনটি ANR ঘটাচ্ছে তা খুঁজে পেতে পারেন। C++ কোডটি আপনার C# কোড থেকে খুব আলাদা দেখায় এবং কোড রূপান্তরে খুব কমই কোনো সমস্যা হয়। আপনি যদি কিছু খুঁজে পান, ইউনিটিতে একটি সমর্থন টিকিট ফাইল করুন।
  • গেমের সোর্স কোডটি পর্যালোচনা করুন এবং নিশ্চিত করুন যে OnApplicationFocus() এবং OnApplicationPause() কলব্যাকগুলিতে চলমান যেকোনো যুক্তি যথাযথভাবে পরিষ্কার করা হয়েছে৷
    • ইউনিটি ইঞ্জিনের কার্যকরী বিরতির সময়সীমা রয়েছে; এই কলব্যাকের অতিরিক্ত কাজের চাপ ANR সৃষ্টি করতে পারে।
    • আপনার ডেটা বিশ্লেষণ উন্নত করতে কোডের অংশগুলিতে লগ বা ব্রেডক্রাম্ব যোগ করুন।
  • গেমের কর্মক্ষমতা তদন্ত করতে ইউনিটি প্রোফাইলার ব্যবহার করুন। ANR-এর কারণ হতে পারে এমন বাধা শনাক্ত করতে সাহায্য করার জন্য আপনার অ্যাপের প্রোফাইল করাও একটি দুর্দান্ত উপায় হতে পারে।
  • প্রধান থ্রেডে দীর্ঘ I/O অপারেশন সনাক্ত করার একটি দুর্দান্ত উপায় হল কঠোর মোড ব্যবহার করা।
  • অ্যান্ড্রয়েড ভাইটালস বা অন্য রিপোর্টিং পরিষেবার ইতিহাস বিশ্লেষণ করুন এবং গেমটির রিলিজ সংস্করণগুলি পরীক্ষা করুন যার জন্য ত্রুটি সবচেয়ে বেশি ঘটছে৷ আপনার সংস্করণ নিয়ন্ত্রণ ইতিহাসে আপনার উৎস কোড পর্যালোচনা করুন এবং রিলিজের মধ্যে কোড পরিবর্তনের তুলনা করুন। আপনি যদি সন্দেহজনক কিছু খুঁজে পান, প্রতিটি পরিবর্তন বা সম্ভাব্য সংশোধনের সাথে পৃথকভাবে পরীক্ষা করুন।
  • সবচেয়ে বেশি ANR প্রাপ্ত ডিভাইস এবং Android সংস্করণগুলির জন্য Google Play ANR রিপোর্টিং ইতিহাস পরীক্ষা করুন৷ যদি ডিভাইস বা সংস্করণগুলি পুরানো হয়ে থাকে, তাহলে সম্ভাবনা রয়েছে যে আপনি সেগুলিকে নিরাপদে উপেক্ষা করতে পারেন যদি তা করা গেমের লাভের উপর প্রভাব না ফেলে। ডেটা সাবধানে অধ্যয়ন করুন কারণ ব্যবহারকারীদের একটি নির্দিষ্ট গোষ্ঠী আর আপনার গেম খেলতে সক্ষম হবে না। আরও তথ্যের জন্য, ডিস্ট্রিবিউশন ড্যাশবোর্ড দেখুন।
  • গেমের সোর্স কোড পর্যালোচনা করে নিশ্চিত করুন যে আপনি এমন কোনো কোড কল করছেন না যা সমস্যার কারণ হতে পারে, উদাহরণস্বরূপ, সঠিকভাবে ব্যবহার না করা হলে ফিনিস ধ্বংসাত্মক হতে পারে। অ্যান্ড্রয়েড ডেভেলপমেন্ট সম্পর্কে আরও জানতে অ্যান্ড্রয়েড ডেভেলপার গাইড দেখুন।
  • ডেটা পর্যালোচনা করার পরে এবং অ্যান্ড্রয়েড স্টুডিওতে গেম বিল্ড রপ্তানি করার পরে, আপনি C এবং C++ কোডের সাথে কাজ করছেন এবং তাই আপনি ইউনিটির স্ট্যান্ডার্ড সমাধানগুলির বাইরে টুলগুলির সম্পূর্ণ সুবিধা নিতে পারেন, যেমন Android মেমরি প্রোফাইলার , Android CPU প্রোফাইলার , এবং perfetto

ইউনিটি ইঞ্জিন কোড

জিনিসগুলির ইউনিটি ইঞ্জিনের দিকে একটি ANR ঘটছে কিনা তা জানতে, স্ট্যাক ট্রেসে libUnity.so বা libMain.so পরীক্ষা করুন৷ আপনি যদি সেগুলি খুঁজে পান তবে নিম্নলিখিত পদক্ষেপগুলি নিন:

  • প্রথমে, সম্প্রদায়ের চ্যানেলগুলি অনুসন্ধান করুন ( ইউনিটি ফোরাম , ইউনিটি আলোচনা , স্ট্যাকওভারফ্লো )।
  • আপনি কিছু খুঁজে না পেলে, সমস্যা সমাধানের জন্য একটি বাগ ফাইল করুন . একটি প্রতীকী স্ট্যাক ট্রেস প্রদান করুন যাতে ইঞ্জিনের প্রকৌশলীরা ত্রুটিটি আরও ভালভাবে বুঝতে এবং সমাধান করতে পারে৷
  • সর্বশেষ ইউনিটি এলটিএস আপনার সমস্যাগুলির সাথে সম্পর্কিত উন্নতি করেছে কিনা তা পরীক্ষা করুন। যদি তাই হয়, সেই সংস্করণটি ব্যবহার করতে আপনার গেম আপগ্রেড করুন৷ (এই সমাধান শুধুমাত্র কিছু বিকাশকারীদের জন্য সম্ভব হতে পারে।)
  • যদি আপনার কোডটি ডিফল্টের পরিবর্তে একটি কাস্টম Activity ব্যবহার করে, তাহলে অ্যাক্টিভিটি কোনো সমস্যা সৃষ্টি করছে না তা নিশ্চিত করতে Java কোড পর্যালোচনা করুন।

তৃতীয় পক্ষের SDK

  • সমস্ত তৃতীয় পক্ষের লাইব্রেরি আপ টু ডেট আছে কিনা এবং Android এর সর্বশেষ সংস্করণের জন্য ক্র্যাশ বা ANR-এর রিপোর্ট নেই কিনা তা পরীক্ষা করুন৷
  • পরবর্তী সংস্করণে কোনো ত্রুটি ইতিমধ্যেই সমাধান করা হয়েছে কিনা বা ইউনিটি বা সম্প্রদায়ের সদস্যদের দ্বারা কোনো সমাধান দেওয়া হয়েছে কিনা তা দেখতে ইউনিটি ফোরামে যান।
  • Google Play ANR রিপোর্ট পর্যালোচনা করুন এবং নিশ্চিত করুন যে ত্রুটিটি Google ইতিমধ্যেই সনাক্ত করেনি৷ Google কিছু ANR সম্পর্কে সচেতন এবং সেগুলি ঠিক করার জন্য সক্রিয়ভাবে কাজ করছে।

সিস্টেম লাইব্রেরি

সিস্টেম লাইব্রেরিগুলি সাধারণত বিকাশকারীর নিয়ন্ত্রণ থেকে অনেক দূরে থাকে, কিন্তু তারা ANR-এর উল্লেখযোগ্য শতাংশের প্রতিনিধিত্ব করে না। লাইব্রেরি ডেভেলপারের সাথে যোগাযোগ করা বা সমস্যাটি সংকুচিত করার জন্য লগ যোগ করার বাইরে, সিস্টেম লাইব্রেরি ANR গুলি সমাধান করা কঠিন।

প্রস্থান কারণ

ApplicationExitInfo হল ANR এর কারণ বোঝার জন্য একটি Android API। আপনার গেম ইউনিটি 6 বা তার পরে ব্যবহার করলে আপনি সরাসরি ApplicationExitInfo কল করতে পারেন। পুরানো ইউনিটি সংস্করণগুলির জন্য, ইউনিটি থেকে ApplicationExitInfo কলগুলি সক্ষম করতে আপনাকে আপনার নিজস্ব প্লাগইন প্রয়োগ করতে হবে৷

Crashlytics এছাড়াও ApplicationExitInfo ব্যবহার করে; যাইহোক, আপনার নিজস্ব বাস্তবায়ন আপনাকে সূক্ষ্ম নিয়ন্ত্রণ দেয় এবং আপনাকে আরও প্রাসঙ্গিক তথ্য অন্তর্ভুক্ত করতে সক্ষম করে।