אם אתם נתקלים בבעיות בביצועים שנובעות מרה-קומפוזיציה מיותרת או מוגזמת, כדאי לכם לנפות באגים ביציבות של האפליקציה. במדריך הזה מפורטות כמה שיטות לעשות זאת.
כלי לבדיקת פריסות
הכלי Layout Inspector ב-Android Studio מאפשר לכם לראות אילו פונקציות composable עוברות קומפוזיציה מחדש באפליקציה. הוא מציג את מספר הפעמים שבהן Compose ביצע קומפוזיציה מחדש של רכיב או דילג עליו.

יצירת דוחות של קומפיילר
הקומפיילר של Compose יכול להציג את תוצאות ההסקה של היציבות לבדיקה. בעזרת הפלט הזה, אפשר לקבוע אילו רכיבים ניתנים לדילוג ואילו לא. בקטעי המשנה הבאים יש סיכום של אופן השימוש בדוחות האלה, אבל למידע מפורט יותר אפשר לעיין בתיעוד הטכני.
הגדרה
דוחות של מהדר Compose לא מופעלים כברירת מחדל. אפשר להפעיל אותן באמצעות דגל של קומפיילר. ההגדרה המדויקת משתנה בהתאם לפרויקט, אבל בפרויקטים שמשתמשים ב-Compose compiler gradle plugin אפשר להוסיף את הקוד הבא לקובץ build.gradle של כל מודול.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
דוחות של מהדר Compose ייווצרו עכשיו כשמבצעים build של הפרויקט.
פלט לדוגמה
הפלט של reportsDestination הוא שלושה קבצים. הדוגמאות הבאות הן של פלט מ-JetSnack.
-
<modulename>-classes.txt: דוח על היציבות של מחלקות במודול הזה. דוגמה. -
<modulename>-composables.txt: דוח על מידת האפשרות להפעלה מחדש של רכיבי ה-Composable במודול ומידת האפשרות לדילוג עליהם. דוגמה. -
<modulename>-composables.csv: גרסתCSVשל דוח הרכיבים הניתנים להרכבה שאפשר לייבא לגיליון אלקטרוני או לעבד באמצעות סקריפט. דוגמה
דוח על רכיבים שאפשר להרכיב
בקובץ composables.txt מפורטות כל הפונקציות שניתנות להרכבה עבור המודול הנתון, כולל היציבות של הפרמטרים שלהן, והאם אפשר להפעיל אותן מחדש או לדלג עליהן. הנה דוגמה היפותטית מ-JetSnack:
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun SnackCollection(
stable snackCollection: SnackCollection
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
stable index: Int = @static 0
stable highlight: Boolean = @static true
)
רכיב ה-SnackCollection הזה ניתן להפעלה מחדש, לדילוג ולשימוש יציב. בדרך כלל עדיף לעשות את זה, אבל זו לא חובה.
אפשר גם לנסות דוגמה אחרת.
restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
stable index: Int
unstable snacks: List<Snack>
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
)
אי אפשר לדלג על רכיב הקומפוזבילי HighlightedSnacks. Compose אף פעם לא מדלג עליו במהלך רה-קומפוזיציה. זה קורה גם אם אף אחד מהפרמטרים שלו לא השתנה. הסיבה לכך היא הפרמטר unstable, snacks.
הדוח 'כיתות'
הקובץ classes.txt מכיל דוח דומה על המחלקות במודול הנתון. קטע הקוד הבא הוא הפלט של המחלקה Snack:
unstable class Snack {
stable val id: Long
stable val name: String
stable val imageUrl: String
stable val price: Long
stable val tagline: String
unstable val tags: Set<String>
<runtime stability> = Unstable
}
לעיון, ההגדרה של Snack:
data class Snack(
val id: Long,
val name: String,
val imageUrl: String,
val price: Long,
val tagline: String = "",
val tags: Set<String> = emptySet()
)
הקומפיילר של פיתוח נייטיב סימן את Snack כלא יציב. הסיבה לכך היא שהסוג של הפרמטר tags הוא Set<String>. זהו סוג בלתי ניתן לשינוי, בהינתן שהוא לא MutableSet. עם זאת, מחלקות אוסף רגילות כמו Set, List ו-Map הן בסופו של דבר ממשקים. לכן, יכול להיות שההטמעה הבסיסית עדיין ניתנת לשינוי.
לדוגמה, אפשר לכתוב val set: Set<String> = mutableSetOf("foo"). המשתנה הוא קבוע והסוג המוצהר שלו לא ניתן לשינוי, אבל ההטמעה שלו עדיין ניתנת לשינוי. קומפיילר ה-Compose לא יכול להיות בטוח באי-השתנות של המחלקה הזו כי הוא רואה רק את הסוג המוצהר. לכן, המערכת מסמנת את tags כלא יציב.