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

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

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

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

Добро пожаловать на первый день Android Performance Spotlight Week!

Начнем с самого эффективного и простого способа повысить производительность приложения – включения оптимизатора R8 в полном режиме.

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

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

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

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

image.png

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

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

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

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

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

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

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

История успеха: как R8 помог повысить производительность Reddit

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

image.png

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

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

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

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

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

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

image.png

Поэтому давайте называть вещи своими именами: целенаправленная оптимизация производительности – это достоинство.

Как повысить эффективность приложения

Мы узнали, что руководство для разработчиков по R8 нуждается в доработке. И мы начали работать. Руководство для разработчиков по оптимизатору R8 стало более практичным и содержит подробные инструкции по включению и отладке R8.

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

Мы значительно расширили руководство по правилам Keep, которые являются основным механизмом управления оптимизатором 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 вашего приложения для рабочей версии. Для этого нужно установить значение true для isMinifyEnabled и isShrinkResources. На этом этапе вы также можете передать стандартные и пользовательские файлы конфигурации.

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% быстрее, а количество ошибок ANR в активном режиме снизилось на 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.

Что дальше

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

📣 Примите участие в Performance Challenge!

Попробуйте и оцените преимущества.

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

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

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

Подготовьте вопросы для сессии Ask Android в пятницу

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

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