Я использую Moshi в качестве конвертера Json с модификацией в Android.
Когда я устанавливаю для minifyEnabled значение true, для некоторых вызовов API это работает, но для других выдается эта ошибка:
Этот вызываемый объект не поддерживает вызов по умолчанию: открытый конструктор ErrorResponse.
Обратите внимание, что я использую собственный NetworkResponseAdapter и NetworkResponseCall. Исключение выдается в этой строке в NetworkResponseCall, когда я пытаюсь преобразовать ответ Json в класс данных ErrorResponse: errorConverter.convert(error).
Когда вы включаете опцию минимизации, компилятор заменяет имена классов, поля и т. д. Вместо MyAdapter
класса, execute
метода и name
внутренней модели, сериализованной Moshi, они станут Abc
классом, adcd
методом и gr
полем. Thies включает в себя внутреннюю информацию, необходимую для отражения, и дженерики.
Чтобы это исправить, вы должны написать набор правил в файле proguard-rules.pro
по умолчанию, чтобы исключить фрагменты кода из переименования и других операций. На практике каждая популярная библиотека сама добавляет такие правила. Однако при использовании пользовательских классов в качестве адаптера или классов сериализованных данных правила необходимо добавлять вручную.
Android Docs , Краткое руководство , Руководство ProGuard
@OmarAssidi ты написал convert the Json response to the ErrorResponse Data class
. Я полагаю, что в дополнение к пользовательскому адаптеру вам нужно добавить ErrorResponse
и другие классы данных для правил защиты, чтобы исключить их из обфускации. Потому что, когда Moshi пытается преобразовать строку json в модель, он не может найти ключи из строки в вашей модели.
Я понимаю, что вы имеете в виду, я уже пытался сохранить классы данных, используя этот класс -keep class com.example.yourpackage.** { *; }, но проблема, похоже, сохраняется.
Обновлять!! Решение:
Оказалось, что мне нужно добавить зависимость CodeGen Kapt или KSP com.squareup.moshi:moshi-kotlin-codegen:1.15.0 в дополнение к @JsonClass(generateAdapter = true) для классов, использующих Moshi.
Подробности здесь
Я уже добавил правило, сохраняющее классы Custom Network Adaptor Factory и Network Call. Не могли бы вы подробнее разъяснить мой случай?