Android Studio3.5与Navigation2.1.0中<nav-graph>在presentation模块Manifest报错
核心原因
你遇到的问题本质是Navigation Components的<nav-graph>标签仅支持在Application类型模块(即使用com.android.application插件的模块)的AndroidManifest.xml中使用,而你的presentation模块属于Library类型模块(使用com.android.library插件),Library模块的AAPT工具无法识别这个标签,因此触发资源链接错误。
另外,移除<nav-graph>后能正常启动,是因为当你在Library模块中定义Launcher Activity时,App模块会合并这个Manifest配置,但带有<nav-graph>的Activity配置因为Library插件不处理该标签,导致合并后的Manifest存在无效元素,系统无法识别正确的启动Activity,从而抛出"Default Activity not found"错误。
具体解释
插件功能差异:
com.android.application插件包含了处理Navigation Components相关Manifest标签的逻辑,能解析<nav-graph>并关联导航图资源。com.android.library插件的职责是构建可复用的库,它不支持Application模块特有的Manifest扩展标签(包括<nav-graph>),所以AAPT会把这个标签判定为非法元素。
Manifest合并机制:
你的app模块依赖presentation模块,构建时会合并所有依赖模块的Manifest。但Library模块中的无效标签(<nav-graph>)不会被App模块的插件修正,反而会保留在合并后的Manifest中,导致系统无法正确识别启动Activity的配置。
解决方案
你有两种可行的修复方式:
方案1:将
<nav-graph>移到App模块的Manifest中
在app模块的AndroidManifest.xml里,覆盖presentation模块的HomeActivity配置,添加<nav-graph>标签:<activity android:name="com.your.package.feature.base.view.HomeActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <nav-graph android:value="@navigation/navigation_login" /> </activity>同时,记得移除
presentation模块Manifest中对应的<nav-graph>标签。方案2:在代码中动态关联导航图
如果不想修改Manifest,可以在HomeActivity的代码中手动设置导航图,替代Manifest中的<nav-graph>配置:// HomeActivity.kt override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_home) val navController = findNavController(R.id.nav_host_fragment) navController.setGraph(R.navigation.navigation_login) }这种方式不受模块类型限制,在Library模块中也能正常工作。
内容的提问来源于stack exchange,提问作者rafaelasguerra

