You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用ProGuard构建Android Navigation组件时出现ClassNotFoundException

解决ProGuard启用后Android Navigation组件找不到Fragment的问题

从你给出的堆栈追踪能明显看出来——ProGuard混淆把你的Fragment类给处理掉了,要么是改了类名,要么是直接把它当成无用代码移除了,导致Navigation组件通过反射实例化Fragment时抛出ClassNotFoundException。

Navigation加载导航图(nav_graph.xml)时,依赖Fragment的全类名通过反射创建实例,所以必须让ProGuard「手下留情」,保留这些关键类和构造方法。下面是具体的解决步骤:

1. 添加ProGuard保留规则

打开项目里的proguard-rules.pro文件,插入以下规则:

# 保留Navigation组件核心类,避免组件内部反射逻辑失效
-keep class androidx.navigation.** { *; }
-keep class androidx.navigation.fragment.** { *; }

# 保留你项目中所有的Fragment类,确保类名和无参构造方法不被修改
-keep public class com.myapppackage.path.ui.** extends androidx.fragment.app.Fragment {
    public <init>();
}

# 如果用了Navigation Safe Args,必须保留自动生成的Args和Directions类
-keep class *Args { *; }
-keep class *Directions { *; }

规则解释:

  • 前两行是保护Navigation组件自身的类,防止组件内部的反射逻辑出问题;
  • 中间的规则精准保留你项目里的Fragment(可以根据自己的包路径调整com.myapppackage.path.ui.**),无参构造方法是Fragment实例化的必要条件,必须强制保留;
  • 最后两行针对Safe Args生成的辅助类,这些类也会被Navigation调用,同样不能被混淆。

2. 额外检查项

  • 确认nav_graph.xml里Fragment的android:name属性填写的是完整的全类名,没有拼写错误;
  • 如果你用的是AndroidX,确保Navigation组件的依赖版本和其他AndroidX库版本兼容,避免版本不一致导致的隐性问题。

调整完规则后重新构建混淆包,Navigation应该就能正常找到你的Fragment类了。

内容的提问来源于stack exchange,提问作者jesobremonte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:07:25