Мероприятия и программы

Используйте R8 для уменьшения размера, оптимизации и ускорения разработки вашего приложения.

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

Используйте R8 для уменьшения размера, оптимизации и ускорения разработки вашего приложения.

Добро пожаловать на первый день Недели обзора производительности Android!

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

Вы, вероятно, уже знакомы с R8 как с инструментом для уменьшения размера вашего приложения. Он отлично справляется с удалением неиспользуемого кода и ресурсов, уменьшая размер приложения. Но его настоящая сила, то, в чём он действительно хорош , заключается в оптимизации .

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

После прочтения этой статьи посмотрите на YouTube видеоролик Performance Spotlight Week, посвященный оптимизатору R8.

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

image.png

Давайте рассмотрим наиболее значимые шаги, которые предпринимает оптимизатор R8 для повышения производительности приложений.

«Удаление лишнего кода» (tree shaking) — важнейший шаг для уменьшения размера приложения. На этом этапе оптимизатор R8 удаляет неиспользуемый код из библиотек, от которых зависит ваше приложение, а также мертвый код из вашей собственной кодовой базы.

Встраивание методов заменяет вызов метода фактическим кодом, что повышает производительность во время выполнения.

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

Минификация кода используется для изменения имен классов, полей и методов на более короткие, бессмысленные. Так, вместо MyDataModel вы можете получить класс с a . Именно это вызывает наибольшую путаницу при чтении трассировок стека из оптимизированного для R8 приложения. (Обратите внимание, что мы улучшили это в AGP 9.0 !)

Сжатие ресурсов дополнительно уменьшает размер приложения за счет удаления неиспользуемых ресурсов, таких как XML-файлы и изображения.

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

Пример из практики: повышение производительности Reddit с помощью R8.

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

image.png

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

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

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

Подробнее об их улучшениях вы можете прочитать в нашем блоге .

Нетехнические побочные эффекты использования R8

В ходе нашей работы с партнерами мы убедились, что эти технические улучшения напрямую влияют на удовлетворенность пользователей и отражаются на удержании пользователей, вовлеченности и продолжительности сеансов. Показатель «привязанности» пользователей, который можно измерить по количеству активных пользователей в день, неделю или месяц, также положительно изменился благодаря улучшениям в технических характеристиках. Мы также наблюдали рост рейтингов приложений в Play Store в корреляции с внедрением R8. Обсуждение этой информации с вашими владельцами продуктов, техническими директорами и лицами, принимающими решения, поможет ускорить работу вашего приложения.

image.png

Давайте назовем вещи своими именами: целенаправленная оптимизация производительности — это достоинство .

Мы поможем вам найти более производительное приложение.

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

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

Мы значительно расширили наши рекомендации по правилам сохранения (Keep Rules) , которые являются основным механизмом управления оптимизатором R8. Теперь мы предлагаем раздел, посвященный тому, что представляют собой правила сохранения, как их применять, а также рекомендации по их написанию и поддержке. Мы также приводим практические и действенные примеры использования, помогающие понять, как правильно предотвратить удаление R8 кода, необходимого во время выполнения, например, кода, доступ к которому осуществляется через рефлексию или с помощью нативного интерфейса JNI.

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

Раскройте весь потенциал оптимизатора R8.

Начиная с версии 8.0 плагина Android Gradle, оптимизатор R8 по умолчанию использует «полный режим». Если ваш проект разрабатывался в течение многих лет, в нем может присутствовать устаревший флаг, отключающий этот режим. Проверьте файл gradle.properties на наличие этой строки и удалите ее.

android.enableR8.fullMode=false // delete this line to enable R8's full potential

Теперь проверьте, включена ли поддержка R8 в файле build.gradle.kts вашего приложения для релизной версии. Она включается путем установки значений isMinifyEnabled и isShrinkResources в значение true. На этом этапе вы также можете передать файлы конфигурации по умолчанию и пользовательские файлы.

release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

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

       "keep-rules.pro"

   )

}

Пример из практики: повышение производительности Disney+

Инженеры Disney+ инвестируют в производительность приложения и оптимизируют пользовательский опыт. Иногда даже, казалось бы, небольшие изменения могут оказать огромное влияние. При проверке конфигурации R8 команда обнаружила, что использовался флаг -dontoptimize . Он был добавлен из файла конфигурации по умолчанию, который до сих пор используется во многих приложениях.

После замены файла proguard-android.txt на proguard-android-optimize.txt команда Disney+ отметила значительное улучшение производительности своего приложения.

image.png

После того, как пользователям была выпущена новая версия приложения, содержащая это изменение, Disney+ зафиксировал на 30% более быстрый запуск приложения и на 25% меньше случаев ложных срабатываний, воспринимаемых пользователями.

Сегодня многие приложения по-прежнему используют файл proguard-android.txt , содержащий флаг dontoptimize . И именно здесь вступают в дело наши улучшения инструментов.

Поддержка инструментов

Начиная с обновления Android Studio Narwhal 3 Feature Drop , при использовании proguard-android.txt вы будете видеть предупреждение линтера.

image.png

Начиная с AGP 9.0, мы полностью прекращаем поддержку этого файла. Это означает, что вам придётся перейти на использование proguard-android-optimize.txt .

Мы также инвестировали в новые функции Android Studio , чтобы упростить отладку кода, оптимизированного для R8. Начиная с AGP 9.0, вы можете автоматически деобфусцировать трассировки стека в logcat Android Studio для сборок, обработанных в R8, что поможет вам точно определить строку кода, вызывающую проблему, даже в полностью оптимизированном приложении. Подробнее об этом мы расскажем в завтрашней статье в блоге, посвященной этой неделе повышения производительности Android.

Следующие шаги

Посмотрите на YouTube видеоролик Performance Spotlight Week, посвященный оптимизатору R8.

📣 Примите участие в испытании на повышение производительности!

Пришло время убедиться в преимуществах на собственном опыте.

Предлагаем вам сегодня же включить полнофункциональный режим R8 для вашего приложения.

  1. Для начала воспользуйтесь нашими руководствами для разработчиков: Включите оптимизацию приложения .
  2. Проверьте, используете ли вы по-прежнему файл proguard-android.txt , и замените его на proguard-android-optimize.txt .
  3. Затем измерьте эффект . Не просто почувствуйте разницу, а проверьте её. Измерьте прирост производительности, адаптировав код из нашего примера приложения Macrobenchmark на GitHub, чтобы измерить время запуска до и после обновления.

Мы уверены, что вы заметите значительное улучшение производительности вашего приложения. По всем вопросам, касающимся включения или устранения неполадок R8, используйте хэштег #optimizationEnabled. Мы всегда готовы помочь.

Приносите свои вопросы на сессию «Спроси Android» в пятницу.

Используйте хэштег #AskAndroid в социальных сетях, чтобы задать любые вопросы о производительности. В течение недели мы будем отслеживать ваши вопросы и ответим на некоторые из них на сессии Ask Android, посвященной производительности, в пятницу, 21 ноября. Следите за обновлениями завтра, где мы еще глубже погрузимся в отладку и устранение неполадок. А пока начните работу с R8 и ускорьте разработку своего приложения.

    Автор:

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