Поскольку оптимизация R8 изменяет код приложения, важно тщательно протестировать его работу, чтобы убедиться, что оно функционирует должным образом. Если после оптимизации возникнут проблемы, воспользуйтесь этой страницей, чтобы устранить их. Подробнее о том, как использовать правила для устранения неполадок с оптимизацией…
При устранении неполадок обратите внимание на следующие ситуации:
- Чрезмерная оптимизация, приводящая к сбоям в работе приложения. Приложение дает сбои, потому что R8 оптимизировал слишком много кода.
- Непонятная или недостаточная оптимизация. R8 не оптимизировал приложение так, как вы ожидали, или вам нужны дополнительные объяснения по поводу оптимизации.
Сбои приложения
Если после оптимизации с помощью R8 приложение перестало работать, скорее всего, это связано с нарушением работы отражения. Чтобы выявить неработающее отражение, следуйте приведенным ниже рекомендациям.
- Вы видите исключение, которое означает, что указанный класс, метод или поле используется через рефлексию. Обычно это
ClassNotFoundException,NoSuchMethodException,NoSuchFieldException,NoClassDefFoundError,NoSuchMethodError,NoSuchFieldError. - Вы видите код, в котором используется отражение с помощью
import kotlin.reflect.*илиimport java.lang.reflect.*. - Вы видите, что конструктор класса используется следующим образом:
Something::class.constructors. - Вы видите
Class.forName(...).
Решение. Добавьте правило хранения.
Если отражение выполняется вашим кодом, вы можете добавить в него аннотации Jetpack Keep вместо того, чтобы добавлять правило сохранения. Проверки Jetpack Keep также отмечают другие рефлексивные вызовы без аннотаций, что помогает предотвратить подобные сбои.
Недостаточная или неясная оптимизация
Поскольку правила применяются как из вашего приложения, так и из включенных библиотек, вам может потребоваться дополнительная ясность в отношении применяемых правил или объяснение того, почему R8 сохранил определенные разделы кода, которые вы ожидали оптимизировать.
Неопределенность в отношении применяемых правил. Поскольку правила из включенных библиотек также применяются к вашему приложению, а глобальные параметры из этих библиотек также распространяются на ваше приложение, вы можете не знать, какие правила применяются.
Решение. Посмотрите, какие правила применяются, в отчете обо всех правилах, которые R8 использует при сборке проекта. Отчет доступен по адресу
./app/build/outputs/mapping/configuration.txt. Этот отчет содержит все объединенные правила из каждой библиотеки и модуля, которые использовались для настройки R8, и может быть использован для выявления неэффективных правил.Сохраняется слишком много кода. Оптимизация R8 может сохранять код, который вы хотели удалить.
Решение. Используйте параметр конфигурации
-whyareyoukeeping, чтобы понять, почему код был сохранен. В выходных данных будет указан путь от сохраненного кода к одной из точек входа приложения. Подробнее-whyareyoukeeping…Сложность понимания исходной трассировки стека: R8 изменяет код разными способами, поэтому трассировка стека больше не относится к исходному коду. Например, могут измениться номера строк, а также названия классов и методов.
Решение. Начиная с Android Studio Otter 3 Feature Drop и AGP 9.0, Logcat автоматически деобфусцирует трассировки стека. Если вы используете более раннюю версию Android Studio, вам нужно вручную восстановить исходную трассировку стека. Чтобы восстановить исходную трассировку стека, используйте инструмент командной строки
retrace, который входит в пакет инструментов командной строки.Чтобы использовать
retrace, укажите в команде путь к файлу сопоставления и файлу трассировки стека. Файл сопоставленияmapping.txtавтоматически добавляется в набор Android App Bundle (AAB). Подробную информацию вы найдете в документации по retrace и статье Справочного центра Play Console о том, как деобфусцировать трассировки стека при сбое. При использовании Play и Firebase Crashlytics используйте файлmapping.txtс данными о сбоях, которые сервис собирает у пользователей приложения. Следующая команда показывает, как можно запуститьretraceиз корня проекта:$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
Как сообщить об ошибке
Если вам не удается решить проблему с R8, сообщите нам о ней.