הקוד שלכם מופעל ב-Jetpack Compose בכמה שלבים שונים, ולכן חלקים מסוימים בפונקציה @Composable מופעלים בנפרד זה מזה. קריסות בשלבים האלה עלולות לגרום ליצירת עקבות מחסנית שקשה לפענח, ולכן קשה לאתר את הפונקציה או את שורת הקוד המדויקת שגרמו לקריסה.
הוספת פרטי מקור ל-stack traces
כדי לשפר את הקריאות של מעקב אחר מחסנית, API אופציונלי מספק פרטים עשירים יותר על מיקום הקריסה, כולל שמות ומיקומים של רכיבים הניתנים להרכבה, וכך מאפשר לכם:
- זיהוי יעיל של מקורות קריסה ופתרון בעיות
- בידוד קריסות לדוגמאות שניתן לשחזר
- חקירת קריסות שבעבר הופיעו רק בהן מסגרות פנימיות של מחסנית
זמן הריצה של Compose יכול לזהות את מיקום הקריסה בקומפוזיציה ולשחזר את עקבות המחסנית על סמך ההיררכיה של @Composable. דוח הקריסות מצורף לקריסות ב:
- יצירה מוזיקלית
-
DisposableEffectו-LaunchedEffect(חוץ מ-onDisposeאו מביטול) - השקת קורוטינות ב-
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. הדוחות האלה פחות מדויקים, והם מותאמים כדי להימנע מביצוע עבודה נוספת בזמן הריצה. החל מ-Kotlin 2.3.0, קומפיילר Compose תומך בפליטה של מיפויים נוספים של R8. -
SourceInformation: שימושי בגרסאות build לא מכווצות, אוסף מידע על המקור ומוסיף אותו לדוח הקריסות. התוצאות מדויקות יותר, אבל יש עלות משמעותית מבחינת הביצועים, בדומה לשימוש בכלי לבדיקת פריסת הרכיבים. הן נוצרות לשימוש בגרסאות ניפוי באגים של האפליקציות כדי לקבל קריאות מדויקות לגבי קריסה שנדרש לגביה מידע נוסף על המיקום שלה. פרטי המקור מוסרים מאפליקציות שעברו מיניפיקציה כדי לבצע אופטימיזציה של גודל הקובץ הבינארי והביצועים. -
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.