اشکال زدایی ANR

حل ANR در بازی Unity شما یک فرآیند سیستماتیک است:

شکل 1. مراحل حل ANR در بازی های Unity.

خدمات گزارش دهی را یکپارچه کنید

خدمات گزارش دهی مانند Android vitals ، Firebase Crashlytics ، و Backtrace (یک شریک تایید شده Unity) ثبت خطا و تجزیه و تحلیل خطا را برای بازی شما در مقیاس ارائه می کنند. SDK های خدمات گزارش دهی را در اوایل چرخه توسعه در بازی خود ادغام کنید. تجزیه و تحلیل کنید که کدام سرویس گزارش بهترین با نیازها و بودجه بازی شما مطابقت دارد.

سرویس‌های گزارش‌گیری مختلف روش‌های متفاوتی برای گرفتن ANR دارند. یک سرویس گزارش دوم را برای افزایش شانس به دست آوردن داده های معتبر برای حمایت از تصمیم شما در رفع ANR اضافه کنید.

یکپارچه سازی SDK های گزارش بر عملکرد بازی یا اندازه APK تأثیر نمی گذارد.

نمادها را تجزیه و تحلیل کنید

گزارش‌های سرویس گزارش‌دهی خود را تجزیه و تحلیل کنید و بررسی کنید که آیا ردیابی‌های پشته در قالب قابل خواندن توسط انسان هستند یا خیر. برای اطلاعات بیشتر به بازی های Symbolicate Android و ANR for Unity مراجعه کنید.

شکل 2. Crashlytics که شناسه ساخت و نمادهای libil2cpp.so از دست رفته را نشان می دهد.

چگونه شناسه ساخت نماد را بررسی کنیم

اگر سیستم گزارش‌دهی شناسه ساخت گمشده را نشان می‌دهد اما نمادهای ساخت همچنان در ذخیره‌سازی ماشین ساخت وجود دارند، می‌توان شناسه ساخت نمادها را بررسی کرد و سپس آنها را در سرویس گزارش آپلود کرد. در غیر این صورت، برای آپلود فایل های نماد نیاز به ساخت جدید است.

در ویندوز یا macOS:

  1. به پوشه نمادها بر اساس باطن اسکریپت خود بروید (به Resolution مراجعه کنید :)
    1. از دستور زیر استفاده کنید (در ویندوز، از Cygwin برای اجرای برنامه readelf استفاده کنید)
    2. استفاده از Grep برای فیلتر کردن خروجی متن اختیاری است
    3. به دنبال Build ID باشید
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

کد بازی را بررسی کنید

وقتی stack trace تابعی را در کتابخانه libil2cpp.so نشان می‌دهد، این خطا در کد C# رخ می‌دهد که به C++ تبدیل می‌شود . کتابخانه libil2cpp.so نه تنها کد بازی شما، بلکه افزونه ها و بسته ها را نیز دارد.

نام فایل C++ از نام اسمبلی تعریف شده در پروژه Unity پیروی می کند. در غیر این صورت، نام فایل دارای نام پیش فرض Assembly-C# است. به عنوان مثال، شکل 3 خطای فایل Game.cpp را نشان می دهد (که با رنگ آبی مشخص شده است) که نام تعریف شده در فایل Assembly Definition است. Logger نام کلاس است (با رنگ قرمز برجسته شده) در اسکریپت C# و به دنبال آن نام تابع (با رنگ سبز برجسته شده است). در نهایت نام کاملی است که مبدل IL2CPP ایجاد کرده است (به رنگ نارنجی برجسته شده است).

شکل 3. پشته تماس پروژه را از Backtrace آزمایش کنید.

