您可以使用 PerfettoSQL 和 Perfetto 標準程式庫中的模組,查詢 ProfilingManager 設定檔。由於 ProfilingManager 會遮蓋系統追蹤記錄,只納入應用程式的程序資料,因此不支援依賴其他程序的系統層級標準程式庫查詢。不過,大多數應用程式範圍查詢和標準程式庫模組都不需要修改。如需其他立即可用的查詢,請參閱「分析 Android 追蹤記錄」。
ProfilingManager 查詢範例
您可以直接使用下列查詢範例,或將其做為範本,進行自己的 PerfettoSQL 分析。
找出重複次數最多的切片
重複的配量通常代表有重複的工作。如要進一步瞭解函式語法,請參閱「在 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*')
卡頓查詢
使用下列查詢,找出系統追蹤記錄中緩慢或卡頓的影格。
找出緩慢影格
這項查詢會找出轉譯時間超過 16.6 毫秒 (60 Hz) 的影格。由於 Perfetto 會以奈秒為單位儲存片段時間長度,因此會將 dur 與 16660000 進行比較:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
找出導致卡頓的影格
這項查詢會使用影格時間軸模組,根據裝置的刷新率,找出應用程式未在轉譯期限內完成轉譯的影格:
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
冷啟動延遲
這項查詢會測量 bindApplication 和第一個 Choreographer#doFrame 切片之間的持續時間,藉此估算冷啟動到第一個影格的時間 (TTFF):
-- 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)