Четверг , Ноябрь 16 2017
Главная / Кодинг / Systrace: ускорение Андроид приложений

Systrace: ускорение Андроид приложений

Найти узкие места в достаточно простом приложении, которое вы написали за несколько дней, несложно. Достаточно следовать правилам. Но когда речь заходит о действительно большом проекте, без специальных инструментов не обойтись.

Systrace — один из важнейших инструментов, которые вы должны освоить. Это трассировщик, который позволяет проследить, что происходит на устройстве во время работы приложения. В частности, он наглядно покажет, как происходит отрисовка каждого кадра, какие кадры были отрисованы вовремя, а какие системе пришлось выбросить.

Systrace можно запустить с помощью Android Device Monitor, который, в свою очередь, находится в меню Tools → Android в Android Studio. Открываем Android Device Monitor, дожидаемся, пока он обнаружит смартфон, выбираем приложение и нажимаем кнопку запуска трассировки.

Systrace

В открывшимся окне запуска оставляем все настройки как есть и нажимаем Ok. Трассировка продолжится пять секунд, после чего будет сформирован HTML-файл с данными (в *nix это файл trace.html в домашнем каталоге). Его следует открыть в браузере.

Systrace
Отчет о трассировке

При первом взгляде отчет Systrace вводит в замешательство — огромное количество непонятно что значащих данных. К счастью, большая часть этих данных вам не понадобится, вас интересуют только строки Frames, UI Thread и RenderThread.

Frames показывает обновления экрана. Каждый кадр — это кружок одного из трех цветов: зеленый, желтый, красный. Зеленый означает, что кадр был отрисован за 16,6 мс, желтый и красный — отрисовка кадра заняла больше 16,6 мс, то есть фреймрейт падает. Сразу под строкой Frames находится строка UI Thread, с помощью которой можно проанализировать, какие шаги выполнила система для отображения фрейма.

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

Systrace позволяет оценить, на каком этапе произошла задержка отрисовки. Но он не скажет вам, была ли проблема вызвана вашим кодом, и если да, то где конкретно узкое место. Чтобы найти проблему, вывод Systrace можно детализировать, добавив в код приложения маркеры, которые позволят оценить, сколько времени занимает выполнение вашего собственного кода. Пример трассировки метода onBindViewHolder:

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Trace.beginSection("MyAdapter.onBindViewHolder");
try {
try {
Trace.beginSection("MyAdapter.queryDatabase");
RowItem rowItem = queryDatabase(position);
mDataset.add(rowItem);
} finally {
Trace.endSection();
}
holder.bind(mDataset.get(position));
} finally {
Trace.endSection();
}
}

Есть более простой инструмент трассировки, встроенный в Android. Просто включи опцию Developer options → Profile GPU rendering → On screen as bars, и на экране появится график. По оси X — кадры, по оси Y — столбцы, отображающие длительность отрисовки каждого кадра. Если столбец выше зеленой черты — на отрисовку кадра ушло больше 16,6 мс.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *