作为按需功能模块工作的安装时功能模块

install-time feature module working as on-demand feature module

我们目前正在开发我们的产品,因为它在架构上是一个非常大的应用程序,所以我们将我们的应用程序分为功能和库模块。其中一个模块是 credit_cards,它是一个动态功能模块。这是模块的AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.tallileo.credit_cards">

    <dist:module
        dist:instant="false"
        dist:title="@string/text_feature_credit_cards">
        <dist:delivery>
            <dist:install-time />
        </dist:delivery>
        <dist:fusing dist:include="false" />
    </dist:module>

</manifest>

如您所见,该模块被配置为 install-time 模块,但是当我通过导航组件打开该模块时,它作为一个 on-demand 功能模块工作。

这是我用来导航到模块的代码。

nav_graph_app.xml

<fragment
    android:id="@+id/trackFragment"
    android:name="com.tallileo.tallileo.ui.TrackFragment"
    android:label="@string/text_track"
    tools:layout="@layout/fragment_track">
        <action
            android:id="@+id/action_trackFragment_to_nav_graph_accounts"
            app:destination="@id/nav_graph_accounts" />
        <action
            android:id="@+id/action_trackFragment_to_nav_graph_categories"
            app:destination="@id/nav_graph_categories" />
        <action
            android:id="@+id/action_trackFragment_to_nav_graph_transactions"
            app:destination="@id/nav_graph_transactions" />
        <action
            android:id="@+id/action_trackFragment_to_nav_graph_budget"
            app:destination="@id/nav_graph_budget" />
        <action
            android:id="@+id/action_trackFragment_to_nav_graph_credit_cards"
            app:destination="@id/nav_graph_credit_cards" />
</fragment>

Utility.kt

fun getFeatureNavAction(featureName: FeatureName): NavDirections =
    when (featureName) {
        FeatureName.BUCKET_LIST -> SaveFragmentDirections.actionSaveFragmentToNavGraphBucketList()
        FeatureName.BUDGET -> TrackFragmentDirections.actionTrackFragmentToNavGraphBudget()
        FeatureName.CATEGORIES -> TrackFragmentDirections.actionTrackFragmentToNavGraphCategories()
        FeatureName.CREDIT_CARDS -> TrackFragmentDirections.actionTrackFragmentToNavGraphCreditCards()
        ...
    }

我们还有 ~7-8 个其他功能模块,它们在各自的 AndroidManifest 文件中也有相同的配置。正如上面的功能所示,我也为它们使用了相同的导航方法。现在奇怪的是只有 credit_cards 模块像 on-demand 一样工作,即使在给它所有 install-time 的配置之后也是如此。而所有其他功能模块都可以正常工作。

所以,我做错了一件非常基本的事情。我打开日志并将其设置为详细,有两条特殊消息让我解决了这个错误。

1。错误 (-2): 模块不可用。

现在,这个错误并没有多大帮助,但它为开始解决这个错误提供了一个很好的起点。查了官方文档什么时候抛出这个错误,发现是请求的模块在云端不存在时抛出这个错误。然后有一些解决方案,例如在 Play 商店的内部测试中发布应用程序,或者使用 bundletool,但关键是这些所有解决方案都适用于已配置为 on-demand 而不是 [=12] 的模块=].

2。应用程序中不存在请求的模块。安装 [信用卡()]

现在这个错误让我开始思考未按预期工作的模块之间的模式。所有模块中只有两个模块不工作,并且都有两个词。而正在工作的模块,其名称中只有一个词。所以我检查并发现了错误。我已将模块名称命名为 credit_cards,但到处都使用 credit cards,包括 nav_graphs,这对我来说是错误的来源。