Как Reddit использовал оптимизатор R8 для значительного повышения производительности
Время на чтение: 4 минуты
В современном мире мобильных приложений удобство для пользователей – это не просто функция, а необходимость. Медленная загрузка, неотзывчивый интерфейс и нестабильная работа могут стать серьезными препятствиями для вовлечения и удержания пользователей. В ходе сотрудничества с командой Android Developer Relations инженеры Reddit использовали оценку производительности приложения, чтобы проанализировать свой продукт. Они обнаружили, что его можно значительно улучшить, и решили задействовать все возможности R8 – оптимизатора приложений для Android. Это позволило значительно сократить время запуска, уменьшить количество медленных и зависших кадров, а также ошибок ANR и повысить оценки в Google Play. В этой статье мы расскажем, как Reddit удалось достичь таких впечатляющих результатов.
Как оптимизатор R8 помог Reddit
Оптимизатор R8 – это базовый инструмент для повышения производительности на Android. Чтобы повысить производительность приложения, нужно выполнить несколько шагов.Давайте рассмотрим самые важные из них.
- Tree shaking – это самый важный шаг для уменьшения размера приложения. При этом удаляется неиспользуемый код из зависимостей приложения и самого приложения.
- Встраивание методов заменяет вызовы методов фактическим кодом, что повышает производительность приложения.
- Объединение классов и другие стратегии, позволяющие сделать код более компактным. На этом этапе уже не важно, насколько легко человеку читать исходный код. Главное – чтобы скомпилированный код работал быстро. Поэтому абстракции, такие как интерфейсы или иерархии классов, здесь не имеют значения и будут удалены.
- Минификация идентификаторов заменяет названия классов, полей и методов на более короткие и бессмысленные. Вместо
MyDataModelвы можете получить класс с названием a. - Удаление неиспользуемых ресурсов , таких как XML-файлы и графические объекты, позволяет дополнительно уменьшить размер приложения.
Основные этапы оптимизации R8
От точных данных до удовлетворенности пользователей: как определить успех в рабочей среде
Reddit saw improved performance results immediately after a new version of the app was rolled out to users. С помощью Android Vitals и Crashlytics разработчики Reddit смогли собрать показатели эффективности на реальных устройствах с настоящими пользователями и сравнить новую версию с предыдущими.
Как R8 улучшил производительность приложения Reddit
В результате холодный запуск стал на 40% быстрее, количество ошибок "Приложение не отвечает" (ANR) снизилось на 30% , рендеринг кадров улучшился на 25% , а размер приложения уменьшился на 14% .
Эти улучшения имеют решающее значение для удовлетворенности пользователей. Чем быстрее запускается приложение, тем меньше времени уходит на ожидание и тем быстрее пользователь получает доступ к контенту. Чем меньше ошибок ANR, тем стабильнее и надежнее приложение и тем меньше недовольства оно вызывает у пользователей. Более плавная отрисовка кадров устраняет задержки в интерфейсе, делая прокрутку и анимацию более плавными и отзывчивыми. Положительный технический эффект также был заметен по отзывам пользователей.
Показатели удовлетворенности пользователей, свидетельствующие об успехе оптимизации, были видны непосредственно в Google Play. После выпуска оптимизированной версии команда заметила значительное улучшение настроения и вовлеченности пользователей.
Дрю Хевнер: "Чтобы полностью раскрыть потенциал R8, потребовалось меньше двух недель"
Самое впечатляющее, что это было достигнуто благодаря целенаправленным усилиям. Дрю Хевнер (Drew Heavner), штатный инженер-программист Reddit, который работал над этой инициативой, отметил, что на внедрение изменений, позволяющих полностью раскрыть потенциал R8, ушло менее двух недель.
Подтверждение улучшений: подробный анализ с помощью макротестов
Заметив значительные улучшения, команда инженеров Reddit и команда по связям с разработчиками Android в Google провели подробные тесты, чтобы научно подтвердить результаты и поэкспериментировать с дальнейшей оптимизацией. Для этого анализа инженеры Reddit предоставили две версии своего приложения: одну без оптимизации, а другую – с R8 и двумя другими базовыми инструментами оптимизации производительности: профилями базовой конфигурации и профилями запуска.
Профили Baseline эффективно переносят этапы JIT-компиляции с устройств пользователей на компьютеры разработчиков. Сгенерированный скомпилированный код AOT (Ahead Of Time) сокращает время запуска и уменьшает количество проблем с отрисовкой.
При упаковке приложения компилятор d8 dexer берет классы и методы и создает файлы classes.dex. Когда пользователь открывает приложение, эти файлы загружаются один за другим, пока приложение не запустится. Предоставив профиль запуска, вы сообщите d8, какие классы и методы нужно упаковать в первые файлы classes.dex. Такая структура позволяет приложению загружать меньше файлов, что, в свою очередь, повышает скорость запуска.
Основным инструментом на этом этапе стала библиотека Jetpack Macrobenchmark, которая позволила точно измерить взаимодействие пользователей в контролируемой среде. Чтобы смоделировать типичный путь пользователя, они использовали UIAutomator API. Тест открывал приложение, прокручивал экран вниз три раза, а затем возвращался наверх.
В итоге для написания бенчмарка потребовалось только это:
uiAutomator {
startApp(REDDIT)
repeat(3) {
onView { isScrollable }.fling(Direction.DOWN) }
repeat(3) {
onView {isScrollable }.fling(Direction.UP)
}
}Данные контрольных показателей подтвердили наблюдения на местах и предоставили более глубокое понимание. Полностью оптимизированное приложение запускалось на 55% быстрее, а пользователи могли начать просмотр на 18% раньше. Кроме того, в оптимизированном приложении количество JIT-компиляций сократилось на две трети, а время JIT-компиляции – на треть. Отрисовка кадров улучшилась, в результате чего на протяжении всего пути пользователя было отрисовано на 19% больше кадров. Наконец, размер приложения уменьшился более чем на треть.
Общее повышение эффективности Reddit
Вы можете измерить время JIT-компиляции с помощью специального показателя раздела трассировки Macrobenchmark, например:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")Технология, которая позволила добиться таких результатов: R8
Чтобы включить R8 в полном режиме, настройте файл app/build.gradle.kts, задав для minifyEnabled и shrinkResources значение true в типе конечной сборки.
android {
...
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro",
)
}
}
}После этого шага необходимо провести комплексное сквозное тестирование, поскольку оптимизация производительности может привести к нежелательному поведению, которое лучше обнаружить до того, как это сделают пользователи.
Как показано ранее в этой статье, R8 выполняет обширную оптимизацию, чтобы максимально повысить производительность. R8 существенно изменяет код, в том числе переименовывает, перемещает и удаляет классы, поля и методы. Если вы заметите, что эти изменения вызывают ошибки, укажите, какие части кода R8 не должен изменять, объявив их в правилах сохранения.
Следуйте примеру Reddit в своем приложении
Успех Reddit с R8 – это отличный пример для любой команды разработчиков, которая хочет значительно повысить производительность приложения, не прилагая больших усилий. Прямая корреляция между техническими улучшениями и последующим ростом удовлетворенности пользователей подчеркивает ценность оптимизации производительности.
Следуя плану, описанному в этом примере, – используя такие инструменты, как оценка производительности приложения, чтобы выявлять возможности, задействуя весь потенциал оптимизации R8, отслеживая реальные данные и используя контрольные показатели для подтверждения и углубления понимания, – другие разработчики могут добиться аналогичных результатов.
Чтобы начать работу с R8 в своем приложении, ознакомьтесь с обновленной официальной документацией и рекомендациями по включению, настройке и устранению неполадок оптимизатора R8.
-
Истории успехаMonzo – это британский цифровой банк, у которого уже 15 миллионов клиентов, и их число растет. По мере масштабирования приложения команда разработчиков определила, что время запуска приложения является критической областью для улучшения, но беспокоилась, что это потребует значительных изменений в их кодовой базе.
Ben Weiss, Tracy Agyemang • Время на чтение: 2 минуты -
Истории успехаGrab – ведущее суперприложение в Юго-Восточной Азии, которое предлагает услуги доставки, мобильности и финансовые услуги миллионам пользователей в восьми странах.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • Время на чтение: 5 минут -
Истории успехаКоманда создала базу кода для ИИ-интерфейса, которая на 50% меньше исходной реализации. При этом время выполнения ИИ-агента сократилось на 35 %, количество обменов между инженером и агентом – на 32 %, а стоимость токенов – на 33 %.
Pavlo Stavytskyi, Rebecca Franks • Время на чтение: 11 минут
Получайте еженедельную рассылку с последними новостями о разработке для Android.