【问题标题】:Resources$NotFoundException with include-dynamic navigation graphResources$NotFoundException 与包含动态导航图
【发布时间】:2020-09-29 15:04:33
【问题描述】:

我有一个动态功能模块,它有自己的嵌套导航图。我还有一个动态功能模块,它只是一个片段。如果您有一个带有自己导航图的动态功能模块,我知道您需要使用 include-dynamic 标签。当我构建应用程序并将应用程序部署到 Play 商店进行内部测试时,动态模块会正确下载。但是,如果我在本地构建/运行 - 当我尝试导航到包含导航图的动态功能模块时,应用程序会崩溃。我以为在本地运行时所有东西都捆绑了?我有什么遗漏吗?

我得到的错误是android.content.res.Resources$NotFoundException: com.xyz.app_name.two:navigation/two_navigation

ma​​in_navigation_graph

<!-- this works locally. module does not contain a nav graph -->
<fragment
    android:id="@+id/OneFragment"
    android:name="com.xyz.app_name.one.OneFragment"
    android:label="{nickname}"
    app:moduleName="one"
    tools:layout="@layout/one_fragment">
    <argument
        android:name="nickname"
        app:argType="string" />
</fragment>

<!-- this doesn't work locally -->
<include-dynamic
    android:id="@+id/two_graph"
    app:graphPackage="com.xyz.app_name.two"
    app:graphResName="two_navigation"
    app:moduleName="two" />

feature_two_graph

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@id/two_graph"
    app:moduleName="two"
    app:startDestination="@id/twoFragment">

    <fragment
        android:id="@+id/twoFragment"
        android:name="com.xyz.app_name.two.TwoFragment"
        android:label="{nickname}"
        tools:layout="@layout/two_fragment">
        <argument
            android:name="nickname"
            app:argType="string" />
        <action
            android:id="@+id/action_twoFragment_to_dialogFragment"
            app:destination="@id/dialogFragment" />
    </fragment>

    <dialog
        android:id="@+id/dialogFragment"
        android:name="com.xyz.app_name.two.ui.DialogFragment"
        android:label="bottom_sheet"
        tools:layout="@layout/bottom_sheet" />

</navigation>

【问题讨论】:

    标签: android android-jetpack android-architecture-navigation android-jetpack-navigation dynamic-feature-module


    【解决方案1】:

    我遇到了同样的问题。

    当尝试添加动态特征图作为目标时,使用 include-dynamic 如下:

    <include-dynamic
        android:id="@+id/nestedMyfeatureGraph"
        app:graphPackage="com.mycompany.myapp.mydynamicfeature"
        app:graphResName="nav_graph_feature"
        app:moduleName="mydynamicfeature"
        />
    

    请记住,app:graphPackage 应该引用动态功能的 applicationId(我知道,it's confusing)。如果您有任何自定义 gradle 脚本添加后缀到 applicationId 或类似的东西,那么引用图表将失败。

    它可能只对你在 playstore 有效,因为我猜你的脚本只为非 prodRelease 构建类型添加后缀,这是一种常见的模式。

    所以,为了解决这个问题,我不得不更换

        app:graphPackage="com.mycompany.myapp.mydynamicfeature"
    

        app:graphPackage="${applicationId}.mydynamicfeature"
    

    【讨论】:

    • 这正是我需要做的!我什至从未想过它——我有用于 dev、qa 和 prod 的构建类型。 Prod 保持 applicationId 与包名称相同,但 dev 和 qa 分别附加 '.dev' 和 '.qa'。非常感谢!!
    • 确实不容易意识到问题出在哪里,在这种情况下调试不是很有用,除非你怀疑appId后缀的东西和断点&评估resources.getIdentifier(.. )
    • 我试过了,但没用
    • 对我来说它也不起作用。我的动态功能模块的名称是“featuretest”。我的基本模块有许多带有 applicationId 后缀的构建风格。我没有在我的动态功能 build.gradle 文件中添加任何后缀。当我指定 app:graphPackage="${applicationId}.featuretest" 时,当我直接从 AS 运行它(基本上是安装 apk)时它正在工作,但是当我创建发布版本时,它在下载模块后崩溃。 @Oussaki - 你找到解决办法了吗?
    • @Code-Warrior 如果您在发行版中禁用混淆(仅出于调试目的)会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多