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

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

יש שתי רמות של מעקב נתמכות ב-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.11.1")

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

תקורה של גודל ה-APK

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

אפשר להסיר את מחרוזות המעקב בגרסת הייצור על ידי הוספת כלל 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. מפעילים את פקודת ההקלטה שיצרתם קודם.

פתיחת ה-trace

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

  2. פתיחה ב-Perfetto.

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

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

  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 ארגומנט האינסטרומנטציה לפני שמריצים השוואות. מידע נוסף על ארגומנטים של אינסטרומנטציה של Macrobenchmark זמין במאמר בנושא ארגומנטים של אינסטרומנטציה של Macrobenchmark.

משוב

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