Используйте анализатор конфигурации R8.

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

Сгенерировать отчет

Начиная с AGP 9.3.0-alpha05 и более поздних версий , отчет автоматически генерируется в build/outputs/mapping/release/configanalyzer.html при выполнении сборки R8. Чтобы отключить автоматическую генерацию выходных данных, установите следующее свойство Gradle:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

Для AGP 9.2 и более ранних версий установите системное свойство com.android.tools.r8.dumpkeepradiushtmltodirectory при запуске задачи Gradle со сборкой, включенной в R8.

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

Например, для генерации HTML-отчета в каталоге /tmp/r8analysis используйте следующую команду:

// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

Ознакомьтесь с отчетом.

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

Пример раздела «Краткое содержание отчета».
Рисунок 1. Пример раздела с кратким изложением отчета.

Снижение балла

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

Оценка оптимизации

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

Оценка степени обфускации

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

Уточнить правила сохранения

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

Для этого используйте анализ правил сохранения .

Пример анализа правила сохранения
Рисунок 2. Пример анализа правила сохранения.

Чтобы просмотреть подробный анализ правила, щелкните по нему, чтобы открыть экран с подробной информацией.

Пример анализа правила сохранения
Рисунок 3. Пример анализа правила сохранения.

Как уточнить правила сохранения

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

  1. Для каждого правила сохранения в Configuration Analyzer отображается процент классов, полей и методов, которые не могут быть оптимизированы R8. Используйте эту информацию для выявления правил сохранения, препятствующих оптимизации большого количества классов, полей или методов. Также указаны свойства оптимизации, которым препятствует каждое правило сохранения.
  2. Если вы видите правило сохранения, которое препятствует оптимизации большого количества классов, вам следует проверить, какие классы, поля и методы исключены из оптимизации этим правилом, чтобы определить, сохраняет ли это правило элементы, которые не вызываются динамически с помощью рефлексии.
  3. Уменьшите количество ошибок оптимизации, блокируемых правилами сохранения, путем выбора правильного параметра сохранения и следования передовым практикам , чтобы оптимизировать только необходимые классы, поля или методы.
  4. Проведите исследование и запустите тесты, охватывающие затронутые классы, поля и методы правила сохранения, и уточните правила сохранения.

Проверьте оптимизацию библиотек.

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

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

Как оптимизировать библиотеки

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

Подчиненные правила

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

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

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

Пример раздела «Краткое содержание отчета».
Рисунок 4. Пример правил, включенных в отчет.

Оптимизация подчиненных правил

  1. Найдите правила сохранения и включения с помощью анализатора конфигурации R8.
  2. Определите в своем коде точные классы, поля или методы, которые действительно используют рефлексию и которые необходимо сохранять с помощью правил сохранения. Знание этого поможет вам уточнить правила сохранения.
  3. С помощью анализатора конфигурации сравните влияние каждого правила, нацеленного на одни и те же классы, поля или методы. Вы можете использовать процент предотвращенной оптимизации для каждого правила сохранения, чтобы определить, какое правило является более широким, а какое — более узким.
    1. Если узкое правило сформулировано точно — сохраняются только те члены или классы, к которым осуществляется рефлексивный доступ, — то удалите более широкое правило сохранения. Это позволит безопасно разблокировать оптимизации R8 для остальной части вашего пакета.
    2. Если общее правило нацелено на нужные классы, сохраните общее правило и удалите узкое. Узкое правило — это просто лишний мусор. Убедитесь, что общее правило нацелено только на те классы, поля или методы, которые вы определили.

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

Удалите ненужные правила

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

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

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