Как запрашивать профили с помощью PerfettoSQL

Вы можете запрашивать профили ProfilingManager, используя PerfettoSQL и модули из стандартной библиотеки Perfetto. Поскольку ProfilingManager редактирует трассировки системы, чтобы они содержали только данные о процессах вашего приложения, запросы к стандартным библиотекам на уровне системы, зависящие от других процессов, не поддерживаются. Однако большинство запросов в области действия приложения и стандартных модулей библиотеки работают без изменений. Дополнительные готовые запросы можно найти в статье Анализ трассировок Android.

Примеры запросов ProfilingManager

Вы можете использовать приведенные ниже примеры запросов или взять их за основу для собственных запросов PerfettoSQL.

Найти наиболее часто повторяющиеся фрагменты

Повторяющиеся фрагменты часто указывают на избыточную работу. Подробную информацию о синтаксисе функций можно найти в статье Определение функций в PerfettoSQL. В следующем запросе определяется многократно используемая функция PerfettoSQL, которая находит фрагменты, соответствующие шаблону GLOB, и сортирует их по частоте:

-- You only need to call this once in the session to create or update the function
CREATE OR REPLACE 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*')

Запросы, связанные с задержками

Чтобы найти в трассировке системы медленные или дергающиеся кадры, используйте следующие запросы.

Как найти медленно формирующиеся кадры

Этот запрос находит кадры, отрисовка которых занимает больше 16,6 мс (60 Гц). Поскольку Perfetto хранит длительность срезов в наносекундах, dur сравнивается с 16660000:

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 GLOB '*App Deadline Missed*';

Найти объекты с наибольшим количеством дубликатов

В дампе кучи Java этот запрос возвращает 100 классов с двумя или более экземплярами, чтобы помочь вам обнаружить непреднамеренные дубликаты или возможности кэширования:

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

Задержка при холодном запуске

Этот запрос оценивает время до первого кадра (TTFF) при холодном запуске, измеряя длительность между bindApplication и первым фрагментом Choreographer#doFrame:

-- This function finds slices that match the given GLOB $pattern
CREATE OR REPLACE PERFETTO 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)