Android 重复权限

Android duplicate permission

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

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

它在 Lollipop 之前的设备上运行良好,但在 Lollipop 上,如果我在安装免费版时尝试安装专业版,我会收到 INSTALL_FAILED_DUPLICATE_PERMISSION 错误消息。如果我使用相同的密钥签署两个版本(例如在调试中),它会起作用,但我没有在 Play 商店上,并且无法更改。

那么,有什么解决办法吗,或者 Lollipop 上的权限是否被破坏了??

很可能您的免费和付费应用都已声明如下同名许可。

<permission android:name="com.example.permission" android:label="test_permission" android:protectionLevel="dangerous"></permission>

编辑: 对于您的情况,似乎您应该只声​​明您对免费版本的许可。对于您的付费版本,删除 <permission> 标签并仅保留 <uses-permission> 标签

is there any solution

在你的情况下,你可能可以不用 ,因为有一个明确的安装顺序(很少有人会在安装付费应用后安装免费应用)。

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

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

  • 使用 PackageManager 及其 getPackagesForUid() 查找与 UID 关联的应用程序 ID。你的情况应该只有一个,你可以确认应用程序ID是预期值。

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

are the permissions broken on Lollipop ?

您想要的行为——任何应用程序都可以定义任何其他应用程序的权限——是dreadful from a security standpoint

Such "feature" would also prevent creating / using 3rd party content providers, because if your app is installed first, you need to have the permission's declaration

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

在某些情况下,这可以通过在通常不需要的插件中移植来解决:

  • App A想使用App B发布的provider,但App A可能先安装了

  • 应用程序 A 的作者创建了一个插件 (A'),它具有应用程序 B 的提供者 <uses-permission> 并调解与应用程序 B 的通信

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

  • 当用户试图做一些涉及A与B对话的事情时,如果没有安装插件,则引导用户安装插件

笨拙,但应该可以。