מעקב אחר יצירה מוזיקלית

מעקבים הם בדרך כלל מקור המידע הכי טוב כשבודקים לראשונה בעיה בביצועים. הם מאפשרים לכם ליצור השערה לגבי הבעיה ואיפה להתחיל לחפש.

ב-Android יש תמיכה בשתי רמות של מעקב: תיעוד עקבות המערכת ותיעוד method.

מכיוון שמעקב אחר המערכת עוקב רק אחר אזורים שמסומנים באופן ספציפי למעקב, יש לו תקורה נמוכה והוא לא משפיע באופן משמעותי על ביצועי האפליקציה. תיעוד עקבות המערכת הוא כלי מצוין לבדיקת משך הזמן שלוקח להריץ חלקים מסוימים בקוד.

תיעוד method עוקב אחרי כל בקשה להפעלת פונקציה באפליקציה. זהו תהליך יקר מאוד, ולכן הוא משפיע מאוד על ביצועי האפליקציה, אבל הוא נותן תמונה כוללת של מה שקורה, אילו פונקציות נקראות ובאיזו תדירות הן נקראות.

כברירת מחדל, עקבות המערכת לא כוללות פונקציות קומפוזביליות נפרדות. הם זמינים בתיעודי method.

מעקב אחר קומפוזיציה מציג פונקציות קומפוזביליות בתוך עקבות המערכת. התכונה הזו מאפשרת לכם ליהנות מהיתרונות של תיעוד עקבות המערכת (הפרעה מינימלית) ושל תיעוד method (רמות פירוט בקומפוזיציה).

הגדרת מעקב אחר קומפוזיציה

כדי לנסות את מעקב הקומפוזיציה בפרויקט, צריך לעדכן לפחות לגרסאות הבאות:

  • Android Studio Flamingo
  • ‫Compose UI: ‏ 1.3.0
  • ‫Compose Compiler: ‏ 1.3.0

המכשיר או האמולטור שבו אתם מריצים את המעקב חייב להיות ברמת API‏ 30 לפחות.

בנוסף, צריך להוסיף תלות חדשה ב-Compose Runtime Tracing:

implementation("androidx.compose.runtime:runtime-tracing:1.12.1")

אם אתם משתמשים ב-Compose BOM, אתם לא צריכים לציין את הגרסה:

val composeBom = platform("androidx.compose:compose-bom:2026.09.00")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

בעזרת התלות הזו, כשמבצעים מעקב מערכת שכולל הרכבה מחדש, אפשר לראות את הפונקציות הקומפוזביליות באופן אוטומטי.

תיעוד עקבות המערכת

כדי לתעד את עקבות המערכת ולראות את מעקב הקומפוזיציה החדש בפעולה, פועלים לפי השלבים הבאים:

  1. פותחים את כלי הניתוח:

    ‫Android Studio – התחלת יצירת פרופיל
    איור 2. ‫Android Studio – התחלת יצירת פרופיל
  2. לוחצים על ציר הזמן של המעבד (CPU).

    ‫Android Studio Profiler – ציר הזמן של המעבד (CPU)
    איור 3. ‫Android Studio Profiler – ציר הזמן של המעבד (CPU)
  3. עוברים באפליקציה לממשק המשתמש שרוצים לתעד את העקבות שלו, ואז בוחרים באפשרות System Trace (עקבות המערכת) ולוחצים על Record (הקלטה).

    אפשרויות מעקב – עקבות המערכת
    איור 4. אפשרויות מעקב – עקבות המערכת
  4. משתמשים באפליקציה כדי לגרום ליצירה מחדש ולהפסיק את ההקלטה. אחרי שהמעקב עבר עיבוד ומופיע, אתם אמורים לראות את ה-composables במעקב אחרי הקומפוזיציה. אתם יכולים להשתמש במקלדת ובעכבר כדי להגדיל, להקטין ולהזיז את התצוגה של המעקב. אם אתם לא יודעים איך לנווט במעקב, קראו את המאמר תיעוד מעקבים.

    דוגמה להמחשה חזותית של עקבות המערכת ב-Android Studio.
    איור 5. עקבות המערכת

    לחיצה כפולה על רכיב Composable בתרשים תעביר אתכם לקוד המקור שלו.

  5. אפשר גם לראות רכיבים קומפוזביליים בתרשים הלהבה, יחד עם הקובץ ומספר השורה:

    דוגמה לתרשים להבה שמציג פונקציות קומפוזביליות.
    איור 6. תרשים להבות (flame chart)

נקודות שצריך לשים לב אליהן

כשמשתמשים במעקב אחרי קומפוזיציה, חשוב להביא בחשבון את ההסתייגויות הבאות לגבי גודל ה-APK והביצועים.

