首页 > 解决方案 > 用于动态功能交付(包括 contentProvider)的 Android 应用程序包可能会失败

问题描述

如果我们有以下参数,尝试使用新的 App Bundle 格式发布一个新的应用程序(它是一个启动器,它也很重要)可能会很棘手:

这种方法导致了几个问题:

  1. 由于类未找到问题,ContentProvider模块中的 无法启用,它应该在主清单中禁用,然后在下载动态功能并且可用于主应用程序时以编程方式启用。

  2. 如果我们使用SplitCompatInstall,该功能可以很好地下载,但实际上它被模拟为第一个并且没有安装导致下一个问题

  3. 如果应用程序需要重新启动,因为 contentProvider 已经以编程方式启用,并且由于它是持久的,它会尝试重新启动。失败是因为尚未安装动态功能 - 实际上是重新安装SplitCompat.install()- 所以类加载器找不到相应的类并且应用程序崩溃。

  4. 如果应用程序是一个启动器,它会被系统自动重启,有一个崩溃循环!

因此,对于这种特殊情况,我建议不要使用SplitCompat.install Prefer using deferredInstall()which download the feature apks,然后发布一个任务以供 android play.core 正确安装。

此策略的缺点是您无法控制何时安装应用程序功能。您可能必须等待您的应用程序进入后台,以便安装新功能。

如果您的应用程序是一个始终有一个正在运行的线程的启动器,它可能永远不会发生,即使在重新启动时(我所看到的)。最后,当您通过 Playstore 更新您的应用程序时,它最终会安装所有动态功能 apk(以及相关组件,如ContentProvider

我愿意讨论这个话题

启用或禁用 a 的代码ContentProvider

    public static void enableMyProviderForDynamicFeature(final Context context, final boolean enable) {
        Log.d("DebugDynamicFeature", "com.duapps.ad.stats.MyProvider"+ (enable?" enabling":" disabling"));
        final ComponentName componentName = new ComponentName(context, "com.duapps.ad.stats.MyProvider");
        final PackageManager packageManager = context.getPackageManager();
        packageManager.setComponentEnabledSetting(componentName, enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    }

标签: android-contentproviderandroid-app-bundle

解决方案


推荐阅读