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

В современном мире мобильных приложений бесперебойная работа приложения — это не просто функция, а необходимость. Медленная загрузка, неотзывчивый интерфейс и нестабильность могут стать серьезным препятствием для вовлечения и удержания пользователей. В ходе работы с командой Android Developer Relations инженеры Reddit использовали показатель производительности приложения (App Performance Score) для оценки своего приложения. После оценки производительности они выявили значительный потенциал для улучшения и решили предпринять шаги для раскрытия всего потенциала R8, оптимизатора приложений для Android . Эта целенаправленная инициатива привела к значительному улучшению времени запуска, сокращению количества медленных или зависших кадров и ошибок ANR, а также к общему повышению рейтинга в Play Store. В этом тематическом исследовании подробно рассказывается о том, как Reddit добился этих впечатляющих результатов.
Как R8 Optimizer помог пользователям Reddit
R8 Optimizer — это основополагающий инструмент для оптимизации производительности Android. Он выполняет различные шаги для улучшения производительности приложений. Давайте кратко рассмотрим наиболее важные из них.
- «Удаление лишнего кода» (tree shaking) — важнейший шаг для уменьшения размера приложения. На этом этапе удаляется неиспользуемый код из зависимостей приложения и самого приложения.
- Встраивание методов заменяет вызовы методов фактическим кодом, что повышает производительность приложения.
- Для повышения компактности кода применяются слияние классов и другие стратегии. На данном этапе речь идёт уже не о читаемости исходного кода человеком, а о быстрой работе скомпилированного кода. Поэтому абстракции, такие как интерфейсы или иерархии классов, здесь не имеют значения и будут удалены.
- Минификация идентификаторов изменяет имена классов, полей и методов на более короткие, бессмысленные имена. Так, вместо
MyDataModelвы можете получить класс с именем a. - Сжатие ресурсов удаляет неиспользуемые ресурсы, такие как XML-файлы и изображения, что позволяет еще больше уменьшить размер приложения.

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

Как R8 улучшил производительность приложения Reddit
Команда отметила 40-процентное ускорение холодного запуска , 30-процентное снижение количества ошибок "Приложение не отвечает" (ANR) , 25-процентное улучшение отрисовки кадров и 14-процентное уменьшение размера приложения .
Эти улучшения имеют решающее значение для удовлетворенности пользователей. Более быстрая загрузка означает меньшее время ожидания и более быстрый доступ к контенту. Меньшее количество ошибок ANR приводит к более стабильной и надежной работе приложения, снижая уровень разочарования пользователей. Более плавная отрисовка кадров устраняет рывки пользовательского интерфейса, делая прокрутку и анимацию плавными и отзывчивыми. Это положительное техническое влияние также было четко видно в отзывах пользователей.
Показатели удовлетворенности пользователей, свидетельствующие об успехе оптимизации, были непосредственно видны в Google Play Store. После выпуска оптимизированной для R8 версии команда отметила резкое и позитивное изменение в отношении пользователей и их вовлеченности.

Дрю Хевнер: «Раскрытие всего потенциала инструмента 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% больше кадров . Наконец, размер приложения уменьшился более чем на треть.

Общие улучшения производительности 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.
Продолжить чтение

Примеры из практики
Monzo — это британский цифровой банк с 15 миллионами клиентов, и их число продолжает расти. По мере масштабирования приложения команда разработчиков определила время запуска приложения как критическую область для улучшения, но опасалась, что это потребует значительных изменений в коде.
Ben Weiss , Tracy Agyemang • 2 мин чтения

Примеры из практики
Приложение для развития осознанности Gratitude поощряет последовательность с помощью коротких ежедневных записей в дневнике, аффирмаций и досок визуализации. Приложение скачали более 6 миллионов раз, оно получило 150 тысяч пятизвездочных оценок и содержит 100 миллионов записей в дневнике.
Amrit Sanjeev , Ash Nohe • 3 мин чтения

Примеры из практики
Karrot — это локальное, основанное на взаимодействии между пользователями приложение-маркетплейс, позволяющее покупать, продавать и обмениваться товарами с другими проверенными пользователями. С момента запуска в Южной Корее в 2015 году платформа расширилась на мировые рынки, собрав более 43 миллионов зарегистрированных пользователей.
Thomas Ezan , Tracy Agyemang • Чтение 2 минуты
Будьте в курсе событий
Получайте еженедельно самые свежие новости о разработке Android прямо на свою электронную почту.





