将 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

另外,我有三个模块appdatadomain。所以,在我添加的所有三个 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

因为我不必一直用@KeepParcelableSerializable)注释我的模型,或者让整个模型包远离混淆。

查看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 一起使用会失败

启用 Proguard 后无法实例化片段

Android:使用 BottomNavigationView、NavController 和 SafeArgs 恢复片段

导航架构组件 - 未生成 DestinationFragmentArgs

深入浅出 NavigationUI | MAD Skills