عیب‌یابی برنامه Android براساس برچسب‌های ANR در داشبورد Crashlytics

خطاهای «برنامه پاسخ نمی‌دهد» (ANR) زمانی راه‌اندازی می‌شوند که رشته میانای کاربر برنامه برای بیش‌از ۵ ثانیه پاسخ ندهد. می‌توانید در اسناد Android درباره خطاهای ANR و تشخیص خطاهای ANR بیشتر بخوانید.

علاوه‌براین، Crashlytics می‌تواند به شناسایی رشته‌های مشکل‌ساز خاص کمک کند. ما خطاهای ANR را تحلیل می‌کنیم و سپس در داشبورد DevOps و تعامل > Crashlytics، رشته‌های مربوطه را برچسب‌گذاری می‌کنیم تا نکاتی درباره نحوه اشکال‌زدایی خطای ANR ارائه دهیم.

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

Triggered ANR

رشته‌ای که برای مدت طولانی مسدود شده و باعث ایجاد خطای ANR شده است با این برچسب Triggered ANR حاشیه‌نویسی می‌شود.

رشته مشکل‌دار می‌تواند رشته اصلی برنامه یا هر رشته‌ای باشد که پاسخگو نیست. بااین‌حال، رشته‌ای که با برچسب Triggered ANR مشخص شده است ممکن است علت واقعی خطای ANR باشد یا نباشد. برای ارائه اطلاعات آماری برای اشکال‌زدایی و رفع این خطاهای ANR، Crashlytics همچنین هر رشته دیگری را که در خطای ANR دخیل است برچسب‌گذاری می‌کند. در بخش‌های بعدی این صفحه، با برچسب‌های دیگری که می‌توانند به رشته اعمال شوند آشنا شوید.

Deadlocked

هر رشته‌ای که مشخص شود در بن‌بستی که منجر به ANR شده است دخیل بوده است، با این برچسب Deadlocked حاشیه‌نویسی می‌شود.

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

توصیه

رشته‌های درگیر در بن‌بست را بررسی کنید و منابع/قفل‌های به‌دست‌آمده توسط آن رشته‌ها را بررسی کنید. برای راه‌حل‌های احتمالی، به بن‌بست و الگوریتم‌های جلوگیری از بن‌بست مراجعه کنید.

IO Root blocking

هر رشته‌ای که درحال اجرای عملیات ورودی/خروجی کند بوده و رشته Triggered ANR را مسدود کرده است با برچسب IO Root blocking حاشیه‌نویسی می‌شود. اگر رشته Triggered ANR توسط رشته‌های دیگر مسدود نشده باشد، رشته IO Root blocking نیز رشته Root blocking است.

توصیه

به‌طور کلی، برنامه‌تان نباید عملیات ورودی/خروجی پرهزینه را در رشته اصلی اجرا کند. درصورتی‌که رشته اصلی IO Root blocking باشد، می‌توانید از حالت سخت‌گیرانه نیز برای شناسایی عملیات ورودی/خروجی ناخواسته‌ای که در رشته اصلی اتفاق می‌افتد استفاده کنید.

Root blocking

هر رشته‌ای که رشته برچسب‌گذاری‌شده به‌عنوان Triggered ANR را مسدود کرده باشد، با برچسب Root blocking حاشیه‌نویسی می‌شود. اگر رشته‌ای هم با Root blocking و هم با Triggered ANR برچسب‌گذاری شده باشد، رشته دیگری وجود ندارد که آن رشته را مسدود کند.

اگر هر رشته Triggered ANR (شاید به‌صورت متعدی) منتظر رشته‌های دیگر باشد، Root blocking است. دلایل مختلفی می‌تواند وجود داشته باشد که چرا یک رشته علت ریشه‌ای ANR است.

توصیه

کارهای سنگین برای واحد پردازش مرکزی را در رشته اصلی به حداقل برسانید. از رشته‌های کارگر یا پس‌زمینه برای انجام کارهای سنگین CPU استفاده کنید.

کارهای سنگین ورودی/خروجی، مثل بار کردن از پایگاه داده، را در رشته اصلی به حداقل برسانید.

Unknown root cause

رشته‌ای با برچسب Unknown root cause برچسب‌گذاری می‌شود اگر رشته‌ای باشد که خطای ANR را راه‌اندازی کرده است اما هنگام وقوع خطای ANR در فرایند غیرفعال بوده است. Crashlytics اطلاعات کافی برای تعیین علت ریشه‌ای ندارد. دلیل مشخصی برای وقوع این ANR وجود ندارد.

توصیه

توصیه‌های عمومی درباره نحوه جلوگیری از ANR را دنبال کنید. برای مثال، جاهایی را در کدتان شناسایی کنید که رشته اصلی برنامه می‌تواند برای بیش‌از ۵ ثانیه مشغول باشد.

Waiting for binder call

هر رشته‌ای که منتظر فراخوانی binder بوده و رشته Triggered ANR را مسدود کرده است با برچسب Waiting for binder call حاشیه‌نویسی می‌شود. اگر رشته Triggered ANR توسط رشته‌های دیگر مسدود نشده باشد، رشته Waiting for binder call نیز رشته Root blocking است.

توصیه

چون تأخیر فراخوانی binder می‌تواند غیرقابل‌پیش‌بینی باشد، با فراخوانی‌های binder مثل عملیات ورودی/خروجی رفتار کنید و درصورت امکان، آن‌ها را در رشته اصلی انجام ندهید. کدی را که موجب فراخوانی‌های Binder می‌شود (ازجمله فراخوانی‌های میانای برنامه‌سازی کاربردی پلاتفرم که منجر به تراکنش‌های Binder می‌شود) به رشته پس‌زمینه منتقل کنید، یا اگر فراخوانی از رشته اصلی اجتناب‌ناپذیر است، نتایج را ذخیره کنید.