Anda dapat membuat kueri profil ProfilingManager menggunakan PerfettoSQL dan modul
dari Library Standar Perfetto. Karena ProfilingManager menyunting
pelacakan sistem untuk hanya menyertakan data proses aplikasi Anda, kueri library standar
seluruh sistem yang bergantung pada proses lain tidak didukung. Namun, sebagian besar
kueri cakupan aplikasi dan modul library standar berfungsi tanpa modifikasi. Untuk
kueri siap pakai tambahan, lihat Menganalisis Trace Android.
Contoh kueri ProfilingManager
Gunakan contoh kueri berikut secara langsung atau sebagai template untuk analisis PerfettoSQL Anda sendiri.
Menemukan slice yang paling banyak diduplikasi
Slice yang berulang sering kali menunjukkan pekerjaan yang redundan. Untuk mengetahui detail tentang sintaksis fungsi,
lihat Menentukan fungsi di PerfettoSQL. Kueri berikut menentukan
fungsi PerfettoSQL yang dapat digunakan kembali yang menemukan slice yang cocok dengan pola GLOB dan
mengurutkannya berdasarkan frekuensi:
-- 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*')
Kueri jank
Gunakan kueri berikut untuk mengidentifikasi frame yang lambat atau janky dalam pelacakan sistem.
Menemukan frame lambat
Kueri ini menemukan frame yang memerlukan waktu lebih dari 16,6 md (60 Hz) untuk dirender. Karena
Perfetto menyimpan durasi slice dalam nanodetik, dur dibandingkan dengan
16660000:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
Menemukan frame penyebab jank
Kueri ini menggunakan modul frame timeline untuk menemukan frame yang melewatkan batas waktu rendering aplikasi sesuai dengan kecepatan refresh perangkat:
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type GLOB '*App Deadline Missed*';
Menemukan objek yang paling banyak diduplikasi
Dalam heap dump Java, kueri ini menampilkan 100 class teratas dengan dua instance atau lebih untuk membantu Anda menemukan duplikat yang tidak diinginkan atau peluang caching:
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
Latensi cold startup
Kueri ini memperkirakan waktu cold startup hingga frame pertama (TTFF) dengan mengukur
durasi antara bindApplication dan slice Choreographer#doFrame pertama:
-- 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)