Android 应用开发(20)--- 定义自定义应用程序权限

定义自定义应用程序权限

本文档描述应用程序开发人员如何使用Android提供的安全功能来定义他们自己的权限。通过定义自定义权限,应用程序可以与其他应用程序共享其资源和功能。有关权限的更多信息,请参阅权限概述

背景

Android是一个权限分开的操作系统,每个应用程序都以不同的系统标识(Linux用户标识和组标识)运行。系统的一部分也被分为不同的身份。因此,Linux将应用程序与系统隔离开来。

应用可以通过定义其他应用可以请求的权限将其功能展示给其他应用。他们还可以定义自动提供给任何其他使用相同证书签名的应用程序的权限。

应用签名

所有APK必须使用其开发人员拥有私钥的证书进行签名。此证书标识应用的作者。该证书也并不需要由证书颁发机构签署; 对于Android应用程序来说,使用自签名证书是完全可以允许的,并且是典型的。Android中证书的用途是区分应用作者。这允许系统授予或拒绝应用程序访问签名级权限,并授予或拒绝应用程序的请求获得与另一个应用程序相同的Linux身份

用户ID和文件访问权限

在安装时,Android为每个软件包提供独特的Linux用户ID。在该设备的包装寿命期间,身份保持不变。在不同的设备上,同一个软件包可能有不同的UID; 重要的是每个软件包在给定设备上具有不同的UID。

由于安全实施发生在流程级别,因此任何两个软件包的代码通常无法在同一进程中运行,因为它们需要以不同的Linux用户身份运行。您可以使用 每个软件包的 清单标记中 sharedUserId属性为它们分配相同的用户标识。通过这样做,出于安全考虑,这两个软件包将被视为同一个应用程序,并具有相同的用户标识和文件权限。请注意,为了保持安全性,只有两个使用相同签名签名(并请求相同sharedUserId)的应用将被赋予相同的用户ID。AndroidManifest.xml

应用程序存储的任何数据都将被分配该应用程序的用户ID,而其他软件包通常无法访问该ID。

有关Android安全模型的更多信息,请参阅Android安全性概述

定义和执行权限

要强制您自己的权限,您必须首先在您的AndroidManifest.xml一个或多个元素中声明它们 。 <permission>

例如,一个想要控制谁可以启动其某个活动的应用程序可以声明此操作的权限,如下所示:

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.myapp" >
    
    <permission
      android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
      android:label="@string/permlab_deadlyActivity"
      android:description="@string/permdesc_deadlyActivity"
      android:permissionGroup="android.permission-group.COST_MONEY"
      android:protectionLevel="dangerous" />
    ...
</manifest>

注意:除非所有软件包都使用相同的证书签名,否则系统不允许多个软件包声明具有相同名称的权限。如果包声明了权限,则系统不允许用户安装具有相同权限名的其他包,除非这些包使用与第一个包相同的证书进行签名。为避免命名冲突,我们建议为自定义权限使用反向域名风格的命名 com.example.myapp.ENGAGE_HYPERSPACE

 protectionLevel属性是必需的,告诉系统如何向用户通知需要许可的应用程序,或者被允许持有该许可权的用户,如链接文档中所述。

android:permissionGroup 属性是可选的,仅用于帮助系统向用户显示权限。在大多数情况下,您应该将其设置为标准系统组(列在android.Manifest.permission_group)中,但您可以自己定义组最好使用现有组,因为这简化了向用户显示的权限UI。

您需要提供标签和描述权限。这些是用户在查看权限列表()或单个权限(上的详细信息 时可以看到的字符串资源标签应该很短; 用几句话来描述权限所保护的关键功能。描述应该是几个句子,描述许可证允许持有者做什么。我们的约定是一个两个句子的描述:第一个句子描述权限,第二个句子警告用户在应用程序被授予权限时可能出错的类型。 android:label android:description

以下是CALL_PHONE权限标签和说明的示例

<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the app to call
    phone numbers without your intervention. Malicious apps may
    cause unexpected calls on your phone bill. Note that this does not
    allow the app to call emergency numbers.</string>

创建一个权限组

如前一节所示,您可以使用该 android:permissionGroup属性来帮助系统向用户描述权限。在大多数情况下,您会希望将其设置为标准系统组(列于android.Manifest.permission_group),但您也可以使用自定义组<permission-group>

该 <permission-group> 元素为一组权限定义了一个标签 - 这两个权限都是在清单中声明的 <permission> 元素和在别处声明的元素。这仅影响将权限分配给用户时的分组方式。该 <permission-group> 元素没有指定属于该组的权限,但它给该组一个名称。

您可以通过将组名称分配给该<permission> 元素的 permissionGroup 属性来在该组中放置权限 

该 <permission-tree> 元素声明了在代码中定义的一组权限的名称空间。

自定义权限建议

应用可以定义自己的自定义权限,并通过定义<uses-permission>元素从其他应用请求自定义权限但是,您应该仔细评估您的应用是否有必要这样做。

  • 如果您正在设计一系列向对方公开功能的应用程序,请尝试设计应用程序,以便每个权限仅定义一次。如果应用程序未使用相同的证书签名,则必须执行此操作。即使这些应用程序都使用相同的证书进行签名,但最好仅限定一次权限。
  • 如果该功能仅适用于使用与提供应用程序签名相同的签名的应用程序,则可以通过使用签名检查来避免定义自定义权限。当其中一个应用程序向另一个应用程序发出请求时,第二个应用程序可以验证这两个应用程序是否已使用相同的证书进行签名,然后再执行该请求。
  • 如果您正在开发仅在您自己的设备上安装的应用程序,则应开发并安装管理套件中所有应用程序权限的程序包。这个包不需要自己提供任何服务。它只是声明所有权限,而套件中的其他应用程序则使用该元素请求这些权限。 <uses-permission>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值