Wysyłanie zapytań do profili ProfilingManager jest podobne do wysyłania zapytań do zwykłych profili Perfetto. Dlatego zapoznaj się z tym przewodnikiem, aby dowiedzieć się, jak wysyłać zapytania do profili.
Istotną różnicą między zwykłymi śladami Perfetto a śladami ProfilingManager jest to, że te ostatnie przechodzą przez redaktor śladów.ProfilingManager Ten redaktor usuwa informacje o innych procesach niezwiązanych z Twoją aplikacją ze względu na ochronę prywatności.
Niektóre zapytania ze standardowej biblioteki Perfetto nie działają w przypadku zanonimizowanych śladów. Dzieje się tak, ponieważ ProfilingManager zbiera dane profilowania tylko w przypadku Twojej aplikacji, a nie innych procesów. W rezultacie zapytania, których możesz używać w przypadku ProfilingManager, stanowią mniejszy zbiór niż zapytania dotyczące pełnych profili systemowych rejestrowanych za pomocą lokalnego narzędzia Perfetto.
Mimo że przestrzeń zapytań jest mniejsza, nadal możesz używać wielu zapytań i tabel PerfettoSQL z standardowej biblioteki Perfetto w niezmienionej postaci, więc zachęcamy do ich wypróbowania.
Zalecamy też zapoznanie się z artykułem Analizowanie śladów Androida, aby znaleźć gotowe zapytania, które bez modyfikacji dostarczają przydatnych danych o wydajności.
Przykładowe zapytania ProfilingManager
Aby ułatwić Ci tworzenie zapytań, w tej sekcji znajdziesz listę zapytań, które działają w przypadku ProfilingManager. Możesz używać tych zapytań bezpośrednio lub jako przykładów do tworzenia innych zapytań.
Znajdowanie najczęściej powielanych wycinków
To zapytanie wyszukuje powtarzające się wycinki w śladzie i sortuje je według częstotliwości występowania, wyświetlając najpierw te, które się najczęściej powtarzają.
Wyszukiwanie zduplikowanej pracy to powszechny sposób na znalezienie w śladzie niepotrzebnych działań.
-- 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*')
Zapytania dotyczące zacięć
Wyszukiwanie spowolnionych klatek
To zapytanie wyszukuje klatki, w przypadku których aplikacja zbyt długo generuje klatkę, przy założeniu oczekiwanej liczby klatek na sekundę wynoszącej 60 Hz (16,6 ms). Wartość dur jest ustawiona na 16 660 000, ponieważ czas trwania wycinków w tabelach Perfetto jest przechowywany w nanosekundach.
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM android_frames WHERE dur > 16660000;
Znajdowanie klatek powodujących zacinanie
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';
To zapytanie przydaje się do znajdowania w śladzie miejsc, w których występuje zacinanie, ponieważ aplikacja zbyt długo generuje klatkę. Oznacza to, że wątek interfejsu nie zdołał wygenerować ramki. W ekstremalnych okolicznościach może to poprzedzać błąd ANR.
Znajdowanie najczęściej duplikowanych obiektów
Możesz też wysyłać zapytania dotyczące profili związanych z pamięcią, np. zrzutów sterty, aby przeprowadzać bardziej złożone analizy pamięci.
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
To zapytanie zwraca 100 najczęściej duplikowanych obiektów. Może to pomóc w znalezieniu obiektów, które są tworzone wiele razy, co może ujawnić możliwości ich buforowania lub zidentyfikować niezamierzone duplikaty.
Opóźnienie uruchomienia „na zimno”
Możesz też wyszukiwać startupy. W tej sekcji znajdziesz bardziej złożone zapytanie, które pozwala oszacować czas uruchamiania „na zimno” w logu czasu.
-- 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)
To zapytanie generuje wycinek, który reprezentuje czas między 2 wycinkami określającymi czas uruchamiania: bindApplication (zwykle występuje na początku zimnego uruchamiania aplikacji) i pierwszym wycinkiem Choreographer#doFrame (pierwsza wygenerowana klatka). Ten wskaźnik skutecznie szacuje czas uruchomienia „na zimno” TTFF (czas do pierwszej klatki).