Примеры из практики

Как Reddit использовал оптимизатор R8 для существенного повышения производительности

4 минуты чтения
Ben Weiss
Инженер по связям с разработчиками

В современном мире мобильных приложений бесперебойная работа приложения — это не просто функция, а необходимость. Медленная загрузка, неотзывчивый интерфейс и нестабильность могут стать серьезным препятствием для вовлечения и удержания пользователей. В ходе работы с командой Android Developer Relations инженеры Reddit использовали показатель производительности приложения (App Performance Score) для оценки своего приложения. После оценки производительности они выявили значительный потенциал для улучшения и решили предпринять шаги для раскрытия всего потенциала R8, оптимизатора приложений для Android . Эта целенаправленная инициатива привела к значительному улучшению времени запуска, сокращению количества медленных или зависших кадров и ошибок ANR, а также к общему повышению рейтинга в Play Store. В этом тематическом исследовании подробно рассказывается о том, как Reddit добился этих впечатляющих результатов.

Как R8 Optimizer помог пользователям Reddit

R8 Optimizer — это основополагающий инструмент для оптимизации производительности Android. Он выполняет различные шаги для улучшения производительности приложений. Давайте кратко рассмотрим наиболее важные из них.

  • «Удаление лишнего кода» (tree shaking) — важнейший шаг для уменьшения размера приложения. На этом этапе удаляется неиспользуемый код из зависимостей приложения и самого приложения.
  • Встраивание методов заменяет вызовы методов фактическим кодом, что повышает производительность приложения.
  • Для повышения компактности кода применяются слияние классов и другие стратегии. На данном этапе речь идёт уже не о читаемости исходного кода человеком, а о быстрой работе скомпилированного кода. Поэтому абстракции, такие как интерфейсы или иерархии классов, здесь не имеют значения и будут удалены.
  • Минификация идентификаторов изменяет имена классов, полей и методов на более короткие, бессмысленные имена. Так, вместо MyDataModel вы можете получить класс с именем a.
  • Сжатие ресурсов удаляет неиспользуемые ресурсы, такие как XML-файлы и изображения, что позволяет еще больше уменьшить размер приложения.
image.png

Основные этапы оптимизации R8

От точных данных к удовлетворенности пользователей: определение успеха в производстве.

После выхода новой версии приложения Reddit сразу же отметил улучшение производительности. Используя Android Vitals и Crashlytics , Reddit смог собрать данные о производительности на реальных устройствах с участием реальных пользователей, что позволило сравнить новую версию с предыдущими.

image.png

Как R8 улучшил производительность приложения Reddit

Команда отметила 40-процентное ускорение холодного запуска , 30-процентное снижение количества ошибок "Приложение не отвечает" (ANR) , 25-процентное улучшение отрисовки кадров и 14-процентное уменьшение размера приложения .

Эти улучшения имеют решающее значение для удовлетворенности пользователей. Более быстрая загрузка означает меньшее время ожидания и более быстрый доступ к контенту. Меньшее количество ошибок ANR приводит к более стабильной и надежной работе приложения, снижая уровень разочарования пользователей. Более плавная отрисовка кадров устраняет рывки пользовательского интерфейса, делая прокрутку и анимацию плавными и отзывчивыми. Это положительное техническое влияние также было четко видно в отзывах пользователей.

Показатели удовлетворенности пользователей, свидетельствующие об успехе оптимизации, были непосредственно видны в Google Play Store. После выпуска оптимизированной для R8 версии команда отметила резкое и позитивное изменение в отношении пользователей и их вовлеченности.

image.png

Дрю Хевнер: «Раскрытие всего потенциала инструмента R8 менее чем за 2 недели»

Что особенно впечатляет, так это то, что это было достигнуто благодаря целенаправленным усилиям. Дрю Хевнер, ведущий инженер-программист Reddit, работавший над этой инициативой, отметил, что внедрение изменений, позволяющих раскрыть весь потенциал R8, заняло менее двух недель .

Подтверждение роста: подробный анализ с использованием макроэкономических показателей.

