动态模块功能和ML Kit在应用程序打开时崩溃

4

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

遵循此指南,在基础apk的 build.gradle 中添加了 'com.google.mlkit:playstore-dynamic-feature-support:16.0.0-beta1'

在特性模块 build.gradle 中添加了'com.google.mlkit:translate:16.1.2',一切都编译并尝试在模拟器上运行,但不幸的是,在应用启动时崩溃并记录日志:

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。


你有找到任何解决方案吗? - Tushar Saha
不,必须放弃这个想法。 - toasty
3个回答

5

已找到解决方法,

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

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

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

此外,仅在应用程序模块中使用这些mlkit依赖项(用于拆分安装) api group: 'com.google.mlkit',name: 'common',version: '17.5.0' api group: 'com.google.mlkit',name: 'playstore-dynamic-feature-support',version: '16.0.0-beta1'


4

如果有人仍然无法理解@Shane Gallagher的答案,我将详细说明步骤: 首先,如上所述,在应用程序模块中添加Provider以禁用MlKit初始化:

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

请构建APK并打开合并的清单。查找应用程序中使用的所有组件注册器。在打开AndroidManifest.xml后,在Android Studio左下角单击合并清单文本即可打开合并的清单。 image for reference 接下来,在您的动态特性模块中添加以下代码,根据应用程序中使用的注册器来添加。
val registrars = listOf(CommonComponentRegistrar(), VisionCommonRegistrar(), BarcodeRegistrar())
MlKitContext.initialize(this, registrars)

只是好奇,如果您从应用程序的gradle文件中删除所有mlkit依赖项,除了com.google.mlkit:playstore-dynamic-feature-support,而不禁用MlKit初始化,它是否能正常工作。 - zhouyi
1
不行,我之前尝试过了,它仍然会崩溃,文档对此也不是很清楚。 - sanket vetkoli
你能按照这些说明在本地重现它吗?https://developer.android.com/guide/playcore/feature-delivery/on-demand#local-testing - zhouyi
重现是指哪一部分?动态交付部分还是失败部分?由于没有暴露API以防止重新初始化并且当MLKit再次初始化时会引发异常,我不得不放弃这个想法。 - sanket vetkoli

1
为了设置您的动态模块,您需要将 mlkit translate 依赖从基本应用程序的 gradle 文件移动到动态模块的 gradle 构建文件中。您还需要将所有相关使用移动到动态模块中。因此,当应用程序启动时,它不会查找任何 mlkit 翻译依赖项。请参考Play Store 按需交付指南以获取逐步设置指南。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接