Истории успеха

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

Время на чтение: 4 минуты
Посмотреть профиль Бена Вайса
Ben Weiss Developer Relations Engineer

В современном мире мобильных приложений удобство для пользователей – это не просто функция, а необходимость. Медленная загрузка, неотзывчивый интерфейс и нестабильная работа могут стать серьезными препятствиями для вовлечения и удержания пользователей. В ходе сотрудничества с командой Android Developer Relations инженеры Reddit использовали оценку производительности приложения, чтобы проанализировать свой продукт. Они обнаружили, что его можно значительно улучшить, и решили задействовать все возможности R8 – оптимизатора приложений для Android. Это позволило значительно сократить время запуска, уменьшить количество медленных и зависших кадров, а также ошибок ANR и повысить оценки в Google Play. В этой статье мы расскажем, как Reddit удалось достичь таких впечатляющих результатов.

Как оптимизатор R8 помог Reddit

Оптимизатор R8 – это базовый инструмент для повышения производительности на Android. Чтобы повысить производительность приложения, нужно выполнить несколько шагов.Давайте рассмотрим самые важные из них.

  • Tree shaking – это самый важный шаг для уменьшения размера приложения. При этом удаляется неиспользуемый код из зависимостей приложения и самого приложения.
  • Встраивание методов заменяет вызовы методов фактическим кодом, что повышает производительность приложения.
  • Объединение классов и другие стратегии, позволяющие сделать код более компактным. На этом этапе уже не важно, насколько легко человеку читать исходный код. Главное – чтобы скомпилированный код работал быстро. Поэтому абстракции, такие как интерфейсы или иерархии классов, здесь не имеют значения и будут удалены.
  • Минификация идентификаторов заменяет названия классов, полей и методов на более короткие и бессмысленные. Вместо MyDataModel вы можете получить класс с названием a.
  • Удаление неиспользуемых ресурсов , таких как XML-файлы и графические объекты, позволяет дополнительно уменьшить размер приложения.
image.png

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

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

Reddit saw improved performance results immediately after a new version of the app was rolled out to users. С помощью Android Vitals и Crashlytics разработчики Reddit смогли собрать показатели эффективности на реальных устройствах с настоящими пользователями и сравнить новую версию с предыдущими.

image.png

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

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

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

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

image.png

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

image.png

Общее повышение эффективности 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.

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