启用ProGuard构建Android Navigation组件时出现ClassNotFoundException
从你给出的堆栈追踪能明显看出来——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
相关产品推荐
相关产品推荐

