记录一个今天遇到的问题。
现象是app的manifest中虽然有对一个自定义权限的申请,而且这个权限的保护等级是normal的,但在实际运行过程中还是报出app没有获得授权,重启和清除app数据都不起作用,但是重新安装一下app就可以。
问题很蹊跷而且本地无法复现,经过和测试反复沟通发现疑点,测试两次复现都是在手机刚刚通过ota升级后,于是重新摸查了一下整个背景:
应用A中声明了一个自定义权限,权限的保护等级为signatureOrSystem。为了配合新功能,ota升级后的A版本中,将这个权限从signatureOrSystem降为normal,以开放provider给应用B使用,同时B在升级后的版本中,manifest里也加入了对这个权限的申请。
根据官方文档,normal的权限只需在manifest里申请,在应用安装时会自动授予。于是怀疑是在ota过程中,先升级安装了应用B,但这个时候由于应用A还没升级,这个权限还是signatureOrSystem,所以无法获得授权,即使之后升级了应用A将其修改为normal,由于normal权限是在应用安装时才会授予,所以也没用了,只有重新安装一下应用B才能授权。
然后自己验证了一下果然如此,如果先升级安装应用A,即先将该权限从signatureOrSystem修改为normal,再升级安装应用B时,则可以获得授权;如果是先升级安装应用B,再升级安装应用A,则无法获得权限。
结论:声明权限设定权限级别后系统已记录,且OTA升级没有设定覆盖安装应用的顺序,所以才有这种问题出现。
由于这是原生的机制,只要是升级的先后顺序不定,即使是换个新的权限也没法解决这个问题,最后的解决办法是,应用A 重新写了一个不需要权限的provider开放给B使用。
网友评论