ניפוי באגים באפליקציה ל-Android על סמך תגי ANR במרכז הבקרה של Crashlytics

שגיאות מסוג 'האפליקציה לא מגיבה (ANR)' מופעלות כששרשור ה-UI של האפליקציה לא מגיב במשך יותר מ-5 שניות. מידע נוסף על מקרי ANR ועל אבחון שלהם זמין במאמרי העזרה של Android.

בנוסף, Crashlytics יכול לעזור לזהות שרשורים ספציפיים שבהם יש בעיות. אנחנו מנתחים שגיאות ANR, ואז בלוח הבקרה DevOps & Engagement > Crashlytics, אנחנו מתייגים את ה-Threads הרלוונטיים כדי לספק רמזים לגבי ניפוי הבאגים של שגיאות ה-ANR.

בקטעים הבאים בדף הזה מוסבר מה המשמעות של כל תג ANR, מוצגות דוגמאות ל-ANR עם התג הזה ומוצע פתרון מומלץ לניפוי באגים של ה-ANR.

Triggered ANR

‫Thread שנחסם למשך זמן ארוך מדי והפעיל את ה-ANR מסומן בתג Triggered ANR.

השרשור הבעייתי יכול להיות השרשור הראשי של האפליקציה, או כל שרשור שלא מגיב. עם זאת, יכול להיות שהשרשור שתויג כ-Triggered ANR הוא הסיבה האמיתית ל-ANR, ויכול להיות שלא. כדי לספק תובנות לניפוי באגים ולתיקון של שגיאות ANR,‏ Crashlytics מתייג גם את כל השרשורים האחרים שקשורים לשגיאת ה-ANR. בקטעים הבאים בדף הזה מוסבר על תגים אחרים שאפשר להוסיף לשרשור.

Deadlocked

כל השרשורים שנמצאו כמעורבים בקיפאון (deadlock) שהוביל ל-ANR מסומנים בתג Deadlocked.

מבוי סתום מתרחש כש-thread נכנס למצב המתנה כי משאב נדרש מוחזק על ידי thread אחר, שגם הוא נמצא בהמתנה למשאב שמוחזק על ידי ה-thread הראשון. אם ה-thread הראשי של האפליקציה נמצא במצב הזה, סביר להניח שיוצגו שגיאות ANR.

המלצה

בודקים את השרשורים שמעורבים במבוי סתום ואת המשאבים או הנעילות שהשרשורים האלה קיבלו. כדי לראות פתרונות אפשריים, כדאי לעיין במאמרים בנושא קיפאון ואלגוריתמים למניעת קיפאון.

IO Root blocking

כל thread שביצע פעולות קלט/פלט (I/O) איטיות וחסימה של ה-thread‏ Triggered ANR מסומן בתג IO Root blocking. אם ה-thread‏ Triggered ANR לא נחסם על ידי threads אחרים, אז ה-thread‏ IO Root blocking הוא גם thread‏ Root blocking.

המלצה

באופן כללי, האפליקציה לא צריכה לבצע פעולות קלט/פלט יקרות ב-thread הראשי. אם ה-thread הראשי הוא IO Root blocking, אפשר גם להשתמש במצב קפדני כדי לזהות פעולות קלט/פלט לא מכוונות שמתבצעות ב-thread הראשי.

Root blocking

כל שרשור שחסם את השרשור שתויג כ-Triggered ANR יתויג בתג Root blocking. אם שרשור מסומן בתגיות Root blocking וגם Triggered ANR, סימן שלא קיימים שרשורים אחרים שחוסמים את השרשור הזה.

אם יש threads של Triggered ANR בהמתנה (אולי באופן טרנזיטיבי) ל-threads אחרים, הם Root blocking. יכולות להיות סיבות שונות לכך ששרשור מסוים הוא הגורם העיקרי ל-ANR.

המלצה

צריך לצמצם את העבודה שדורשת הרבה משאבי מעבד ב-thread הראשי. משתמשים ב-worker או בשרשורים ברקע כדי לבצע משימות שדורשות הרבה משאבי CPU.

כדאי לצמצם את העבודה שדורשת הרבה קלט/פלט, כמו טעינה ממסד נתונים, ב-thread הראשי.

Unknown root cause

שרשור מתויג בתג Unknown root cause אם הוא השרשור שהפעיל את ה-ANR אבל היה במצב המתנה בתהליך כשהתרחש ה-ANR. ל-Crashlytics אין מספיק מידע כדי לקבוע את שורש הבעיה. לא ברור למה ה-ANR הזה קרה.

המלצה

חשוב לפעול לפי העצות הכלליות בנושא מניעת ANR. לדוגמה, אפשר לזהות את המקומות בקוד שבהם השרשור הראשי של האפליקציה יכול להיות עמוס במשך יותר מ-5 שניות.

Waiting for binder call

כל שרשור שהמתין לקריאה של קובץ מאגד וחסימה של השרשור Triggered ANR מסומן בתג Waiting for binder call. אם ה-thread‏ Triggered ANR לא נחסם על ידי threads אחרים, אז ה-thread‏ Waiting for binder call הוא גם thread‏ Root blocking.

המלצה

ההשהיה של הפעלת Binder יכולה להיות בלתי צפויה, ולכן צריך להתייחס להפעלות של Binder כמו לפעולות קלט/פלט (I/O), ולהימנע ככל האפשר מהפעלות של Binder ב-thread הראשי. צריך להעביר ל-thread ברקע את הקוד שגורם להפעלות של Binder (כולל קריאות ל-Platform API שגורמות לעסקאות של Binder), או לשמור את התוצאות במטמון אם אי אפשר להימנע מקריאה מה-thread הראשי.