作为按需功能模块工作的安装时功能模块
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
,这对我来说是错误的来源。
我们目前正在开发我们的产品,因为它在架构上是一个非常大的应用程序,所以我们将我们的应用程序分为功能和库模块。其中一个模块是 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
,这对我来说是错误的来源。