שאילתות לפרופילים באמצעות PerfettoSQL

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

שאילתות לדוגמה ב-ProfilingManager

אתם יכולים להשתמש בשאילתות לדוגמה הבאות ישירות או כתבניות לניתוח PerfettoSQL משלכם.

איך מוצאים את הפרוסות (slice) הכי משוכפלות

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

-- You only need to call this once in the session to create or update the function
CREATE OR REPLACE PERFETTO FUNCTION find_duplicates(pattern STRING) RETURNS
TABLE(name STRING, count_slice LONG) AS SELECT name, COUNT(dur) as count_slice FROM slice WHERE name GLOB $pattern GROUP BY name HAVING COUNT(name) >= 2 ORDER BY count_slice DESC;

-- Subsequent calls can just use the function to find dupes
SELECT * FROM find_duplicates('*Text*')

שאילתות שקשורות לבעיות בממשק (jank)

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

איך למצוא פריימים איטיים

השאילתה הזו מוצאת פריימים שעיבוד התמונה שלהם נמשך יותר מ-16.6 אלפיות השנייה (60Hz). מכיוון ש-Perfetto מאחסן את משך הזמן של הפרוסות בננו-שניות, הערך של dur מושווה ל-16660000:

INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;

חיפוש פריימים שגורמים לבעיות בממשק (jank)

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

INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type GLOB '*App Deadline Missed*';

חיפוש האובייקטים שיש להם הכי הרבה כפילויות

בתמונת מצב של הזיכרון ב-Java, השאילתה הזו מחזירה את 100 המחלקות שיש להן הכי הרבה מופעים (שניים או יותר), כדי לעזור לכם לזהות כפילויות לא מכוונות או הזדמנויות לשמירה במטמון:

INCLUDE PERFETTO MODULE android.memory.heap_graph.heap_graph_class_aggregation;

SELECT * FROM android_heap_graph_class_aggregation WHERE obj_count >= 2
ORDER BY obj_count DESC LIMIT 100

זמן הטעינה של הפעלה מההתחלה (cold startup)

השאילתה הזו מעריכה את זמן ההפעלה מההתחלה (cold startup) עד להצגת הפריים הראשון (TTFF) על ידי מדידת משך הזמן בין bindApplication לפרוסה הראשונה של Choreographer#doFrame:

-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;

-- This function generates a slice that starts at $startSlicePattern and finishes at the slice matched by $endSlicePattern. If $inclusive is true, then the end slice dur will be added, otherwise, the end slice start time will be used.
CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
  (SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
  FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
  WHERE startToEndDur > 0)
GROUP BY name, ts;

-- Using these functions we can estimate cold startup time by generating a slice between bindApplication and first frame.
SELECT * from generate_start_to_end_slices('bindApplication','*Choreographer#doFrame [0-9]*', true)