התאמה אישית של דוחות קריסה ב-Flutter

בחירת פלטפורמה: ‫iOS+‎ Android Flutter Unity


אפשר ללחוץ על בעיה כדי לראות דוח מפורט על האירוע בלוח הבקרה DevOps & Engagement (פיתוח אפליקציות ואינטראקציות) > Crashlytics במסוף Firebase. אתם יכולים להתאים אישית את הדוחות האלה כדי להבין טוב יותר מה קורה באפליקציה ואת הנסיבות שקשורות לאירועים שמדווחים ל-Crashlytics.

דיווח על חריגים

דיווח על חריגים שלא זוהו

כדי לתפוס באופן אוטומטי את כל השגיאות הקריטיות שמוחזרות במסגרת Flutter, צריך להחליף את FlutterError.onError ב-FirebaseCrashlytics.instance.recordFlutterFatalError. לחלופין, כדי לזהות גם חריגים מסוג לא קריטית, מחליפים את FlutterError.onError ב-FirebaseCrashlytics.instance.recordFlutterError:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  bool weWantFatalErrorRecording = true;
  FlutterError.onError = (errorDetails) {
    if(weWantFatalErrorRecording){
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    } else {
      FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
    }
  };

  runApp(MyApp());
}

שגיאות אסינכרוניות

שגיאות אסינכרוניות לא נתפסות על ידי מסגרת Flutter:

ElevatedButton(
  onPressed: () async {
    throw Error();
  }
  ...
)

כדי לזהות שגיאות כאלה, אפשר להשתמש ב-handler‏ PlatformDispatcher.instance.onError:

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

שגיאות מחוץ ל-Flutter

כדי לזהות שגיאות שמתרחשות מחוץ להקשר של Flutter, מתקינים מאזין שגיאות ב-Isolate הנוכחי:

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

דיווח על חריגים שזוהו

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

משתמשים בשיטה recordError כדי לתעד חריגים לא קריטיים בבלוקים של catch באפליקציה. לדוגמה:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);

אפשר גם לרשום ביומן מידע נוסף על השגיאה באמצעות המאפיין information:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);

החריגים האלה מופיעים כבעיות לא קריטיות בלוח הבקרה Crashlytics של Firebase במסוף DevOps & Engagement. סיכום הבעיה מכיל את כל פרטי המצב שמתקבלים בדרך כלל מקריסות, וגם פירוט לפי גרסה ומכשיר חומרה.

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

הוספת מפתחות בהתאמה אישית

מפתחות בהתאמה אישית עוזרים לכם לקבל את המצב הספציפי של האפליקציה לפני הקריסה. אתם יכולים לשייך צמדים שרירותיים של מפתח וערך לדוחות הקריסה, ואז להשתמש במפתחות המותאמים אישית כדי לחפש ולסנן דוחות קריסה בלוח הבקרה DevOps & Engagement > Crashlytics במסוף Firebase.

  • במרכז הבקרה, אפשר לחפש בעיות שתואמות למפתח בהתאמה אישית.

  • כשבודקים בעיה ספציפית בלוח הבקרה, אפשר לראות את המפתחות המותאמים אישית שמשויכים לכל אירוע (בכרטיסיית המשנה מפתחות), ואפילו לסנן את האירועים לפי מפתחות מותאמים אישית (בתפריט מסנן בחלק העליון של הדף).

משתמשים ב-instance method‏ setCustomKey כדי להגדיר צמדי מפתח/ערך. ריכזנו כאן כמה דוגמאות:

// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');

// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);

// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);

// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);

// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);

// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);

הוספת הודעות מותאמות אישית ליומן

כדי לקבל יותר הקשר לגבי האירועים שהובילו לקריסה, אפשר להוסיף Crashlyticsיומנים מותאמים אישית לאפליקציה. Crashlytics משייך את היומנים לנתוני הקריסה ומציג אותם בכרטיסייה Logs כשמציגים את פרטי הבעיה (אפשר לראות את כל הבעיות בלוח הבקרה DevOps & Engagement > Crashlytics במסוף Firebase).

אפשר להשתמש ב-log כדי לזהות בעיות. לדוגמה:

FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");

הגדרת מזהי משתמשים

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

כדי להוסיף מזהי משתמשים לדוחות, צריך להקצות לכל משתמש מזהה ייחודי בצורה של מספר מזהה, אסימון או ערך גיבוב:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

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

קבלת יומנים של נתיבי ניווט

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

היומנים של נתיבי הניווט מבוססים על Google Analytics, ולכן כדי לקבל אותם צריך להפעיל את Google Analytics בפרויקט Firebase ולהוסיף את Firebase SDK ל-Google Analytics לאפליקציה. אחרי שממלאים את הדרישות האלה, היומנים של נתיבי הניווט נכללים אוטומטית בנתוני האירועים בכרטיסייה יומנים כשמציגים את פרטי הבעיה (אפשר לראות את כל הבעיות בלוח הבקרה Crashlytics בקטע DevOps & Engagement במסוף Firebase).

ערכת ה-SDK של Analytics מתעדת באופן אוטומטי את האירוע screen_view, וכך מאפשרת ליומני הנתיבים להציג רשימה של מסכים שהמשתמש צפה בהם לפני הקריסה, האירוע הלא קטלני או האירוע מסוג ANR. יומן של נתיב ניווט screen_view מכיל פרמטר firebase_screen_class.

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

חשוב לדעת שאתם יכולים לשלוט באיסוף ובשימוש בנתוני Google Analytics, כולל הנתונים שמאכלסים את יומני הנתיבים.

הפעלת דיווח על הסכמה

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

  1. כדי להשבית את האיסוף האוטומטי באופן מקורי:

    פלטפורמות של Apple

    מוסיפים מפתח חדש לקובץ Info.plist:

    • מקש: FirebaseCrashlyticsCollectionEnabled
    • ערך: false

    Android

    בבלוק application בקובץ AndroidManifest.xml, מוסיפים תג meta-data כדי להשבית את האיסוף האוטומטי:

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. מפעילים את האיסוף עבור משתמשים נבחרים על ידי קריאה ל-Crashlytics data collection override בזמן הריצה. ערך ההחלפה נשמר בכל ההפעלות הבאות של האפליקציה, כך ש-Crashlytics יכול לאסוף באופן אוטומטי דוחות עבור המשתמש הזה.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

    אם המשתמש יבחר בהמשך להפסיק את איסוף הנתונים, תוכלו להעביר את הערך false כערך לביטול ברירת המחדל. הערך הזה יחול בפעם הבאה שהמשתמש יפעיל את האפליקציה, וימשיך לחול בכל ההפעלות הבאות של אותו משתמש.

ניהול נתונים ב-Crash Insights

התובנות לגבי קריסות עוזרות לכם לפתור בעיות על ידי השוואה בין עקבות מחסנית (stack traces) אנונימיים שלכם לבין עקבות מאפליקציות אחרות ב-Firebase, ומודיעות לכם אם הבעיה שלכם היא חלק ממגמה רחבה יותר. במקרים רבים, Crash Insights מספק גם מקורות מידע שיעזרו לכם לנפות באגים שגורמים לקריסה.

התכונה 'תובנות לגבי קריסות' משתמשת בנתוני קריסות מצטברים כדי לזהות מגמות נפוצות של יציבות. אם אתם לא רוצים לשתף את נתוני האפליקציה, אתם יכולים להפסיק את השתתפותכם ב-Crash Insights דרך התפריט Crash Insights בחלק העליון של רשימת הבעיות בלוח הבקרה Crashlytics של DevOps & Engagement במסוף Firebase.

השלבים הבאים