Jetpack Compose מריץ את הקוד בכמה שלבים שונים, וכתוצאה מכך חלקים מסוימים של הפונקציה @Composable מופעלים בנפרד זה מזה. קריסות בשלבים האלה יכולות לגרום לדוחות קריסות שקשה לפענח, ולכן קשה לאתר את הפונקציה או את שורת הקוד המדויקת שגרמו לקריסה.
הוספת פרטי מקור לדוחות קריסות
כדי לשפר את הקריאוּת של דוחות הקריסה, יש API שצריך להביע הסכמה לשימוש בו. ה-API הזה מספק פרטים עשירים יותר על מיקום הקריסה, כולל שמות ומיקומים של רכיבים קומפוזביליים, ומאפשר לכם:
- זיהוי ופתרון יעילים של מקורות לקריסות
- בידוד קריסות לדוגמאות שניתן לשחזר
- חקירת קריסות שבעבר הציגו רק מסגרות סטאק פנימיות
סביבת זמן הריצה של Compose יכולה לזהות את מיקום הקריסה בקומפוזיציה ולשחזר דוח קריסות על סמך ההיררכיה של @Composable. דוח הקריסות מצורף לקריסות ב:
- הרכב
-
DisposableEffectוגםLaunchedEffect(חוץ מ-onDisposeאו ביטול) - Coroutines שהופעלו ב-
rememberCoroutineScope - שלבי המדידה, הפריסה והשרטוט
כדי להפעיל את התכונה הזו, מוסיפים את השורות הבאות לנקודת הכניסה של האפליקציה:
// Enable stack traces at application level: onCreate class SampleStackTracesEnabledApp : Application() { override fun onCreate() { super.onCreate() // Enable Compose stack traces for minified builds only. Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto) // Alternatively: // Enable verbose Compose stack traces for local debugging Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.SourceInformation) } }
מומלץ לבצע את ההגדרה הזו לפני שיוצרים קומפוזיציות, כדי לוודא שהמידע של דוח הקריסות נאסף בצורה נכונה.
יש ארבע אפשרויות לComposeStackTraceMode:
-
Auto: האפשרות המומלצת, כי היא משתמשת ב-GroupKeysאם האפליקציה מוקטנת, וב-Noneאם לא. -
GroupKeys: דוחות קריסות נוצרים לאפליקציות שעברו כיווץ. פרטי המפתח של הקבוצה נשמרים גם אחרי ההקטנה, ומשמשים יחד עם קובץ המיפוי של ProGuard שנוצר על ידי המהדר של Compose ו-R8 כדי לשחזר מיקום משוער של פונקציות@Composable. דוחות קריסות אלה פחות מדויקים, והם מותאמים כדי להימנע מפעולות נוספות בזמן הריצה. הקומפיילר של Compose תומך בהנפקה של מיפויים נוספים של R8 החל מגרסה 2.3.0 של Kotlin. -
SourceInformation: שימושי ל-builds שלא עברו צמצום, אוסף מידע על המקור ומוסיף אותו לדוח הקריסות. התוצאות מדויקות יותר, אבל הן כרוכות בעלות משמעותית מבחינת הביצועים, בדומה לצירוף של Layout Inspector. הם נוצרים כדי לשמש בגרסאות ניפוי באגים של האפליקציות, כדי לקבל קריאות מדויקות לגבי קריסה שנדרש מידע נוסף על המיקום שלה. פרטי המקור מוסרים מאפליקציות שעברו כיווץ כדי לשפר את הגודל והביצועים של הקובץ הבינארי. -
None: לא נוספו פרטים נוספים לדוח הקריסות.
כשמשתמשים באפשרות SourceInformation, דוח הקריסות מופיע בתור DiagnosticComposeException ברשימת החריגות המוסתרות:
java.lang.IllegalStateException: Test layout error
at <original trace>
Suppressed: androidx.compose.runtime.DiagnosticComposeException:
Composition stack when thrown:
at ReusableComposeNode(Composables.kt:<unknown line>)
at Layout(Layout.kt:79)
at <lambda>(TempErrorsTest.kt:164)
at <lambda>(BoxWithConstraints.kt:66)
at ReusableContentHost(Composables.kt:164)
at <lambda>(SubcomposeLayout.kt:514)
at SubcomposeLayout(SubcomposeLayout.kt:114)
at SubcomposeLayout(SubcomposeLayout.kt:80)
at BoxWithConstraints(BoxWithConstraints.kt:64)
at SubcomposeLayoutErrorComposable(TempErrorsTest.kt:164)
at <lambda>(TempErrorsTest.kt:86)
at Content(ComposeView.android.kt:430)
at <lambda>(ComposeView.android.kt:249)
at CompositionLocalProvider(CompositionLocal.kt:364)
at ProvideCommonCompositionLocals(CompositionLocals.kt:193)
at <lambda>(AndroidCompositionLocals.android.kt:113)
at CompositionLocalProvider(CompositionLocal.kt:364)
at ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:102)
at <lambda>(Wrapper.android.kt:141)
at CompositionLocalProvider(CompositionLocal.kt:384)
at <lambda>(Wrapper.android.kt:140)
מגבלות ידועות
יש כמה בעיות מוכרות עם מסגרות של דוחות קריסות:
דוחות קריסות של פרטי המקור
מספרי שורות חסרים (<unknown line>) במסגרת הסטאק הראשונה של קריסות בקומפוזיציה. מכיוון שהבדיקה של פרטי המקור מתרחשת אחרי קריסה, הנתונים בטבלת המשבצות יכולים להיות חלקיים ולא לכלול את מספר השורה.
הפונקציות ReusableComposeNode ו-remember לא מפיקות מידע על המקור, ולכן תראו את הערך <unknown line> במסגרות הסטאק של הפונקציות האלה.
דוחות קריסות של מפתחות קבוצה
דוחות קריסות שמבוססים על GroupKeys יכולים להצביע רק על השורה הראשונה של הפונקציה @Composable. הם גם לא מכילים נתונים של פונקציות שלא יוצרות קבוצה (כמו פונקציות מוטבעות או פונקציות שלא מחזירות יחידה).
קריסות של איסוף דוחות קריסות
אם איסוף דוחות הקריסות נכשל מסיבה כלשהי, החריגה הזו מתווספת כחריגה מודחקת במקום DiagnosticComposeException.
דווחו על קריסות מודחקות או על חוסר עקביות בדוחות הקריסות לרכיב זמן הריצה של Compose.