Конвертер Android Moshi Json вызывает ошибку kotlin.reflect.jvm.internal.KotlinReflectionInternalError

Я использую Moshi в качестве конвертера Json с модификацией в Android.

Когда я устанавливаю для minifyEnabled значение true, для некоторых вызовов API это работает, но для других выдается эта ошибка:

Этот вызываемый объект не поддерживает вызов по умолчанию: открытый конструктор ErrorResponse.

Обратите внимание, что я использую собственный NetworkResponseAdapter и NetworkResponseCall. Исключение выдается в этой строке в NetworkResponseCall, когда я пытаюсь преобразовать ответ Json в класс данных ErrorResponse: errorConverter.convert(error).

0
0
157
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы включаете опцию минимизации, компилятор заменяет имена классов, поля и т. д. Вместо MyAdapter класса, execute метода и name внутренней модели, сериализованной Moshi, они станут Abc классом, adcd методом и gr полем. Thies включает в себя внутреннюю информацию, необходимую для отражения, и дженерики.

Чтобы это исправить, вы должны написать набор правил в файле proguard-rules.pro по умолчанию, чтобы исключить фрагменты кода из переименования и других операций. На практике каждая популярная библиотека сама добавляет такие правила. Однако при использовании пользовательских классов в качестве адаптера или классов сериализованных данных правила необходимо добавлять вручную.

Android Docs , Краткое руководство , Руководство ProGuard

Я уже добавил правило, сохраняющее классы Custom Network Adaptor Factory и Network Call. Не могли бы вы подробнее разъяснить мой случай?

Omar Assidi 21.03.2024 20:19

@OmarAssidi ты написал convert the Json response to the ErrorResponse Data class. Я полагаю, что в дополнение к пользовательскому адаптеру вам нужно добавить ErrorResponse и другие классы данных для правил защиты, чтобы исключить их из обфускации. Потому что, когда Moshi пытается преобразовать строку json в модель, он не может найти ключи из строки в вашей модели.

Viewed 21.03.2024 20:25

Я понимаю, что вы имеете в виду, я уже пытался сохранить классы данных, используя этот класс -keep class com.example.yourpackage.** { *; }, но проблема, похоже, сохраняется.

Omar Assidi 21.03.2024 20:29
Ответ принят как подходящий

Обновлять!! Решение:

Оказалось, что мне нужно добавить зависимость CodeGen Kapt или KSP com.squareup.moshi:moshi-kotlin-codegen:1.15.0 в дополнение к @JsonClass(generateAdapter = true) для классов, использующих Moshi.

Подробности здесь

Другие вопросы по теме