После наблюдения за значительными улучшениями в реальных условиях команда разработчиков Reddit и команда по связям с разработчиками Android в Google провели подробные сравнительные тесты, чтобы научно подтвердить достигнутые результаты и поэкспериментировать с дальнейшими оптимизациями. Для этого анализа команда разработчиков Reddit предоставила две версии своего приложения: одну без оптимизаций и другую, в которой применялся R8 и два более базовых инструмента оптимизации производительности: базовые профили и профили запуска .

Профили базовой конфигурации эффективно переносят этапы компиляции «на лету» (JIT) с пользовательских устройств на машины разработчиков. Сгенерированный код, скомпилированный «заранее» (AOT), доказал свою эффективность в сокращении времени запуска и решении проблем с рендерингом.

При упаковке приложения d8 dexer берет классы и методы и формирует файлы classes.dex вашего приложения. Когда пользователь открывает приложение, эти файлы dex загружаются один за другим, пока приложение не сможет запуститься. Предоставив профиль запуска, вы сообщаете d8, какие классы и методы следует упаковать в первые файлы classes.dex . Такая структура позволяет приложению загружать меньше файлов, что, в свою очередь, повышает скорость запуска.

Jetpack Macrobenchmark стал ключевым инструментом на этом этапе, позволяющим точно измерять взаимодействие пользователя с приложением в контролируемой среде. Для имитации типичного пользовательского сценария они использовали API UIAutomator для создания теста, который открывал приложение, трижды прокручивал страницу вниз, а затем снова прокручивал её вверх.

В итоге для написания теста производительности потребовалось лишь следующее:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

Результаты сравнительных тестов подтвердили наблюдения на практике и предоставили более глубокое понимание ситуации. Полностью оптимизированное приложение запускалось на 55% быстрее , а пользователи могли начать просмотр на 18% раньше . Оптимизированное приложение также продемонстрировало сокращение количества операций компиляции «на лету» (JIT) на две трети и сокращение времени компиляции на одну треть . Улучшилась отрисовка кадров, в результате чего за время выполнения тестовой задачи было отрисовано на 19% больше кадров . Наконец, размер приложения уменьшился более чем на треть.

image.png

Общие улучшения производительности Reddit

Время JIT-компиляции можно измерить с помощью пользовательской метрики трассировки Macrobenchmark, например, такой:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

Технология, лежащая в основе трансформации: R8

Чтобы включить R8 в полнофункциональном режиме, необходимо настроить файл app/build.gradle.kts , установив параметры minifyEnabled и shrinkResources в true для типа сборки release.

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

За этим этапом должно последовать комплексное сквозное тестирование, поскольку оптимизация производительности может привести к нежелательному поведению, которое лучше обнаружить до того, как это заметят пользователи.

Как было показано ранее в этой статье, R8 выполняет обширные оптимизации для максимального повышения производительности. R8 вносит существенные изменения в код, включая переименование, перемещение и удаление классов, полей и методов. Если вы обнаружите, что эти изменения вызывают ошибки, вам необходимо указать, какие части кода R8 не должен изменять, указав их в правилах keep .

Следуйте примеру Reddit в своем приложении.

Успех Reddit с R8 служит убедительным примером для любой команды разработчиков, стремящейся значительно улучшить производительность своего приложения, не прилагая больших усилий. Прямая корреляция между техническими улучшениями и последующим ростом удовлетворенности пользователей подчеркивает ценность оптимизации производительности.

Следуя плану, изложенному в этом тематическом исследовании — используя такие инструменты, как оценка производительности приложения (App Performance Score) , для выявления возможностей оптимизации, раскрывая весь потенциал оптимизации R8, отслеживая реальные данные и используя бенчмарки для подтверждения и углубления понимания — другие разработчики смогут добиться аналогичных результатов.

Чтобы начать работу с R8 в своем приложении, обратитесь к недавно обновленной официальной документации и рекомендациям по включению, настройке и устранению неполадок оптимизатора R8.

    Автор:

    Продолжить чтение