Membuat profil ProfilingManager kueri

Membuat kueri profil ProfilingManager mirip dengan membuat kueri profil Perfetto reguler. Oleh karena itu, tinjau Memulai PerfettoSQL untuk mendapatkan panduan tentang cara membuat kueri profil.

Perbedaan penting antara rekaman aktivitas Perfetto reguler dan rekaman aktivitas ProfilingManager adalah rekaman aktivitas ProfilingManager melewati peredaksi rekaman aktivitas. Redaktor ini menghapus informasi tentang proses lain yang tidak terkait dengan aplikasi Anda karena alasan privasi.

Beberapa kueri dari library standar Perfetto tidak dapat digunakan pada rekaman aktivitas yang disamarkan. Hal ini karena ProfilingManager hanya mengumpulkan data pembuatan profil untuk aplikasi Anda, bukan proses lainnya. Akibatnya, kueri yang dapat Anda gunakan dengan ProfilingManager adalah kumpulan yang lebih kecil daripada kueri untuk profil sistem lengkap yang direkam menggunakan Perfetto lokal.

Meskipun ruang kueri berkurang, Anda tetap dapat menggunakan banyak kueri dan tabel PerfettoSQL dari Perfetto Standard Library apa adanya, jadi sebaiknya Anda mencobanya.

Sebaiknya Anda juga meninjau Menganalisis Rekaman Aktivitas Android untuk menemukan kueri siap pakai yang memberikan data performa yang berguna tanpa perlu dimodifikasi.

Contoh kueri ProfilingManager

Untuk menyederhanakan perjalanan kueri, bagian ini menyediakan daftar kueri yang berfungsi dengan ProfilingManager. Anda dapat menggunakan kueri ini secara langsung atau sebagai contoh untuk membuat kueri lain.

Menemukan irisan yang paling banyak diduplikasi

Kueri ini menemukan slice berulang dalam rekaman aktivitas dan mengurutkannya berdasarkan frekuensi kemunculannya, dengan menampilkan slice yang paling sering diduplikasi terlebih dahulu.

Menemukan pekerjaan yang diduplikasi adalah cara umum untuk menemukan pekerjaan yang tidak perlu dalam rekaman aktivitas.

-- 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*')

Kueri jank

Menemukan frame lambat

Kueri ini menemukan frame saat aplikasi Anda membutuhkan waktu terlalu lama untuk menghasilkan frame, dengan asumsi kecepatan frame yang diharapkan adalah 60 Hz (16,6 md). dur disetel ke 16.660.000 karena durasi slice dalam tabel Perfetto disimpan dalam nanodetik.

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

Menemukan frame yang menyebabkan jank

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

Kueri ini berguna untuk menemukan lokasi terjadinya jank di rekaman aktivitas karena aplikasi membutuhkan waktu terlalu lama untuk membuat frame. Artinya, thread UI gagal membuat frame. Dalam situasi ekstrem, hal ini dapat mendahului ANR.

Menemukan objek yang paling banyak diduplikasi

Anda juga dapat membuat kueri profil terkait memori, seperti heap dump, untuk melakukan analisis memori yang lebih kompleks.

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

Kueri ini menampilkan 100 objek duplikat teratas. Hal ini dapat membantu Anda menemukan objek yang di-instantiate beberapa kali, yang dapat mengungkapkan peluang untuk melakukan caching atau mengidentifikasi duplikat yang tidak diinginkan.

Latensi startup dingin

Anda juga dapat membuat kueri untuk startup. Bagian ini memberikan kueri yang lebih rumit untuk memperkirakan waktu startup dingin dalam rekaman aktivitas.

-- 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)

Kueri ini menghasilkan slice yang merepresentasikan waktu antara dua slice yang menentukan waktu peluncuran: bindApplication (biasanya ditemukan di awal peluncuran aplikasi dingin) dan slice Choreographer#doFrame pertama (frame pertama yang dihasilkan). Metrik ini secara efektif memperkirakan TTFF (waktu ke frame pertama) saat startup dingin.