查詢 ProfilingManager 設定檔

查詢 ProfilingManager 設定檔的方式與查詢一般 Perfetto 設定檔類似。因此,請參閱「開始使用 PerfettoSQL」一文,瞭解如何查詢設定檔。

一般 Perfetto 追蹤記錄和 ProfilingManager 追蹤記錄的重要差異在於,ProfilingManager 追蹤記錄會經過追蹤記錄編輯器。基於隱私權考量,這項編輯器會移除與應用程式無關的其他程序資訊。

Perfetto 標準程式庫中的部分查詢無法用於已編輯的追蹤記錄。這是因為 ProfilingManager 只會收集您應用程式的剖析資料,不會收集其他程序的資料。因此,您可搭配 ProfilingManager 使用的查詢,會比使用本機 Perfetto 記錄完整系統設定檔時的查詢集小。

雖然查詢空間縮小,但您仍可直接使用 Perfetto 標準程式庫中的許多 PerfettoSQL 查詢和資料表,因此建議您試試看。

此外,我們也建議您參閱「分析 Android 追蹤記錄」,找出可直接使用的查詢,無須修改即可提供實用的效能資料。

ProfilingManager 查詢範例

為簡化查詢流程,本節提供可搭配 ProfilingManager 使用的查詢清單。您可以直接使用這些查詢,也可以做為範例來建構其他查詢。

找出重複次數最多的切片

這項查詢會在追蹤記錄中找出重複的切片,並依出現頻率排序,優先顯示重複次數最多的切片。

找出重複的工作是常見的做法,可協助您在追蹤記錄中找出不必要的工作。

-- You only need to call this once in the session to create the function
DROP TABLE IF EXISTS find_duplicates;
CREATE 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*')

卡頓查詢

找出緩慢影格

這項查詢會找出應用程式產生影格的時間過長 (假設預期影格速率為 60 Hz (16.6 毫秒)) 的影格。dur 設為 16,660,000,因為 Perfetto 表格中的切片時間長度是以奈秒為單位儲存。

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 = 'App Deadline Missed';

這項查詢有助於找出追蹤記錄中發生卡頓的位置,因為應用程式產生影格的時間過長。這表示 UI 執行緒無法產生影格。在極端情況下,這可能會先於 ANR 發生。

找出重複次數最多的物件

您也可以查詢記憶體相關設定檔 (例如堆積傾印),執行更複雜的記憶體分析。

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

這項查詢會傳回前 100 個重複物件。這有助於找出多次例項化的物件,進而發現快取物件的機會,或找出非預期的重複項目。

冷啟動延遲

你也可以查詢新創公司。本節提供更詳細的查詢,用於估算追蹤記錄中的冷啟動時間。

-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE 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)

這項查詢會產生一個切片,代表定義啟動時間的兩個切片之間的時間:bindApplication (通常位於應用程式冷啟動的開頭) 和第一個 Choreographer#doFrame 切片 (第一個產生的影格)。這項指標可有效估算冷啟動 TTFF (第一個影格顯示前的時間)。