Android中由于ContentProvider导致的“应用组件的命名与已安装应用有冲突”问题
起因
- 情况是这样子的我刚到公司上班,还没有来得及熟悉代码,公司就需要给一个客户(销售代理)公司定做对外宣传App,就是将公司的App修改UI,然后以他们公司名义上线,用于销售宣传,于是呼就修改包名、修改UI、简单的自测之后就被催促着匆匆打包上线了。
- 结果客户说一个Android手机上不能同时安装我们App和给他们修改后的App,当时一直没搞明白是什么鬼(以为是so库是问题,公司有个自己编译视频通信so文件),技术老大同样以为是so库问题,就说过些天解决,然后就没有然后了。
- 很快就一年了,客户忽然又想起来让解决这个问题,这个时候我就知道是上层apk问题了,于是各种百度,可想而知基本上都是各种包名类名之类玩意。
经过
在手机安装我们apk之后再去应用商店下载客户定制的apk就是下面这个情况了
(备注:华为手机所以提示去华为应用商店下载了);
- 第一次看到这个玩意第一时间想到的是包名问题了
【开发中最为常见安装失败缘由】
,这个又是首先可以排除的,又想到了签名文件密码那些玩意了, 想到Android中apk识别问题将像 [ apk唯一识别自己的标志是什么 ]- 其实错误提示里已经有
“应用组件”
字眼了,但事当时不知道为什么脑子一直发瓜了,哎……- 刚开始也是各种FAQ和百度,结果发现都不是问题所在,当然其中少不了各种折腾啦……
- 各种折腾之后再一个群里的大佬最后在一个群里有大佬问我是不是用到
ContentProvider
看一下两个apk中ContentProvider
的authorities
是不是没有做修改,因为是接手别人的项目而且数据库那一块就是升级而已,所以我只知道在哪使用到ContentProvider
但是一直没有仔细去研究,赶紧去一瞅原来是这个玩意坏了大事;
结果
- 最后在一个群里有大佬问我是不是用到
ContentProvider
看一下两个apk中ContentProvider
的authorities
是不是没有做修改,因为是接手别人的项目而且数据库那一块就是升级而已,所以我知道在哪使用到ContentProvider但是一直没有仔细去研究,赶紧去一瞅原来是这个玩意坏了大事。- 在Android中
ContentProvider
中authorities
就是为内容提供者指定一个唯一的标识
,这样其他的应用才可以准确获取唯一的Provider,进行数据共享;- 同时App的
ContentProvider
中authorities
也不能和Android系统
的authorities
一致;- 我的问题是之前的Android在开发中用了一个开源的jar,来实现ContentProvider和触发器来监听App中部分数据的变化,并且在代码中设置的
authorities
,当初我又匆匆忙忙的改完包名和部分配置文件就上线了,因为两个Apk的ContentProvider
中authorities
一致的结果导致Android系统
无法分辨,然后反馈应用组件的命名与已安装应用有冲突
,使得同一个Android系统中不能再安装新的apk;- 最后建议以后开发中为了避免和其他App、SDK中ContentProvider的authorities雷同,建议采用
APP英文名+包名+类名
来避免!小伙伴引以为戒啊