Запросы к профилям ProfilingManager аналогичны запросам к обычным профилям Perfetto. Поэтому ознакомьтесь с руководством «Начало работы с PerfettoSQL» , чтобы узнать, как выполнять запросы к профилям.
Важное отличие между обычными трассировками Perfetto и трассировками ProfilingManager заключается в том, что трассировки ProfilingManager проходят через редактор трассировок. Этот редактор удаляет информацию о других процессах, не связанных с вашим приложением, по соображениям конфиденциальности.
Некоторые запросы из стандартной библиотеки Perfetto неприменимы к отредактированным трассировкам. Это связано с тем, что ProfilingManager собирает данные профилирования только для вашего приложения, а не для других процессов. В результате набор запросов, которые можно использовать с ProfilingManager , меньше, чем для полных системных профилей, записанных с помощью локального Perfetto.
Несмотря на сокращение объема пространства для запросов, вы по-прежнему можете использовать многие запросы и таблицы PerfettoSQL из стандартной библиотеки Perfetto в неизменном виде, поэтому мы рекомендуем вам попробовать их.
Мы также рекомендуем ознакомиться с разделом «Анализ трассировок Android» , чтобы найти готовые запросы, предоставляющие полезные данные о производительности без каких-либо изменений.
Примеры запросов ProfilingManager
Для упрощения работы с запросами в этом разделе представлен список запросов, совместимых с ProfilingManager . Вы можете использовать эти запросы напрямую или в качестве примеров для создания других запросов.
Найдите наиболее часто повторяющиеся фрагменты.
Этот запрос находит повторяющиеся фрагменты в трассировке и сортирует их по частоте появления, отображая наиболее часто дублирующиеся фрагменты в начале.
Обнаружение дублирующейся работы — распространенный способ выявления ненужной работы в трассировке.
-- 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*')
Запросы Янка
Найти медленные кадры
Этот запрос находит кадры, для генерации которых вашему приложению требуется слишком много времени, при условии ожидаемой частоты кадров 60 Гц (16,6 мс). Значение dur установлено равным 16 660 000, поскольку длительность срезов в таблицах Perfetto хранится в наносекундах.
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 = 'App Deadline Missed';
Этот запрос полезен для поиска мест в трассировке, где возникают задержки, вызванные слишком долгим созданием кадра приложением. Это означает, что поток пользовательского интерфейса не смог создать кадр. В крайних случаях это может предшествовать ошибке ANR.
Найти наиболее часто повторяющиеся объекты
Вы также можете запрашивать профили, связанные с памятью, например, дампы кучи, для выполнения более сложного анализа памяти.
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
Этот запрос возвращает 100 наиболее часто дублирующихся объектов. Это может помочь вам найти объекты, которые создаются несколько раз, что может выявить возможности для их кэширования или обнаружить непреднамеренные дубликаты.
Задержка при холодном запуске
Вы также можете выполнить запрос по времени запуска. В этом разделе представлен более подробный запрос для оценки времени холодного запуска в трассировке.
-- 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)
Этот запрос генерирует фрагмент, представляющий собой промежуток времени между двумя фрагментами, определяющими время запуска: bindApplication (обычно находящийся в начале холодного запуска приложения) и первым фрагментом Choreographer#doFrame (первый сгенерированный кадр). Этот показатель эффективно оценивает TTFF (время до первого кадра) при холодном запуске.