Устранить проблемы оптимизации

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

При устранении неполадок сосредоточьтесь на следующих ситуациях:

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

Приложение вылетает

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

  • Вы наблюдаете исключение, означающее, что указанный класс, метод или поле используются посредством рефлексии. Обычно это одно из следующих исключений: ClassNotFoundException , NoSuchMethodException , NoSuchFieldException , NoClassDefFoundError , NoSuchMethodError , NoSuchFieldError .
  • Вы видите код, который ссылается на рефлексию с помощью import kotlin.reflect.* или import java.lang.reflect.* .
  • Вы наблюдаете, как конструктор класса используется следующим образом: Something::class.constructors .
  • Вы видите Class.forName(...) .

Решение : Добавить правило сохранения .

Неясная или недостаточная оптимизация

Поскольку правила применяются как из вашего приложения, так и из включенных библиотек, вам может потребоваться дополнительная информация о применяемых правилах или объяснение того, почему 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, сообщите об ошибке .