Выбор ответа Middle Производительность и утечки памяти обновлено

R8 и рефлексия

Вопрос

В release-сборке с R8 приложение падает при разборе JSON, а в debug всё работает. Самая вероятная причина?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: R8 удалил или переименовал поля, которые парсер ищет рефлексией; нужны keep-правила. R8 вырезает код, на который нет явных ссылок, и переименовывает классы и поля.

Варианты ответа

  1. R8 удаляет все data class, у которых нет явных вызовов copy и componentN
  2. В release-сборке по умолчанию нет разрешения INTERNET, и ответ приходит пустым
  3. R8 удалил или переименовал поля, которые парсер ищет рефлексией; нужны keep-правилаправильный ответ
  4. JSON-парсеры не работают в release, потому что R8 вырезает пакет org.json

Разбор

R8 вырезает код, на который нет явных ссылок, и переименовывает классы и поля. Рефлексивные парсеры вроде Gson ищут поля по имени и не находят их. Решения: правила -keep для моделей (@Keep или @SerializedName на полях) или кодогенерация (kotlinx.serialization, Moshi codegen), которые совместимы с R8 и приносят свои правила. Data class как таковые R8 не удаляет, если они используются.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.