کد بازی خود را با انجام موارد زیر بررسی کنید:

  • پروژه C# را برای هر کد مشکوک بررسی کنید. معمولاً استثناهای کنترل نشده C# باعث ANR یا خرابی برنامه نمی شوند. با این حال، مطمئن شوید که کد در موقعیت های مختلف به درستی اجرا می شود. بررسی کنید که آیا کد از ماژول موتور شخص ثالث استفاده می کند یا خیر، و بررسی کنید که آیا نسخه اخیر این خطا را ایجاد کرده است یا خیر. علاوه بر این، بررسی کنید که آیا اخیرا یونیتی را به‌روزرسانی کرده‌اید یا اینکه خطا فقط در دستگاه‌های خاصی رخ می‌دهد.
  • بازی را به عنوان یک پروژه اندروید استودیو صادر کنید . با دسترسی کامل به کد منبع C# تبدیل شده بازی خود، می توانید عملکردی را که باعث ANR شده است، پیدا کنید. کد ++C با کد سی شارپ شما بسیار متفاوت به نظر می رسد، و تبدیل کد به ندرت مشکل دارد. اگر چیزی پیدا کردید، یک تیکت پشتیبانی به Unity ارسال کنید.
  • کد منبع بازی را مرور کنید و مطمئن شوید که هر منطقی که در فراخوان‌های OnApplicationFocus() و OnApplicationPause() اجرا می‌شود، به درستی پاک شده است.
    • موتور یونیتی برای توقف اجرای خود یک بازه زمانی دارد. بار کاری بیش از حد در این تماس ها می تواند باعث ANR شود.
    • گزارش ها یا خرده نان را به بخش هایی از کد اضافه کنید تا تجزیه و تحلیل داده های خود را بهبود ببخشید.
  • از Unity Profiler برای بررسی عملکرد بازی استفاده کنید. نمایه کردن برنامه شما همچنین می تواند راهی عالی برای کمک به شناسایی تنگناهایی باشد که ممکن است باعث ANR شوند.
  • یک راه عالی برای شناسایی عملیات I/O طولانی در رشته اصلی استفاده از حالت سخت است.
  • Android Vitals یا سابقه خدمات گزارش دهی دیگر را تجزیه و تحلیل کنید و نسخه های منتشر شده بازی را که خطا برای آنها بیشتر اتفاق می افتد بررسی کنید. کد منبع خود را در تاریخچه کنترل نسخه خود مرور کنید و تغییرات کد را بین نسخه ها مقایسه کنید. اگر چیزی مشکوک پیدا کردید، هر تغییر یا اصلاح احتمالی را به صورت جداگانه آزمایش کنید.
  • سابقه گزارش ANR Google Play را برای دستگاه‌ها و نسخه‌های Android دریافت‌کننده بیشترین ANR بررسی کنید. اگر دستگاه‌ها یا نسخه‌ها قدیمی هستند، اگر این کار بر سودآوری بازی تأثیری نمی‌گذارد، احتمالاً می‌توانید با خیال راحت آنها را نادیده بگیرید. داده ها را با دقت مطالعه کنید زیرا گروه خاصی از کاربران دیگر نمی توانند بازی شما را انجام دهند. برای اطلاعات بیشتر، به داشبورد توزیع مراجعه کنید.
  • کد منبع بازی را مرور کنید تا مطمئن شوید که هیچ کدی را که ممکن است باعث مشکل شود تماس نمی‌گیرید، برای مثال، اگر به درستی استفاده نشود، پایان می‌تواند مخرب باشد. برای کسب اطلاعات بیشتر در مورد توسعه Android، به راهنمای توسعه دهندگان Android مراجعه کنید.
  • پس از بررسی داده‌ها و صادرات بیلد بازی به اندروید استودیو، با کدهای C و C++ سر و کار دارید و بنابراین می‌توانید از ابزارهایی فراتر از راه‌حل‌های استاندارد Unity مانند Android Memory Profiler ، Android CPU Profiler و perfetto بهره‌مند شوید.

کد موتور یونیتی

برای اینکه بدانید آیا یک ANR در سمت موتور Unity اتفاق می‌افتد، libUnity.so یا libMain.so را در stack traces بررسی کنید. اگر آنها را پیدا کردید، مراحل زیر را انجام دهید:

  • ابتدا کانال های انجمن را جستجو کنید ( تالارهای گفتمان وحدت ، بحث های وحدت ، Stackoverflow ).
  • اگر چیزی پیدا نکردید، برای رفع مشکل ، باگ را ثبت کنید . یک ردیابی پشته نمادین ارائه دهید تا مهندسان موتور بهتر بتوانند خطا را درک کرده و آن را حل کنند.
  • بررسی کنید که آیا آخرین نسخه Unity LTS بهبودهایی در رابطه با مشکلات شما ایجاد کرده است یا خیر. اگر چنین است، بازی خود را برای استفاده از آن نسخه ارتقا دهید. (این راه حل ممکن است فقط برای برخی از توسعه دهندگان امکان پذیر باشد.)
  • اگر کد شما به‌جای پیش‌فرض از یک Activity سفارشی استفاده می‌کند، کد جاوا را بررسی کنید تا مطمئن شوید که فعالیت مشکلی ایجاد نمی‌کند.

SDK شخص ثالث

  • بررسی کنید که همه کتابخانه‌های شخص ثالث به‌روز باشند و گزارشی از خرابی یا ANR برای آخرین نسخه Android نداشته باشند.
  • به انجمن Unity بروید تا ببینید آیا هر گونه خطایی قبلاً در نسخه بعدی برطرف شده است یا راه حلی توسط Unity یا یکی از اعضای انجمن ارائه شده است.
  • گزارش Google Play ANR را مرور کنید و مطمئن شوید که خطا قبلاً توسط Google شناسایی نشده است. Google از برخی ANR ها آگاه است و به طور فعال برای رفع آنها کار می کند.

کتابخانه سیستم

کتابخانه‌های سیستم معمولاً از کنترل توسعه‌دهنده دور هستند، اما درصد قابل توجهی از ANR را نشان نمی‌دهند. فراتر از تماس با توسعه‌دهنده کتابخانه یا اضافه کردن گزارش‌ها برای محدود کردن مشکل، حل کردن ANR کتابخانه سیستم دشوار است.

دلایل خروج

ApplicationExitInfo یک API Android برای درک علل ANR است. اگر بازی شما از Unity 6 یا بالاتر استفاده می کند، می توانید مستقیماً با ApplicationExitInfo تماس بگیرید. برای نسخه‌های قدیمی‌تر Unity، باید افزونه خود را پیاده‌سازی کنید تا تماس‌های ApplicationExitInfo از Unity فعال شود.

Crashlytics همچنین از ApplicationExitInfo استفاده می کند. با این حال، پیاده‌سازی خودتان به شما کنترل دقیق‌تری می‌دهد و شما را قادر می‌سازد اطلاعات مرتبط‌تری را درج کنید.