可以在 Android 中的域模型上放置@keep注释吗?

would it be okay to place @keep annotation on domain model in android?

提问人:foseja 提问时间:10/30/2023 最后编辑:foseja 更新时间:10/30/2023 访问量:64

问:

我遇到了一个问题,即我的应用程序为发布而构建,引发了错误,并显示以下错误日志。

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?
)
Android ProGuard 清洁架构

评论

0赞 ΓDΛ 10/30/2023
您的数据模型是什么?
1赞 ΓDΛ 10/30/2023
@Keep批注可确保在生成时缩小代码时不会删除带批注的类或方法。此注释通常添加到通过反射访问的方法和类中,以防止编译器将代码视为未使用。
1赞 ΓDΛ 10/30/2023
是的,因为数据源类型中使用的数据模型就在那里。
1赞 ΓDΛ 10/30/2023
这是我的想法。如果我的个人项目需要它,我会在那里使用它。
1赞 sweak 10/30/2023
注解不应该用于应该保留的类的定义吗?定义在于域层,因此这似乎是放置注释的唯一位置,但这违反了域层的原则,因此存在 OP 问题。@Keep@Keep

答:

1赞 sweak 10/30/2023 #1

注解是特定于 Android 的 - 它来自包,因此不适合域层,因为使用此导入,域层将无法在不同的 (JVM) 环境中重用。@Keepandroidx.annotation

您应该考虑这样一个事实,即域层也应该独立于构建过程,因此这是不将注释放在域层内的另一个原因。@Keep

我的建议是简单地将类放在 以便在缩小期间保留该类及其字段:proguard.rules

-keep public class your.package.name.IconDTO {*;}

如果这个指令不起作用,我还发现了这篇文章,其中有一个更高级的指令:

-keepclasseswithmembers class your.package.name.IconDTO {
    public ** component1();
    <fields>;
}
1赞 ΓDΛ 10/30/2023 #2

我收集了我的评论作为答案。 —-

批注可确保在生成时缩小代码时不会删除带批注的类或方法。此注释通常添加到通过反射访问的方法和类中,以防止编译器将代码视为未使用@Keep

最佳实践中,通常也使用数据层。也许映射过程中可能存在缺陷

因为使用的类型是有的data modelsdatasource

这是我的想法。如果我的个人项目需要它,我会在那里使用它。