Android重复权限

Tim*_*tin 2 permissions android duplicates android-5.0-lollipop

我有一个免费和专业版的应用程序.专业版提出了一个迁移助手,当用户在使用免费后购买专业版时,可以将数据从免费版导入专业版.

我添加了自定义权限来保护免费版本数据.两个版本都在其清单中声明了权限,只有专业版具有uses-permission.

它适用于Lollipop之前的设备,但是在Lollipop上,如果我在安装free时尝试安装专业版,我会收到一条INSTALL_FAILED_DUPLICATE_PERMISSION错误消息.如果我使用相同的密钥签署两个版本(例如在调试中),它可以工作,但我没有在Play商店中,并且它无法更改.

那么,有没有解决方案,还是Lollipop上的权限被打破?

Com*_*are 6

有什么办法吗?

在你的情况下,你可以通过Derek Fung的方法逃脱,因为有一个明确的安装顺序(很少,如果有的话,人们将在安装付费应用程序后安装免费应用程序).

或者,您可以跳过权限,因为在这种情况下,有两个应用程序需要相互通信.您知道这些应用程序是什么,并且您知道他们的签名密钥.作为IPC工作的一部分,执行您自己的验证:

  • 使用Binder.getCallingUid()以获取调用应用程序的UID.

  • 使用PackageManager和它getPackagesForUid()来查找与UID关联的应用程序ID.在您的情况下,应该只有一个,您可以确认应用程序ID是预期值.

  • 使用我的SignatureUtils(或只是获取它的代码)来验证调用应用程序的签名密钥是否与期望值匹配.

是Lollipop打破的权限?

从安全的角度来看,您想要的行为 - 任何应用程序都可以定义任何其他应用程序的权限 - 都是可怕的.

此类"功能"还会阻止创建/使用第三方内容提供商,因为如果您的应用首先安装,则需要获得权限声明

自定义权限适用于有明确安装顺序的情况(例如,预安装的应用程序,主机和插件).自定义权限不适合对等场景,其中安装顺序未预先确定.

在某些情况下,这可以通过在通常不需要它们的插件中进行嫁接来解决:

  • App A希望使用App B发布的提供程序,但可能首先安装App A.

  • App A的作者创建了一个插件(A'),其中包含<uses-permission>for App B的提供者并调解与App B的通信

  • 安装A'时,应用A在A'上调用某些内容(例如,向特定组件发送广播),因此A'可以在A'之前验证App A和App B是否已安装

  • 当用户尝试执行涉及A与B交谈的操作时,如果未安装插件,请引导用户安装插件

笨重,但它应该工作.