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对话的事情时,如果没有安装插件,则引导用户安装插件
笨拙,但应该可以。
我有一个应用程序有免费版和专业版。专业版提出了一个迁移助手,可以在用户使用免费后购买专业版时将数据从免费版导入专业版。
我添加了自定义权限来保护免费版数据。两个版本都有在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对话的事情时,如果没有安装插件,则引导用户安装插件
笨拙,但应该可以。