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

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

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

In today's world of mobile applications, a seamless user experience is not just a feature—it's a necessity. Slow load times, unresponsive interfaces, and instability can be significant barriers to user engagement and retention. During their work with the Android Developer Relations team, the engineering team at Reddit used the App Performance Score to evaluate their app. After assessing their performance, they identified significant improvement potential and decided to take the steps to enable the full power of R8, the Android app optimizer . This focused initiative led to remarkable improvements in startup times, reductions in slow or frozen frames and ANRs, and an overall increase in Play Store ratings. This case study breaks down how Reddit achieved these impressive results.

Как 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.

    Автор:

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