我遇到了一个问题,我为发布而构建的应用程序抛出错误并显示以下错误日志。
java.lang.ClassCastException: com.squareup.moshi.LinkedHashTreeMap cannot be cast to com.myAppPath.domain.model.IconInfo at com.myAppPath.ui.util.BindingAdapterKt.bindImage(BindingAdapter.kt:17) and so on..
我找到了这篇文章并将其应用于领域层中的模型,它看起来工作正常。 但是,我想知道是否可以在域层中的模型上放置
@keep
注释,因为域层不应该有任何依赖项。我的数据模型看起来像这样。
@Keep
data class IconDTO(
@Json(name = "url") val iconDtoUrl: String?,
@Json(name = "width") val width: Int?,
@Json(name = "height") val height: Int?,
@Json(name = "format") val format: String?,
@Json(name = "bytes") val bytes: Int?,
@Json(name = "error") val error: String?,
@Json(name = "sha1sum") val sha1sum: String?
)
@Keep
注释是Android特定的 - 它来自androidx.annotation
包,因此不适合域层,因为通过此导入,域层将无法在不同的(JVM)环境中重用。
您应该考虑域层也应该独立于构建过程这一事实,因此这是不将
@Keep
注释放置在域层内的另一个原因。
我的建议是简单地将类放在
proguard.rules
中,以便在缩小过程中保留类及其字段:
-keep public class your.package.name.IconDTO {*;}
如果这个指令不起作用,我还找到了文章,其中有一个更高级的指令:
-keepclasseswithmembers class your.package.name.IconDTO {
public ** component1();
<fields>;
}