【问题标题】:Android duplicate permissionAndroid重复权限
【发布时间】:2015-09-08 13:47:26
【问题描述】:

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

我添加了一个自定义权限来保护免费版本数据。两个版本都在其清单中声明了权限,并且只有专业版具有使用权限。

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

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

【问题讨论】:

  • IIRC 这是一项安全功能,可防止应用声明使用不同签名签名的相同自定义权限
  • 这样的“功能”也会阻止创建/使用 3rd 方内容提供者,因为如果你的应用是先安装的,你需要有权限声明:/ ...

标签: android permissions duplicates android-5.0-lollipop


【解决方案1】:

有什么解决办法

在您的情况下,您可能可以摆脱Derek Fung's approach,因为有明确的安装顺序(很少有人会在安装付费应用后安装免费应用)。

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

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

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

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

Lollipop 的权限是否被破坏?

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

这样的“功能”也会阻止创建/使用 3rd 方内容提供者,因为如果你的应用是先安装的,你需要有权限声明

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

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

  • 应用 A 想使用应用 B 发布的提供程序,但可能会先安装应用 A

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

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

  • 当用户尝试做某事涉及A与B对话时,如果未安装插件,则引导用户安装插件

笨拙,但应该可以。

【讨论】:

  • 谢谢,看来我会使用 SignatureUtils(再次强调,我已经在使用它了,谢谢!)。链接很有趣!
【解决方案2】:

您的免费和付费应用都可能已声明同名权限,如下所示。

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

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

【讨论】:

  • 是的,不是吗?如果他们没有相同的名字,他们就是两个不同的权限,对吧?
  • 回答您的编辑:它需要首先安装免费版本。应该是这样,但不确定。在另一种情况下,这是行不通的:例如在创建第 3 方内容提供者时(我也在这样做)。
  • @CommonsWare 解释得比我详细,你应该看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2018-09-22
  • 1970-01-01
  • 2017-01-15
  • 2019-08-05
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多