שאלות נפוצות ופתרון בעיות ב-Crashlytics
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
בדף הזה תוכלו למצוא עזרה בפתרון בעיות ותשובות לשאלות נפוצות על השימוש ב-Crashlytics. אם לא מצאתם את מה שחיפשתם או שאתם צריכים עזרה נוספת, אתם יכולים לפנות לתמיכה של Firebase.
פתרון בעיות כלליות/שאלות נפוצות
רואים פורמטים שונים (ולפעמים 'וריאציות') של חלק מהבעיות בטבלה Issues (בעיות)
יכול להיות שתבחינו בשני פורמטים שונים של בעיות שמופיעות בטבלה בעיות במסוף Firebase. יכול להיות שתבחינו גם בתכונה שנקראת 'וריאציות' בחלק מהבעיות. הנה הסיבות:
בתחילת 2023 השקנו מנוע ניתוח משופר לקיבוץ אירועים, עיצוב מעודכן וכמה תכונות מתקדמות לבעיות חדשות (כמו וריאציות!). בפוסט האחרון בבלוג אפשר לקרוא את כל הפרטים, אבל בהמשך מופיעים עיקרי הדברים.
Crashlytics מנתח את כל האירועים מהאפליקציה (כמו קריסות, אירועים לא קריטיים ומקרי ANR) ויוצר קבוצות של אירועים שנקראות בעיות – לכל האירועים בבעיה יש נקודת כשל משותפת.
כדי לקבץ אירועים לבעיות האלה, מנוע הניתוח המשופר בודק עכשיו היבטים רבים של האירוע, כולל המסגרות במעקב אחר מחסנית, הודעת החריגה, קוד השגיאה ומאפיינים אחרים של הפלטפורמה או של סוג השגיאה.
עם זאת, בתוך קבוצת האירועים הזו, יכול להיות שדוחות הקריסות שמובילים לכשל יהיו שונים. דוח קריסה שונה יכול להצביע על סיבת שורש שונה.
כדי לייצג את ההבדל האפשרי הזה בתוך בעיה, אנחנו יוצרים עכשיו וריאציות בתוך בעיות – כל וריאציה היא קבוצת משנה של אירועים בבעיה שיש להם אותה נקודת כשל ו עקבות מחסנית דומים. באמצעות וריאציות, אפשר לנפות באגים במעקב אחר מחסנית (stack trace) הנפוץ ביותר בבעיה, ולקבוע אם סיבות שורש שונות מובילות לכשל.
אלה השיפורים שתוכלו לראות:
מטא-נתונים משופרים שמוצגים בשורת הבעיה עכשיו קל יותר להבין ולסווג בעיות באפליקציה.
פחות בעיות כפולות שינוי במספר השורה לא גורם ליצירת בעיה חדשה.
ניפוי באגים קל יותר בבעיות מורכבות עם מגוון סיבות שורש אפשר להשתמש בווריאציות כדי לנפות באגים במעקב אחר מחסנית (stack trace) הנפוץ ביותר בבעיה.
התראות וסיגנלים משמעותיים יותר בעיה חדשה מייצגת באג חדש.
חיפוש יעיל יותר כל בעיה מכילה יותר מטא-נתונים שאפשר לחפש, כמו סוג החריגה ושם החבילה.
כך מתבצעת ההשקה של השיפורים האלה:
כשנקבל אירועים חדשים מהאפליקציה, נבדוק אם הם תואמים לבעיה קיימת.
אם אין התאמה, נחיל באופן אוטומטי על האירוע את האלגוריתם החכם יותר שלנו לקיבוץ אירועים, וניצור בעיה חדשה עם עיצוב המשופר של המטא-נתונים.
זהו העדכון הגדול הראשון שאנחנו מבצעים לקיבוץ האירועים. אם יש לכם משוב או נתקלתם בבעיות, אתם מוזמנים
לשלוח לנו דיווח.
לא רואים יומנים של נתיבי מיקום
אם לא מוצגים יומני נתיב, מומלץ לבדוק את ההגדרה של האפליקציה ל-Google Analytics.
צריך לוודא שאתם עומדים בדרישות הבאות:
חשוב במיוחד לוודא שאתם משתמשים לפחות בגרסה הבאה של Firebase SDK ל-Google Analytics: Android — גרסה 17.2.3 ואילך(BoM גרסה 24.7.1 ואילך).
לא רואים התראות על מהירות
אם לא מוצגים לכם התראות על מהירות, ודאו שאתם משתמשים בגרסה
Crashlytics SDK v18.6.0+ (או Firebase BoM v32.6.0+).
לא רואים מדדים לגבי אפליקציות שלא קורסות (או רואים מדדים לא מהימנים)
אם אתם לא רואים מדדים שקשורים לבעיות קריסה (כמו משתמשים וסשנים ללא קריסה) או שאתם רואים מדדים לא מהימנים, כדאי לבדוק את הדברים הבאים:
חשוב לוודא שאתם משתמשים בגרסהCrashlytics SDK v18.6.0 ואילך (או בגרסה Firebase BoM v32.6.0 ואילך), בגרסה
חשוב לוודא שהגדרות איסוף הנתונים לא משפיעות על האיכות של מדדי הנתונים ללא קריסה:
אם מפעילים דיווח על הסכמה על ידי השבתת הדיווח האוטומטי על קריסות, אפשר לשלוח מידע על קריסות אל Crashlytics רק ממשתמשים שהביעו הסכמה מפורשת לאיסוף נתונים. לכן, הדיוק של מדדים שקשורים לקריסות יושפע כי ל-Crashlytics יש מידע על קריסות רק מהמשתמשים שהביעו הסכמה (ולא מכל המשתמשים). המשמעות היא שהמדדים של אפליקציות ללא קריסות עשויים להיות פחות מהימנים ופחות משקפים את היציבות הכוללת של האפליקציה.
אם השבתתם את האיסוף האוטומטי של נתונים, אתם יכולים להשתמש ב-sendUnsentReports כדי לשלוח ל-Crashlytics דוחות שמאוחסנים במטמון במכשיר.
אם משתמשים בשיטה הזו, נתוני קריסות נשלחים אל Crashlytics, אבל לא נתוני סשנים, ולכן בתרשימים של המסוף מוצגים ערכים נמוכים או אפס למדדים של אפליקציות שלא קורסות.
Crashlytics תומך בדיווח על ANR באפליקציות ל-Android ממכשירים שפועלת בהם מערכת Android מגרסה 11 ואילך. ממשק ה-API הבסיסי שבו אנחנו משתמשים כדי לאסוף ANR (getHistoricalProcessExitReasons) אמין יותר מגישות שמבוססות על SIGQUIT או על watchdog. ה-API הזה זמין רק במכשירי Android מגרסה 11 ואילך.
למה בחלק מה-ANR חסרים BuildId?
אם חלק מה-ANR לא כוללים את BuildId, פועלים לפי השלבים הבאים לפתרון הבעיה:
חשוב לוודא שאתם משתמשים בגרסה עדכנית של Crashlytics Android SDK ותוסף Gradle.Crashlytics
אם חסרים לכם BuildIds ב-Android 11 ובחלק מה-ANR ב-Android 12, סביר להניח שאתם משתמשים ב-SDK, בפלאגין Gradle או בשניהם שהם לא עדכניים.
כדי לאסוף נתוני BuildId בצורה תקינה לגבי שגיאות ANR האלה, צריך להשתמש בגרסאות הבאות:
Crashlytics Android SDK גרסה 18.3.5 ואילך (Firebase BoM גרסה 31.2.2 ואילך)
Crashlytics Gradle plugin v2.9.4+
בודקים אם אתם משתמשים במיקום לא סטנדרטי לספריות המשותפות.
אם חסרים לך רקBuildIds בספריות המשותפות של האפליקציה, סביר להניח שלא השתמשת במיקום הרגיל שמוגדר כברירת מחדל לספריות משותפות. אם זה המצב, יכול להיות ש-Crashlytics לא יוכל לאתר את BuildIds המשויכים. מומלץ להשתמש במיקום הרגיל לספריות משותפות.
מוודאים שלא מסירים את התגים BuildId במהלך תהליך הבנייה.
הערה: הטיפים הבאים לפתרון בעיות רלוונטיים גם ל-ANR וגם לקריסות של אפליקציות מובנות.
בודקים אם קיימים קבצים מסוג BuildId על ידי הפעלת readelf -n בקבצים הבינאריים. אם התגים BuildId לא מופיעים, מוסיפים את התג -Wl,--build-id לדגלים של מערכת הבנייה.
צריך לוודא שלא מסירים בטעות את BuildId כדי להקטין את גודל ה-APK.
אם שומרים גרסאות עם מידע וגרסאות בלי מידע של ספרייה, צריך לוודא שמפנים לגרסה הנכונה בקוד.
הבדלים בין דוחות ANR בלוח הבקרה Crashlytics לבין דוחות ANR ב-Google Play Console
יכול להיות שיהיה הבדל בין מספר שגיאות ה-ANR ב-Google Play לבין מספר שגיאות ה-ANR ב-Crashlytics. התופעה הזו צפויה בגלל ההבדל במנגנון של איסוף נתוני ANR ודיווח עליהם. Crashlytics מדווח על מקרי ANR כשהאפליקציה מופעלת מחדש, בעוד ש'תפקוד האפליקציה' שולח נתוני ANR אחרי שמתרחש ANR.
בנוסף, Crashlytics מציג רק ANR שמתרחשים במכשירים עם Android מגרסה 11 ומעלה, לעומת Google Play שמציג ANR ממכשירים עם Google Play Services והסכמה לאיסוף נתונים.
ההבדלים בין עקבות מחסנית NDK בלוח הבקרה Crashlytics לבין logcat
ל-LLVM ול-GNU toolchains יש הגדרות ברירת מחדל וטיפולים שונים עבור קטע הקריאה בלבד של הקבצים הבינאריים של האפליקציה, מה שעשוי ליצור עקבות מחסנית לא עקביים במסוף Firebase. כדי לפתור את הבעיה, מוסיפים את דגלי ה-linker הבאים לתהליך הבנייה:
אם אתם משתמשים ב-lld linker מ-LLVM toolchain, מוסיפים:
-Wl,--no-rosegment
אם אתם משתמשים במקשר ld.gold מ-GNU toolchain, מוסיפים:
-Wl,--rosegment
אם עדיין מופיעות אי-התאמות ב-stack trace (או אם אף אחד מהדגלים לא רלוונטי לשרשרת הכלים), אפשר לנסות להוסיף את הפקודה הבאה לתהליך הבנייה:
-fno-omit-frame-pointer
איך משתמשים בבינארי של מחולל קובצי סמלים של Breakpad משלי ב-NDK?
הפלאגין Crashlytics כולל מחולל קובצי סמלים של Breakpad בהתאמה אישית.
אם אתם מעדיפים להשתמש בקובץ בינארי משלכם כדי ליצור קובצי סמלים של Breakpad (לדוגמה, אם אתם מעדיפים ליצור את כל קובצי ההפעלה המקוריים בשרשרת הבנייה שלכם ממקור), אתם יכולים להשתמש במאפיין האופציונלי symbolGeneratorBinary של התוסף כדי לציין את הנתיב לקובץ ההפעלה.
אפשר לציין את הנתיב לקובץ הבינארי של מחולל קובצי הסמלים של Breakpad באחת משתי דרכים:
אפשרות 1: ציון הנתיב באמצעות התוסף firebaseCrashlytics
בקובץ build.gradle
מוסיפים את השורות הבאות לקובץ build.gradle.kts ברמת האפליקציה:
פלאגין Gradle גרסה 3.0.0 ואילך
android{buildTypes{release{configure<CrashlyticsExtension>{nativeSymbolUploadEnabled=true// Add these optional fields to specify the path to the executablesymbolGeneratorType="breakpad"breakpadBinary=file("/PATH/TO/BREAKPAD/DUMP_SYMS")}}}}
גרסאות ישנות יותר של הפלאגין
android{// ...buildTypes{// ...release{// ...firebaseCrashlytics{// existing; required for either symbol file generatornativeSymbolUploadEnabledtrue// Add this optional new block to specify the path to the executablesymbolGenerator{breakpad{binaryfile("/PATH/TO/BREAKPAD/DUMP_SYMS")}}}}}
אפשרות 2: מציינים את הנתיב באמצעות שורת מאפיינים בקובץ Gradle.properties
אפשר להשתמש במאפיין com.google.firebase.crashlytics.breakpadBinary כדי לציין את הנתיב לקובץ ההפעלה.
אפשר לעדכן ידנית את קובץ המאפיינים של Gradle או לעדכן את הקובץ דרך שורת הפקודה. לדוגמה, כדי לציין את הנתיב דרך שורת הפקודה, משתמשים בפקודה כמו הבאה:
למה אני רואה קריסות
מקבצים מסוג .kt שמסומנים כבעיות מסוג .java?
כשמשתמשים באפליקציה בכלי להסתרת קוד שלא חושף את סיומת הקובץ, Crashlytics יוצר כל בעיה עם סיומת הקובץ .java כברירת מחדל.
כדי ש-Crashlytics יוכל ליצור בעיות עם סיומת הקובץ הנכונה, צריך לוודא שהאפליקציה משתמשת בהגדרה הבאה:
משתמשים ב-Android Gradle מגרסה 4.2.0 ואילך
משתמש ב-R8 עם הפעלת טשטוש. כדי לעדכן את האפליקציה ל-R8, אפשר לעיין במסמכי התיעוד.
שימו לב: אחרי שתעדכנו את ההגדרה בהתאם לתיאור שלמעלה, יכול להיות שתתחילו לראות בעיות חדשות מסוג .kt שהן כפילות של בעיות קיימות מסוג .java. בשאלות הנפוצות מופיע מידע נוסף על המקרה הזה.
למה מופיעות בעיות שהן כפילויות של בעיות קיימות?.kt.java
החל מאמצע דצמבר 2021, Crashlyticsשפרנו את התמיכה באפליקציות
שמשתמשות ב-Kotlin.
עד לאחרונה, כלי ההסוואה הזמינים לא חשפו את סיומת הקובץ, ולכן Crashlytics יצר כל בעיה עם סיומת הקובץ .java כברירת מחדל.
עם זאת, החל מ-Android Gradle 4.2.0, R8 תומך בסיומות קבצים.
בעדכון הזה, Crashlytics יכול לקבוע אם כל מחלקה שנעשה בה שימוש באפליקציה נכתבה ב-Kotlin, ולכלול את שם הקובץ הנכון בחתימת הבעיה. קריסות משויכות עכשיו בצורה נכונה לקבצים מסוג .kt (בהתאם לצורך) אם האפליקציה מוגדרת באופן הבא:
מאחר שקריסות חדשות כוללות עכשיו את סיומת הקובץ הנכונה בחתימות הבעיה שלהן, יכול להיות שתראו בעיות חדשות עם התווית .kt שהן למעשה כפילויות של בעיות קיימות עם התווית .java. במסוף Firebase, אנחנו מנסים לזהות בעיה חדשה ב-.kt שהיא כפילות אפשרית של בעיה קיימת עם התווית .java, ולעדכן אתכם על כך.
מי יכול לראות, לכתוב ולמחוק הערות בבעיה?
הערות מאפשרות לחברי הפרויקט להגיב על בעיות ספציפיות עם שאלות, עדכוני סטטוס וכו'.
כשחבר בפרויקט מפרסם הערה, היא מסומנת בכתובת האימייל של חשבון Google שלו. כתובת האימייל הזו גלויה, יחד עם ההערה, לכל חברי הפרויקט שיש להם גישה לצפייה בהערה.
בהמשך מפורטות הרשאות הגישה שנדרשות כדי להציג, לכתוב ולמחוק הערות:
חברי פרויקט עם אחד מהתפקידים הבאים יכולים לראות ולמחוק הערות קיימות ולכתוב הערות חדשות בבעיה.
באפליקציה נעשה שימוש גם ב-SDK Google Mobile Ads, אבל לא מתרחשות קריסות
אם אתם משתמשים ב-Crashlytics בפרויקט שלכם לצד Google Mobile Ads SDK, סביר להניח שדוחות הקריסה מפריעים בזמן רישום של מטפלי חריגים. כדי לפתור את הבעיה, צריך להשבית את הדיווח על קריסות ב-SDK של Mobile Ads באמצעות הקריאה disableSDKCrashReporting.
איפה נמצא מערך הנתונים שלי ב-BigQuery?
אחרי שמקשרים את Crashlytics ל-BigQuery, מערכי נתונים חדשים שיוצרים ממוקמים באופן אוטומטי בארצות הברית, ללא קשר למיקום של פרויקט Firebase.
תמיכה בפלטפורמה
האם Crashlytics תומך ב-armeabi?
Firebase Crashlytics NDK לא תומך ב-ARMv5 (armeabi).
התמיכה בממשק ABI הזה הוסרה החל מ-NDK r17.
בעיות שחזרו
מהי בעיה שחלה בה רגרסיה?
בעיה שסגרתם בעבר חזרה, וקיבלתם דיווח חדש על כך שהיא התרחשה שוב.CrashlyticsCrashlytics פותחת מחדש באופן אוטומטי את הבעיות האלה שחזרו, כדי שתוכלו לטפל בהן בהתאם לאפליקציה שלכם.
הנה תרחיש לדוגמה שמסביר איך Crashlytics מסווג בעיה כרגרסיה:
בפעם הראשונה, Crashlytics מקבל דוח קריסה על קריסה מספר A. Crashlytics נפתחת בעיה תואמת לקריסה (בעיה A).
אתם מתקנים את הבאג הזה במהירות, סוגרים את הבעיה 'א' ומפרסמים גרסה חדשה של האפליקציה.
Crashlytics מקבל דיווח נוסף על בעיה א' אחרי שסגרתם את הבעיה.
אם הדוח הוא מגרסת אפליקציה ש-Crashlyticsידע עליה כשסגרת את הבעיה (כלומר, הגרסה שלחה דוח קריסה על כל קריסה שהתרחשה), אז Crashlytics לא יתייחס לבעיה כאל רגרסיה. הבעיה תישאר סגורה.
אם הדוח הוא מגרסת אפליקציה שCrashlyticsלא הייתה
מודעת לבעיה כשסגרתם אותה (כלומר, הגרסה מעולם לא שלחה אף דוח קריסה לגבי קריסה כלשהי), אז Crashlytics תראה את הבעיה כרגרסיה ותפתח אותה מחדש.
אם בעיה חוזרת, אנחנו שולחים התראה על זיהוי רגרסיה ומוסיפים אות רגרסיה לבעיה כדי להודיע לכם ש-Crashlytics פתח מחדש את הבעיה. אם אתם לא רוצים שבעיה תיפתח מחדש בגלל אלגוריתם הרגרסיה שלנו, אתם יכולים להשתיק את הבעיה במקום לסגור אותה.
למה אני רואה בעיות שחזרו בגרסאות קודמות של האפליקציה?
אם הדוח הוא מגרסה ישנה של האפליקציה שמעולם לא שלחה דוחות קריסה כשסגרתם את הבעיה, מערכת Crashlytics תראה שהבעיה חזרה ותפתח אותה מחדש.
המצב הזה יכול לקרות במקרה הבא: תיקנתם באג ופרסמתם גרסה חדשה של האפליקציה, אבל עדיין יש משתמשים בגרסאות ישנות יותר שלא כוללות את תיקון הבאג. אם במקרה אחת מהגרסאות הישנות האלה מעולם לא שלחה דוחות קריסה כשסגרתם את הבעיה, והמשתמשים האלה מתחילים להיתקל בבאג, דוחות הקריסה האלה יפעילו בעיה שחזרה.
אם אתם לא רוצים שהבעיה תיפתח מחדש בגלל אלגוריתם הרגרסיה שלנו, אתם יכולים להשתיק את הבעיה במקום לסגור אותה.
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2025-10-23 (שעון UTC)."],[],[]]