בדרך כלל, נתוני המעקב הם המקור הטוב ביותר למידע כשבודקים לראשונה בעיה בביצועים. הם מאפשרים לכם לנסח השערה לגבי הבעיה ולדעת איפה להתחיל לחפש.
ב-Android יש תמיכה בשתי רמות של מעקב: מעקב מערכת ומעקב שיטות.
מאחר שמעקב המערכת עוקב רק אחרי אזורים שסומנו במיוחד למעקב, הוא גורם לעומס נמוך ולא משפיע באופן משמעותי על הביצועים של האפליקציה. מעקב אחר המערכת הוא דרך מצוינת לראות כמה זמן נדרש להריץ קטעים מסוימים בקוד.
כשמשתמשים במעקב אחר שיטות, המערכת עוקבת אחרי כל קריאה לפונקציה באפליקציה. הפעולה הזו יקרה מאוד, ולכן היא משפיעה מאוד על ביצועי האפליקציה, אבל היא מספקת תמונה מלאה של מה שקורה, אילו פונקציות נקראות ותדירות הקריאות שלהן.
כברירת מחדל, נתוני המעקב אחרי המערכת לא כוללים פונקציות מורכבות ספציפיות. הם זמינים בנתוני המעקב אחר שיטות.
אנחנו בודקים כרגע פונקציונליות חדשה של מעקב אחר מערכת כדי להציג פונקציות שניתנות ליצירה מתוך מעקבים אחרי מערכת. היא מספקת את מידת ההפרעה הנמוכה של מעקב המערכת, עם רמות פירוט של מעקב שיטות בהרכבה.
הגדרה למעקב אחר הרכבה
כדי לנסות את המעקב אחר יצירת קומפוזיציה מחדש בפרויקט, צריך לעדכן לפחות לגרסאות הבאות:
- Android Studio Flamingo
- ממשק המשתמש של Compose: 1.3.0
- Compose Compiler: 1.3.0
גם המכשיר או הסימולטור שבהם מריצים את המעקב צריכים להיות ברמת API של 30 לפחות.
בנוסף, צריך להוסיף יחסי תלות חדשים ל-Compose Runtime Tracing:
implementation("androidx.compose.runtime:runtime-tracing:1.7.5")
אם אתם משתמשים ב-Compose BOM, אין צורך לציין את הגרסה:
val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
בעזרת התלות הזו, כשאתם מבצעים מעקב אחרי המערכת שכולל יצירת קומפוזיציה, תוכלו לראות את הפונקציות הניתנות ליצירת קומפוזיציה באופן אוטומטי.
תיעוד עקבות המערכת
כדי לבצע מעקב אחר המערכת ולראות את המעקב החדש אחרי הרכבה מחדש בפעולה, פועלים לפי השלבים הבאים:
פותחים את הכלי לניתוחי פרופיל:
לוחצים על ציר הזמן של המעבד.
מנווטים באפליקציה אל ממשק המשתמש שרוצים לעקוב אחריו, ובוחרים באפשרות System Trace ואז באפשרות Record.
משתמשים באפליקציה כדי לגרום ליצירת קומפוזיציה מחדש ולהפסיק את ההקלטה. אחרי שהמעקב יתבצע ויופיע, תוכלו לראות את הרכיבים הניתנים לקישור ב-trace של ה-recomposition. אפשר להשתמש במקלדת ובעכבר כדי להגדיל את התצוגה ולזוז בתוכה. אם אתם לא יודעים איך לנווט בתוכה, תוכלו לעיין במאמר תיעוד נתוני מעקב.
לחיצה כפולה על רכיב מורכב בתרשים תעביר אתכם לקוד המקור שלו.
אפשר גם לראות את הרכיבים הניתנים לקישור בתרשים הלהבה, יחד עם מספר הקובץ והשורה:
נקודות שצריך לשים לב אליהן:
יתרת מקום ב-APK
הצלחנו לצמצם את התקורה של התכונה ככל האפשר, אבל יש עלייה בגודל ה-APK של אפליקציות Compose שמגיעה משרשראות מעקב שמוטמעות ב-APK על ידי המהדר של Compose. העלייה בגודל יכולה להיות קטנה יחסית אם האפליקציה לא משתמשת הרבה ב-Compose, או גדולה יותר באפליקציות Compose מלאות. בנוסף, מחרוזות המעקב האלה לא מעורפלות, כדי שיוכלו להופיע בכלי המעקב, כפי שצוין למעלה. המהדר של Compose מזין אותם לכל האפליקציות, החל מגרסה 1.3.0.
כדי להסיר את מחרוזות המעקב ב-build של גרסת הייצור, מוסיפים את כלל Proguard הבא:
-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
boolean isTraceInProgress();
void traceEventStart(int,int,int,java.lang.String);
void traceEventStart(int,java.lang.String);
void traceEventEnd();
}
הפונקציות האלה עשויות להשתנות בעתיד, אבל כל שינוי יופיע בנתוני הגרסה של Compose.
חשוב לזכור: השארת הקבצים האלה, למרות העלות הנוספת של הגדלת גודל ה-APK, מבטיחה שה-APK שמייצרים את הפרופיל הוא זה שמשתמשי האפליקציה מריצים.
תזמון מדויק
כדי ליצור פרופיל מדויק, כמו בכל בדיקת ביצועים, צריך להגדיר את האפליקציה profileable
ו-non-debuggable
בהתאם למאמר אפליקציות שניתן ליצור להן פרופיל.
איך מתעדים מעקב (trace) מהמסוף
אפשר לתעד את המעקב אחר ההרכבה מהטרמינל. כדי לעשות זאת, צריך לבצע את השלבים שבדרך כלל מתבצעים באופן אוטומטי ב-Android Studio.
הוספת יחסי תלות
קודם כול, מוסיפים את יחסי התלות הנוספים לאפליקציה.
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
יצירת פקודה להקלטה
- יצירת פקודת רשומה באמצעות Perfetto.
מוסיפים ידנית את הקטע של מקור הנתונים
track_event
לפי הדוגמה הבאה:adb shell perfetto \ -c - --txt \ -o /data/misc/perfetto-traces/trace \ <<EOF buffers: { size_kb: 63488 fill_policy: RING_BUFFER } buffers: { size_kb: 2048 fill_policy: RING_BUFFER } data_sources: { config { name: "track_event" } } duration_ms: 10000 flush_period_ms: 30000 incremental_state_config { clear_period_ms: 5000 } EOF
תיעוד נתיב
- פותחים את האפליקציה ומכינים את הקטע שרוצים לעקוב אחריו.
כדי להפעיל את המעקב באפליקציה, צריך להפעיל שידור.
# set app package variable, e.g. com.google.samples.apps.nowinandroid.debug # can be found through `adb shell ps -ef` or `adb shell cmd package list packages` package=<your app process> # issue a broadcast to enable tracing adb shell am broadcast \ -a androidx.tracing.perfetto.action.ENABLE_TRACING \ $package/androidx.tracing.perfetto.TracingReceiver
מפעילים את פקודת ההקלטה שיצרתם קודם.
פתיחת המעקב
adb pull <location>
הנתיב מהמכשיר (המיקום שצוין בפקודת התיעוד).פותחים ב-Perfetto.
איך מתעדים נתוני מעקב באמצעות Jetpack Macrobenchmark
אפשר למדוד את הביצועים באמצעות Jetpack Macrobenchmark, שמספק מעקב אחר נתונים בתור תוצאות. כדי להפעיל מעקב אחר הרכב עם מדדי ביצועים מאקרו, צריך:
מוסיפים את יחסי התלות הנוספים האלה למודול הבדיקה Macrobenchmark:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
מוסיפים את הארגומנט
androidx.benchmark.fullTracing.enable=true
לכלי למדידת הביצועים לפני שמריצים את מדדי הביצועים. מידע נוסף על ארגומנטים של מכשור ב-Macrobenchmark זמין במאמר ארגומנטים של מכשור ב-Macrobenchmark.
משוב
נשמח לקבל ממך משוב על התכונה הזו, על באגים שמצאת בה ועל בקשות שיש לך. אתם יכולים לשלוח לנו משוב דרך כלי המעקב אחרי בעיות.