ProfilingManager プロファイルに対してクエリを実行するには、PerfettoSQL と Perfetto 標準ライブラリのモジュールを使用します。ProfilingManager は、アプリのプロセスデータのみが含まれるようにシステム トレースを削除するため、他のプロセスに依存するシステム全体の標準ライブラリ クエリはサポートされていません。ただし、ほとんどのアプリ スコープのクエリと標準ライブラリ モジュールは、変更なしで動作します。すぐに使用できるその他のクエリについては、Android トレースの分析をご覧ください。
ProfilingManager のサンプルクエリ
次のサンプルクエリを直接使用するか、独自の PerfettoSQL 分析のテンプレートとして使用します。
最も重複しているスライスを見つける
スライスが繰り返されている場合は、多くの場合、冗長な処理が行われていることを示しています。関数の構文の詳細については、PerfettoSQL での関数の定義をご覧ください。次のクエリは、GLOB パターンに一致するスライスを検索し、頻度で並べ替える、再利用可能な PerfettoSQL 関数を定義します。
-- 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 ヒープダンプで、このクエリは 2 つ以上のインスタンスを持つ上位 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)