По умолчанию R8 выполняет множество оптимизаций для улучшения производительности и размера, но оптимизации могут не сработать для вашего приложения немедленно. Если вы включаете R8 (или включаете полный режим ) в большом приложении впервые, попробуйте внедрять оптимизации постепенно: временно отключите обфускацию и включите R8 для частей кода за раз, а не для всего кода в вашем приложении. Мы рекомендуем использовать этот постепенный подход во время локальной разработки, но вы также можете использовать его во время внутреннего тестирования QA или даже в производстве в качестве постепенного развертывания. Точные шаги, которые вы предпримете, зависят от желаемых вами сроков и уверенности в вашем покрытии предрелизного тестирования.
Ограничьте оптимизацию
R8 выполняет много типов оптимизаций, включая удаление кода, переписывание кода и удаление ресурсов. Вот некоторые высокоуровневые описания типов оптимизации:
- Сжатие кода (или tree shake): удаляет неиспользуемый код
- Обфускация (или минимизация идентификатора): сокращает имена классов и методов.
- Оптимизация: переписывание кода, например, встраивание
Чтобы снизить вероятность ошибок, вы можете начать с включения только некоторых из этих оптимизаций.
Включить только тряску деревьев
Сжатие кода, также известное как tree shake, удаляет код, который, как кажется, не имеет ссылок. Мы рекомендуем начать только с tree shake, так как это наиболее просто.
Чтобы включить только tree shake, добавьте следующее в файл proguard-rules.pro
, чтобы отключить другие типы оптимизаций. Отключение обфускации является ключевым, поскольку это значительно упрощает чтение трассировок стека.
-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization
В конечном итоге вам не захочется поставлять эту конфигурацию, поскольку она существенно ограничивает возможности R8 по оптимизации кода, но это отличная отправная точка при первом внедрении R8 в большой кодовой базе с проблемами, которые необходимо исправить.
Использовать режим совместимости
По умолчанию R8 работает в полном режиме . Полный режим обеспечивает значительное повышение производительности и экономию размера, но вы можете временно отключить его и использовать режим совместимости при первом включении минификации.
Чтобы использовать режим совместимости, используйте следующую настройку в файле gradle.properties
:
android.enableR8.fullMode = false // Use temporarily to disable full mode
Включить остальные оптимизации
Когда вы убедитесь, что tree shake работает для вашего приложения, вы можете удалить предыдущие настройки, чтобы снова включить обфускацию, оптимизацию и полный режим R8. Обратите внимание, что обфускация может затруднить отладку, поэтому мы рекомендуем сначала решить проблемы tree shake.
Дополнительную информацию о деобфускации трассировок стека см. в разделе Восстановление исходной трассировки стека .
Ограничить область оптимизации
Полностью оптимизированная сборка оптимизирует весь код в каждой библиотеке и пакете, поэтому часто возникают проблемы с R8 при первом включении. Если вы обнаружили проблему с оптимизацией в одной части приложения, не отключайте R8 полностью, иначе вы потеряете преимущества во всем остальном. Вместо этого временно отключите R8 только в тех частях вашего приложения, которые вызывают проблемы.
Использовать правила хранения для всего пакета
Мы рекомендуем использовать правила keep для всего пакета как способ временного отключения R8 в частях вашего приложения. Вам всегда следует возвращаться, чтобы исправить эти проблемы оптимизации позже; это, как правило, временное решение для обхода проблемных областей.
Например, если часть вашего приложения активно использует Gson и вызывает проблемы с оптимизацией, идеальным решением будет добавить больше целевых правил keep или перейти к решению codegen. Но чтобы разблокировать оптимизацию остальной части приложения, вы можете поместить код, определяющий ваши типы Gson, в выделенный подпакет и добавить правило, подобное этому, в ваш файл proguard-rules.pro
:
-keep class com.myapp.json.** { *; }
Если какая-то используемая вами библиотека имеет отражение во внутренние компоненты, вы можете аналогичным образом добавить правило сохранения для всей библиотеки. Вам нужно будет проверить код библиотеки или JAR/AAR, чтобы найти подходящий пакет для сохранения. Опять же, это не рекомендуется для сохранения в долгосрочной перспективе, но может разблокировать оптимизацию остальной части приложения:
-keep class com.somelibrary.** { *; }
Удалить правила хранения для всего пакета
Как только ваше приложение начнет правильно работать с правилами Keep на уровне пакета, вам следует вернуться назад и либо добавить целевые правила Keep , либо удалить использование рефлексии или библиотеку, которые изначально требуют правила Keep.
Например, сохранение всех правил, которые расширяют определенный класс, чрезвычайно распространено в AndroidX, чтобы сохранить только соответствующие классы. Как правило, отражение должно быть нацелено только на классы или методы, которые расширяют определенные абстрактные классы, реализуют определенные интерфейсы или в классы с определенной аннотацией времени выполнения. Каждый из этих способов поддерживает определение правил сохранения, так что вам не нужны правила сохранения для всего пакета в вашем окончательном, полностью оптимизированном приложении.