android-contentprovider - 用于动态功能交付(包括 contentProvider)的 Android 应用程序包可能会失败
问题描述
如果我们有以下参数,尝试使用新的 App Bundle 格式发布一个新的应用程序(它是一个启动器,它也很重要)可能会很棘手:
- 使用 app bundle aab 发布格式
- 使用动态功能交付(按需交付)
- 功能模块包括
ContentProvider
一个子库
这种方法导致了几个问题:
由于类未找到问题,
ContentProvider
模块中的 无法启用,它应该在主清单中禁用,然后在下载动态功能并且可用于主应用程序时以编程方式启用。如果我们使用
SplitCompatInstall
,该功能可以很好地下载,但实际上它被模拟为第一个并且没有安装导致下一个问题如果应用程序需要重新启动,因为 contentProvider 已经以编程方式启用,并且由于它是持久的,它会尝试重新启动。失败是因为尚未安装动态功能 - 实际上是重新安装
SplitCompat.install()
- 所以类加载器找不到相应的类并且应用程序崩溃。如果应用程序是一个启动器,它会被系统自动重启,有一个崩溃循环!
因此,对于这种特殊情况,我建议不要使用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 - Flutter 在调试模式下比发布时更快
- pandas - Pandas CSV 文件可视化 | 推文发帖频率
- mysql - 根据值列在mysql中排序的2种不同方式
- php - PHP MongoDB 游标计数不再起作用
- reactjs - 无法有条件地渲染子组件:无法读取未定义的属性“地图”
- angular - 导航栏折叠类在引导程序中不起作用
- twilio - AWS Cognito SSO 与 Twilio Flex 的集成
- git - 取消忽略父存储库中子存储库忽略的文件
- python - 如何使用Python将excel文件数据动态转换为json文件
- tomcat - 在tomcat上部署grpc jar