【问题标题】:Dynamic module feature and ML Kit Crash on App open动态模块功能和 ML Kit Crash on App open
【发布时间】:2021-09-10 04:15:34
【问题描述】:

应用具有 ML Kit 功能(翻译)。我试图通过引入动态模块功能,按需加载来减小应用程序的大小。

Following this guide 在基础 apk 的 build.gradle 中添加了“com.google.mlkit:playstore-dynamic-feature-support:16.0.0-beta1”

com.google.mlkit:translate:16.1.2 在功能模块 build.gradle 中,

一切都编译并尝试在模拟器上运行,但不幸的是应用程序以日志启动时崩溃

java.lang.RuntimeException: Unable to get provider com.google.mlkit.common.internal.MlKitInitProvider: com.google.firebase.components.MissingDependencyException: Unsatisfied dependency for component Component<[class com.google.android.gms.internal.mlkit_translate.zzxa]>{0, type=0, deps=[Dependency{anInterface=class com.google.mlkit.common.sdkinternal.SharedPrefManager, type=required, injection=direct}, Dependency{anInterface=class com.google.android.gms.internal.mlkit_translate.zzwx, type=required, injection=direct}]}: class com.google.mlkit.common.sdkinternal.SharedPrefManager

 Caused by: com.google.firebase.components.MissingDependencyException: Unsatisfied dependency for component Component<[class com.google.android.gms.internal.mlkit_translate.zzxa]>{0, type=0, deps=[Dependency{anInterface=class com.google.mlkit.common.sdkinternal.SharedPrefManager, type=required, injection=direct}, Dependency{anInterface=class com.google.android.gms.internal.mlkit_translate.zzwx, type=required, injection=direct}]}: class com.google.mlkit.common.sdkinternal.SharedPrefManager
    

哪种没有意义。因为我添加了 playstore-dynamic-feature-support。

【问题讨论】:

  • 你有解决办法吗?
  • 不,不得不放弃这个想法

标签: android firebase-mlkit google-mlkit dynamic-feature-module


【解决方案1】:

要设置您的动态模块,您需要将 mlkit translate 依赖项从基本应用程序的 gradle 文件移动到动态模块的 gradle 构建文件。您还需要将所有相关用法移至动态模块。因此,当应用程序启动时,它不会寻找任何 mlkit 翻译依赖项。请参阅play store on demand delivery guide 了解逐步设置指导。

【讨论】:

    【解决方案2】:

    想通了

    步骤 1. 在应用模块中禁用 MlKitInitProvider(停止应用崩溃)

    <provider
    android:name="com.google.mlkit.common.internal.MlKitInitProvider"
                android:authorities="${applicationId}.mlkitinitprovider"
                tools:node="remove"
                />
    

    第 2 步。 构建 apk 并打开应用清单,找到应用中使用的所有 MLKit 注册器。 步骤 3。 将所有找到的内容添加到 ComponentRegistrar 数组 ArrayList; 第四步。 在动态特征库中,调用 MlKitContext.initialize(context, arr); (在 getProvider 中的服务提供者)在使用 mlkit 功能之前;

    另外,仅在 app 模块中使用这些 mlkit 依赖项(用于拆分安装) api 组:'com.google.mlkit',名称:'common',版本:'17.5.0' api 组:'com.google.mlkit',名称:'playstore-dynamic-feature-support',版本:'16.0.0-beta1'

    【讨论】:

      【解决方案3】:

      如果有人仍然无法使用@Shane Gallagher 的答案弄清楚,我将详细说明步骤: 首先如前所述,在 app 模块中添加 Provider 以禁用 MlKit 初始化:

      <provider
              android:name="com.google.mlkit.common.internal.MlKitInitProvider"
              android:authorities="${applicationId}.mlkitinitprovider"
              tools:node="remove"/>
      

      接下来构建 apk 并打开您的合并清单。查找您的应用程序中使用的所有组件注册商。打开AndroidManifest.xml后点击Android Studio左下角的合并清单文本即可打开合并清单

      接下来在您的动态功能模块中,根据您应用中使用的注册商添加以下代码

      val registrars = listOf(CommonComponentRegistrar(), VisionCommonRegistrar(), BarcodeRegistrar())
      MlKitContext.initialize(this, registrars)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-25
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-19
        • 1970-01-01
        • 2020-05-06
        相关资源
        最近更新 更多