android 解决“应用组件的命名与已安装应用有冲突”问题

1.场景还原:

接到一个需求是:客户要在手机上同时安装正式版和测试版的app;看似很简单,改个包名重新打包就可以。但是在AS上运行时出现Installation failed with message INSTALL_FAILED_CONFLICTING_PROVIDER: Package couldn't be installed in /data/app...的问题,翻译后大概是说与"xxx"存在内容提供者冲突,无法同时安装,建议卸载冲突应用后重试的问题,截图如下:

当时就很奇怪,包名都不一样了,为啥还会安装不了,接着就一顿百度搜索。

2.问题分析:

两个APK中的ContentProvider的authorities值如果一样,Android就默认反馈应用组件命名与已安装应用有冲突,导致同一台设备不能再安装新的应用。因为ContentProvider中authorities是为内容提供者指定的唯一标识,这样别的应用才可以唯一获取此Provider,同时App中自己的ContentProvider中authorities也不能和Android系统的authorities一致。

3.问题解决:

如上图项目中( android:authorities="com.yycd.fileprovider")这种声明方式必定无法同时安装,原博主建议我们使用 “APP英文名+包名+类名”来避免。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android中的ClassLoader命名空间是指在Android应用程序中加载不同组件(如Activity、Service、BroadcastReceiver等)时的类加载环境和隔离机制。在Android中,每个应用程序组件都有自己的ClassLoader实例,用于加载和管理其依赖的类。 ClassLoader命名空间的主要作用是隔离不同应用程序组件之间的类加载,防止类的冲突和污染。每个应用程序组件运行在独立的ClassLoader实例中,这样它们就能够加载和使用自己的类,而不会被其他组件中的类所影响。 ClassLoader命名空间还提供了类加载的灵活性和扩展性。可以通过ClassLoader的机制在不同的ClassLoader实例中加载不同版本的同一个类,从而避免了类的冲突。也可以使用自定义的ClassLoader实现自定义的类加载逻辑,例如从网络等外部来源加载类文件。 Android应用程序中的ClassLoader命名空间是由Android系统提供的ClassLoader框架实现的。在Android中,应用程序组件的ClassLoader实例是基于父类加载器(Parent ClassLoader)进行的,这样可以继承和共享父类加载器加载的类,提高类的加载效率和资源利用率。 总结来说,Android中的ClassLoader命名空间是为了实现应用程序组件之间的类加载隔离和灵活性而设计的,每个应用程序组件都有自己的ClassLoader实例,可以加载和管理自己的类。这种ClassLoader命名空间的设计使得Android应用程序能够在多组件环境下更加稳定和可扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值