开启混淆后Jetpack Compose Navigation在Release构建抛出异常
Debug构建运行正常,但Release版本抛出如下异常,使用的Navigation版本为:implementation "androidx.navigation:navigation-compose:2.5.3"
异常信息
Fatal Exception: java.lang.IllegalArgumentException: navigation destination screen_dashboard is not a direct child of this NavGraph at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.kt:72) at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.kt:49) at androidx.navigation.NavController.navigateInternal(NavController.kt:260) at androidx.navigation.NavController.navigate(NavController.kt:1719) at androidx.navigation.NavController.onGraphCreated(NavController.kt:1161) at androidx.navigation.NavController.setGraph(NavController.kt:1086) at androidx.navigation.NavController.setGraph(NavController.kt:100) at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:118) at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:67)
已尝试在proguard-rules.pro中添加规则-keep class androidx.navigation.** { *; },但异常仍未解决。
解决方案
1. 检查导航图层级结构
确认screen_dashboard是否为当前NavGraph的直接子节点:
- 若该目的地嵌套在子NavGraph中,导航时需使用完整路径(如
parent_graph/screen_dashboard),或通过子图定义的Action跳转,而非直接引用目的地ID。
2. 优化ProGuard混淆规则
原规则覆盖范围不足,补充以下规则到proguard-rules.pro:
# 保护Navigation Compose核心类 -keepnames class androidx.navigation.compose.** { *; } # 保护自定义导航相关类(替换为你的项目导航包路径) -keepnames class com.yourproject.navigation.** { *; } # 保留Navigation内部Companion对象 -keep class androidx.navigation.**$Companion { *; } # 保留NavDestination注解相关方法 -keepclasseswithmembers class * { @androidx.navigation.NavDestination.* <methods>; } # 保留资源ID中的导航目的地ID -keepclassmembers class **.R$id { public static <fields>; }
3. 清理缓存并重新构建
执行命令清理项目缓存,重新生成Release包:
./gradlew clean assembleRelease
4. 检查Safe Args配置(若使用)
如果用了Safe Args生成导航代码,补充规则保留生成类:
-keep class com.yourproject.navigation.**Args { *; } -keep class com.yourproject.navigation.**Directions { *; }
内容的提问来源于stack exchange,提问作者vVv
相关产品推荐
相关产品推荐

