将 SafeArgs 与 Proguard 和导航架构组件一起使用时出现 ClassNotFoundException?
Posted
技术标签:
【中文标题】将 SafeArgs 与 Proguard 和导航架构组件一起使用时出现 ClassNotFoundException?【英文标题】:ClassNotFoundException when using SafeArgs with Proguard and Navigation Architecture Component? 【发布时间】:2021-07-14 00:25:09 【问题描述】:我正在使用SafeArgs
插件和Navigation Architecture Component
,但应用程序崩溃了。
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.package.domain.models.Model"
我在 Gradle 中使用 minifyEnabled true
。
另外,我有三个模块app
、data
和domain
。所以,在我添加的所有三个 proguard-rules
文件中
-keepnames class com.package.domain.models.Model1
-keepnames class com.package.domain.types.ImageType
-keepnames class com.package.domain.models.Model
我在导航图中将这三个类用作argType
。
但应用程序仍然崩溃。任何帮助将不胜感激。
【问题讨论】:
minifyEnabled为false时可以吗? @hata 是的,没关系。 你用的是哪个版本? @RobertNagy 版本的? @hata 是的,minifyEnabled false
没问题
【参考方案1】:
我认为更合适的做法是将其添加到我的proguard-rules
文件中。
-keepnames class * extends android.os.Parcelable
-keepnames class * extends java.io.Serializable
因为我不必一直用@Keep
(Parcelable
或Serializable
)注释我的模型,或者让整个模型包远离混淆。
查看this了解更多信息。
【讨论】:
【参考方案2】:尝试将@Keep
注释放在首位。喜欢
import androidx.annotation.Keep
@Keep
data class RepoData(val id: Long, val name: String)
【讨论】:
谢谢!但我认为这更好地回答了我的问题。 ***.com/a/50378828/7436566【参考方案3】:你可以像这样保留整个模型包(通常可以这样做)
-keep class com.package.domain.models.** *;
【讨论】:
谢谢!但我认为这更好地回答了我的问题。 ***.com/a/50378828/7436566【参考方案4】:只要您希望类留在内存中,请始终使用 @keep
注释。
@保持 数据类 MyData(val id: long,val name: String)
【讨论】:
谢谢!但我认为这更好地回答了我的问题。 ***.com/a/50378828/7436566以上是关于将 SafeArgs 与 Proguard 和导航架构组件一起使用时出现 ClassNotFoundException?的主要内容,如果未能解决你的问题,请参考以下文章
将 proguard 与 retrofit2 和 rxjava 一起使用时出错
使用 EnumTypeAdapter 时,将 proguard 与 GSON 和 RoboGuice 一起使用会失败
Android:使用 BottomNavigationView、NavController 和 SafeArgs 恢复片段