Wykonywanie zapytań dotyczących profili ProfilingManager jest podobne do wykonywania zapytań dotyczących zwykłych profili Perfetto. Dlatego zapoznaj się z przewodnikiem Pierwsze kroki z PerfettoSQL, aby dowiedzieć się, jak wykonywać zapytania dotyczące profili.
Ważną różnicą między zwykłymi śladami Perfetto a śladami ProfilingManager jest to, że ślady ProfilingManager przechodzą przez redaktor śladów. Ten redaktor usuwa informacje o innych procesach niezwiązanych z Twoją aplikacją ze względu na ochronę prywatności.
Niektórych zapytań z biblioteki standardowej Perfetto nie można używać w przypadku zredagowanych ś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ć z ProfilingManager, stanowią mniejszy zbiór niż zapytania dotyczące pełnych profili systemu zarejestrowanych za pomocą lokalnego Perfetto.
Mimo że przestrzeń zapytań jest mniejsza, nadal możesz używać wielu zapytań i tabel PerfettoSQL z biblioteki standardowej Perfetto w niezmienionej postaci, dlatego zachęcamy Cię do ich wypróbowania.
Zalecamy też zapoznanie się z artykułem Analizowanie śladów Androida, aby znaleźć gotowe do użycia zapytania, które bez modyfikacji dostarczają przydatnych danych o skuteczności.
Przykładowe zapytania ProfilingManager
Aby uprościć proces wykonywania zapytań, w tej sekcji znajdziesz listę zapytań, które działają z ProfilingManager. Możesz używać tych zapytań bezpośrednio lub jako przykładów do tworzenia innych zapytań.
Znajdowanie najbardziej zduplikowanych fragmentów
To zapytanie znajduje powtarzające się fragmenty w śladzie i sortuje je według częstotliwości występowania, wyświetlając najpierw najbardziej zduplikowane.
Znajdowanie zduplikowanej pracy to powszechny sposób na znalezienie niepotrzebnej pracy w śladzie.
-- 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ęć
Znajdowanie spowolnionych klatek
To zapytanie znajduje klatki, w których generowanie klatki przez aplikację trwa zbyt długo, 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 zacięcia
INCLUDE PERFETTO module android.frames.timeline;
SELECT * FROM actual_frame_timeline_slice WHERE jank_type = 'App Deadline Missed';
To zapytanie jest przydatne do znajdowania miejsc, w których w śladzie występują zacięcia, ponieważ generowanie klatki przez aplikację trwa zbyt długo. Oznacza to, że wątek UI nie zdołał wygenerować klatki. W skrajnych przypadkach może to poprzedzać błąd ANR.
Znajdowanie najbardziej zduplikowanych obiektów
Możesz też wykonywać zapytania dotyczące profili związanych z pamięcią, takich jak zrzuty 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 najbardziej zduplikowanych obiektów. Może to pomóc w znajdowaniu 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ż wykonywać zapytania dotyczące uruchamiania. W tej sekcji znajdziesz bardziej złożone zapytanie, które pozwala oszacować czas uruchomienia „na zimno” w śladzie.
-- 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 fragment, który reprezentuje czas między 2 fragmentami definiującymi czas uruchomienia: bindApplication (zwykle znajduje się na początku uruchomienia aplikacji „na zimno”) i pierwszym fragmentem Choreographer#doFrame (pierwsza wygenerowana klatka). Ten wskaźnik skutecznie szacuje czas do pierwszej klatki (TTFF) podczas uruchamiania „na zimno”.