用于动态功能交付(包括contentProvider)的Android应用包可能会失败

时间:2019-07-10 15:55:30

标签: android-contentprovider android-app-bundle

如果使用以下参数,尝试使用新的应用程序捆绑包格式发布新应用程序(它是启动器,也很重要)可能很棘手: -使用应用程序包aab发布格式 -使用动态功能交付(按需提供功能) -功能模块在子库中包含contentProvider

引起了几个问题: 1.由于找不到类问题,因此无法在模块中启用contentProvider,应在主清单中将其禁用,然后在下载了动态功能并且可用于主应用程序后以编程方式启用它。

  1. 如果我们使用SplitCompatInstall,该功能可以很好地下载,但实际上它是第一个模拟的,没有安装,这会导致下一个问题。

  2. 如果应用需要重新启动,因为contentProvider已通过编程方式启用,并且由于已持久存在,因此它将尝试重新启动。失败是因为尚未安装动态功能-实际上已通过SplitCompat.install()重新安装-因此类加载器无法找到相应的类,并且应用程序崩溃。

  3. 如果该应用是启动器,且该启动器会自动由系统重新启动,则会出现崩溃循环!

因此对于这种特殊情况,我建议不要使用SplitCompat.install 优先使用deferredInstall()下载功能apks,然后通过android play.core发布任务进行正确安装。 这种策略的缺点是您无法控制何时安装应用程序功能。您可能需要等待您的应用程序在后台运行,以便使用新功能进行安装。 如果您的应用程序是一个始终具有运行线程的启动器,那么即使重启,它也可能永远不会发生(我所看到的)。 最终,当您通过Playstore对应用进行udp处理时,它最终会安装所有动态功能apk(以及相关组件,例如contentProvider)

我愿意讨论这个主题

启用,禁用contentProvider:

        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);
    }```

0 个答案:

没有答案