Примеры из практики

Благодаря новому анализатору конфигурации R8, Tinder сократил количество холодных запусков приложения на 47%.

4 минуты чтения
3 автора
Ajesh Pai, Ulises Uriel Verduzco Díaz , Tracy Agyemang

Tinder стремится создавать и вдохновлять на настоящие знакомства, делая встречи легкими и увлекательными для каждого нового поколения одиноких людей. Однако по мере роста размера кода их Android-приложения росла и его сложность. До последних усилий по оптимизации примерно 70% приложения не было оптимизировано, содержа 17 dex-файлов, включая три, предназначенных только для запуска. Хотя они включили R8, большая часть его потенциала оптимизации была заблокирована из-за правил сохранения, и команда не могла определить, какие именно правила препятствовали оптимизации. Чтобы сократить время запуска и уменьшить количество ошибок «Приложение не отвечает» (ANR), которые воспринимаются пользователями, Tinder обратился к новому анализатору конфигурации R8 для решения этих проблем.

Благодаря использованию анализатора конфигурации R8 , Tinder успешно выявил и устранил непреднамеренные препятствия для оптимизации. Результаты были незамедлительными и значительными: Tinder добился 47% сокращения количества холодных запусков приложения, уменьшил размер загружаемого приложения на 28,98% (до 61,5 МБ) и снизил воспринимаемое пользователями количество ошибок ANR на 28%.

Анализатор конфигурации

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

В анализаторе конфигурации отображаются следующие ключевые показатели:

  • Показатель сжатия: Процентное соотношение кода, доступное для сжатия R8.
  • Оценка оптимизации: Процент кода, открытого для оптимизации (например, встраивание методов, горизонтальное слияние классов).
  • Показатель обфускации: процент классов, методов и полей, которые можно переименовать в R8 для уменьшения размера.

Используйте анализатор для проверки правил хранения и их влияния:

  • Найдите общие правила: сузьте область действия общепакетных правил, ограничивающих оптимизацию R8, и определите конкретные классы, методы и поля, исключенные из сжатия, оптимизации и обфускации.
  • Уточните правила: для оптимизации следует ориентироваться только на определенные классы/методы, требующие использования рефлексии.
  • Удалите избыточные правила : удалите правила, которые не соответствуют ни одному классу, методу или полю в вашей текущей сборке.
  • Идентичные правила : Идентичные правила сохранения означают правила, которые нацелены на одни и те же классы, поля и методы, или дублирующие объявления правил сохранения в одном или разных файлах правил сохранения.
  • Найти включенные правила: Удалить конкретные правила, уже охваченные более широкими конфигурациями.
  • Выявление проблемных библиотек: проверьте совокупное влияние оптимизации, достигаемое за счет объединения правил сохранения данных потребителями из всех библиотек.
R8-Configuration-Analyzer-Screenshot.png
Отчет анализатора конфигурации R8 для тестового приложения

To assist you in using the R8 Configuration Analyzer with agentic tools, we have published an R8 Analyzer skill . This skill optimizes automated development workflows by summarizing the R8 Configuration Analyzer report to display key metrics: optimization, obfuscation, and shrinking scores. It also highlights the five most impactful keep rules, giving you clear insight into what blocks code optimization.

Выявление скрытых препятствий для оптимизации

image.png

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

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

# Prevents optimization in all public classes along with all of their public and protected members

-keep public class * {
    public protected *;
}

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

Используя данные, полученные с помощью анализатора конфигурации R8, команда успешно отследила и проанализировала конкретные классы, затронутые общим правилом сохранения из библиотеки. Команда сразу же обнаружила, что оптимизация блокируется в более крупных, не динамически вызываемых классах, где R8 мог бы выполнять оптимизацию. Уточнение этого конкретного правила сохранения позволило Tinder раскрыть значительные возможности оптимизации, разобраться с устаревшими конфигурациями и значительно улучшить общие показатели оптимизации: показатели R8 выросли с 28% до 50%, что привело к немедленному повышению производительности всего приложения, и команда Tinder активно работает над дальнейшим улучшением этого показателя.

  • Ускоренная загрузка: Команда добилась снижения на 47% числа пользователей, испытывающих проблемы с медленным запуском приложения при первом включении.
  • Уменьшение занимаемого места: размер загружаемого приложения снизился с 86,6 МБ до 61,5 МБ (снижение на 28,98%).
  • Улучшена стабильность: количество ошибок «Приложение не отвечает» (ANR), воспринимаемых пользователями, снизилось с 0,35% до 0,28%, что значительно приблизило их к средним показателям среди аналогичных приложений.
  • Снижена сложность: общее количество DEX-файлов сокращено с 17 до 11, включая всего два файла запуска.

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

  • Региональное взаимодействие: Страны, где устройства с малым объемом оперативной памяти занимают огромную долю рынка, продемонстрировали наибольший рост вовлеченности, а снижение частоты ложных срабатываний стало ключевым фактором повышения вовлеченности на этом обширном рынке.
  • Рост вовлеченности: Вовлеченность увеличилась на 3% с момента повышения эффективности оптимизации приложения.
image.png

Обеспечение будущей производительности за счет непрерывной интеграции.

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

Команда Tinder добавила в свой конвейер CI/CD новую задачу для отслеживания изменений в статистике оптимизации, чтобы каждый мог видеть, как его вклад влияет на оптимизацию. При консультировании других разработчиков, рассматривающих интеграцию конфигураций R8, команда подчеркивает важность аудита внутренних зависимостей. Хотя большинство популярных сторонних библиотек имеют четко определенные правила, внутренние проекты компании, которые считаются «стабильными», на самом деле могут вводить общие правила, негативно влияющие на общую оптимизацию.

Основные выводы

Столкнувшись с крайне неоптимизированным кодом и большим объемом DEX-файлов, Tinder нуждался в способе чистого аудита правил минификации своего приложения. Анализатор конфигурации R8 предоставил идеальный инструмент для выявления слишком широких внутренних правил библиотек, классов, на которые распространяется правило keep, что позволило команде уверенно оптимизировать свой код. В результате Tinder успешно сократил количество холодных запусков почти вдвое, уменьшил размер APK-файла более чем на 28% и создал более надежную и производительную основу для своих пользователей, при этом команда активно работает над дальнейшим улучшением этих показателей.

Как использовать анализатор конфигурации R8

Анализатор конфигурации R8 и его автономные функции могут использоваться в зависимости от текущей версии плагина Android Gradle (AGP):

1. Выпуск AGP 9.3: Анализатор конфигурации R8 полностью интегрирован и выпущен вместе с AGP 9.3. При запуске сборки R8 отчет будет сгенерирован в папке `build/outputs/mapping/release/configanalyzer.html` .

2. Автономная задача Gradle: В AGP 9.3 представлена ​​автономная задача Gradle, которая позволяет генерировать отчет анализатора без выполнения полной сборки релиза, обеспечивая гораздо более быструю обратную связь при локальном уточнении правил сохранения:

./gradlew :app:analyzeReleaseR8Config

Отчет генерируется по адресу build/reports/r8/r8-config-analyzer-release.html.

3. Использование на более старых версиях AGP: Если вы используете версию AGP ниже 9.3, вам не нужно переносить всю версию AGP для анализа вашей конфигурации. Вы можете обновить версию R8 до 9.3.7-dev или выше, следуя инструкциям по замене R8 в AGP . Чтобы сгенерировать отчет локально, запустите сборку с указанным параметром:

./gradlew assembleRelease  -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

Для получения более подробной информации см. документацию по анализатору конфигурации R8 .

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