תקורה של גודל ה-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 בהתאם לאפליקציות שניתן ליצור להן פרופיל.

איך מתעדים מעקב מהטרמינל

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

הוספת יחסי תלות

קודם כול, מוסיפים את יחסי התלות הנוספים לאפליקציה.

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

פקודה ליצירת רשומה

  1. יוצרים פקודת הקלטה באמצעות Perfetto.
  2. מוסיפים באופן ידני את הקטע של מקור הנתונים 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

תיעוד מעקב

  1. מפעילים את האפליקציה ומכינים את הקטע שרוצים לעקוב אחריו.
  2. מפעילים את המעקב באפליקציה באמצעות שידור.

    # 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
    
  3. מפעילים את פקודת ההקלטה שיצרתם קודם.

פתיחת המעקב

  1. adb pull <location> את המעקב מהמכשיר (המיקום שצוין בפקודת ההקלטה).

  2. פותחים ב-Perfetto.

תיעוד מעקב באמצעות Jetpack Macrobenchmark

אתם יכולים למדוד את הביצועים באמצעות Jetpack Macrobenchmark, שמספק מעקבים כתוצאות. כדי להפעיל מעקב אחר קומפוזיציה באמצעות macrobenchmarks, צריך:

  1. מוסיפים את יחסי התלות הבאים למודול הבדיקה Macrobenchmark:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. לפני שמריצים את נקודות ההשוואה, מוסיפים את ארגומנט האינסטרומנטציה androidx.benchmark.fullTracing.enable=true. מידע נוסף על ארגומנטים של אינסטרומנטציה להשוואה זמין במאמר בנושא ארגומנטים של אינסטרומנטציה להשוואה.

מעקב אחרי הרכבה מחדש

מעקב אחרי קומפוזיציה מחדש מוסיף למעקב את הקריאות והכתיבה של המצב שגורמות לפונקציות קומפוזביליות לבצע קומפוזיציה מחדש, בנוסף לפונקציות הקומפוזביליות ממעקב אחרי קומפוזיציה. כך אפשר לגלות איזה שינוי במצב הפעיל את ה-recomposition.

למעקב אחרי קומפוזיציה מחדש יש תקורה גבוהה יותר מאשר למעקב אחרי קומפוזיציה, לכן צריך להשתמש בו כדי לנפות באגים בקומפוזיציות מחדש, ולא כדי למדוד את הביצועים.

הגדרת מעקב אחרי יצירה מחדש של קומפוזיציה

מוסיפים למודול האפליקציה תלות ב-Compose Runtime Tracing בגרסה 1.13.0 ואילך:

// Compose BOM 2026.11.00+ (runtime-tracing 1.13.0+)
implementation("androidx.compose.runtime:runtime-tracing")

המכשיר או האמולטור שבו אתם מריצים את המעקב חייב להיות ברמת API‏ 29 ומעלה.

תיעוד מעקב אחרי הרכבה מחדש

משתמשים בסקריפט record_recomposition_trace.py כדי לתעד מעקב אחרי הרכבה מחדש מהטרמינל.

  1. מפעילים את האפליקציה ומכינים את הקטע שרוצים לעקוב אחריו.
  2. התחלת ההקלטה:

    ./record_recomposition_trace.py -p <your app package>
  3. משתמשים באפליקציה כדי לגרום ליצירה מחדש, ואז לוחצים על Control+C כדי להפסיק את ההקלטה. כדי להקליט למשך זמן קבוע, צריך להעביר את משך הזמן בשניות באמצעות -t, לדוגמה -t 10.

הסקריפט מפעיל מעקב אחרי קומפוזיציה וקומפוזיציה מחדש באפליקציה, מתעד את עקבות המערכת, ואז משבית את המעקב ושומר את כל העקבות בקובץ <package>-recompose-<timestamp>.zip אחד בספרייה הנוכחית. פותחים את הקובץ ב-Perfetto.

כשבוחרים כתיבת מצב, מוצג סטאק הביצוע ששינה את המצב, וחץ זרימה מצביע על ה-recomposition שנגרם כתוצאה מכך:

מעקב אחרי קומפוזיציה מחדש ב-Perfetto עם כתיבת מצב שנבחרה, סטאק הביצוע שלה וחץ זרימה לקומפוזיציה מחדש שהיא גרמה לה.
איור 7. מעקב אחרי הרכבה מחדש ב-Perfetto

מריצים את הסקריפט עם --help כדי לראות את כל האפשרויות, כמו הגדרות אישיות של Perfetto או שטח אחסון זמני של המעקב.

משוב

נשמח לקבל מכם משוב על התכונה הזו, על באגים שנתקלתם בהם ועל בקשות שיש לכם. אתם יכולים לשלוח לנו משוב באמצעות הכלי למעקב אחר בעיות.