Выбор ответа Middle Производительность и утечки памяти обновлено
R8 и рефлексия
Вопрос
В release-сборке с R8 приложение падает при разборе JSON, а в debug всё работает. Самая вероятная причина?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: R8 удалил или переименовал поля, которые парсер ищет рефлексией; нужны keep-правила. R8 вырезает код, на который нет явных ссылок, и переименовывает классы и поля.
Варианты ответа
- R8 удаляет все data class, у которых нет явных вызовов
copyиcomponentN - В release-сборке по умолчанию нет разрешения INTERNET, и ответ приходит пустым
- R8 удалил или переименовал поля, которые парсер ищет рефлексией; нужны keep-правилаправильный ответ
- JSON-парсеры не работают в release, потому что R8 вырезает пакет
org.json
Разбор
R8 вырезает код, на который нет явных ссылок, и переименовывает классы и поля. Рефлексивные парсеры вроде Gson ищут поля по имени и не находят их. Решения: правила -keep для моделей (@Keep или @SerializedName на полях) или кодогенерация (kotlinx.serialization, Moshi codegen), которые совместимы с R8 и приносят свои правила. Data class как таковые R8 не удаляет, если они используются.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.