Запросы к профилям 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';
Этот запрос полезен для поиска мест, где в трассировке происходит зависание, поскольку приложению требуется слишком много времени для создания кадра. Это означает, что поток UI не смог сгенерировать кадр. В крайних случаях это может привести к ошибке 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 (первым сгенерированным кадром). Этот показатель позволяет оценить время до первого кадра при холодном запуске.