定义自定义应用程序权限

本文档描述应用程序开发人员如何使用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>

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

<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapp" ><permissionandroid: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 callphone numbers without your intervention. Malicious apps maycause unexpected calls on your phone bill. Note that this does notallow 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>

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

  1. Android软件开发之盘点自定义View界面大合集(二)

    Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个 ...

  2. Android流媒体开发之-直播自定义分类

    1.Android流媒体开发之-直播实现 2.Android流媒体开发之-直播自定义列表 3.Android流媒体开发之-服务器图片的加载 4.Android流媒体开发之-直播自定义分类 5.Andr ...

  3. Android studio开发-单界面单机小程序

    Android studio开发-单界面单机小程序 最终结果展示 步骤: 建立项目 file-new-new project 新建一个项目文件 选择一个empty activity 配置项目名称以及项 ...

  4. Android Studio开发基础之自定义View组件

    一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类.例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一.创建一个继承自an ...

  5. 络达开发---UI定义+自定义按钮事件

    平台:AB1565M SDK版本:V2.11.0 开发环境:windows10 络达的SDK中有默认的参考工程,其中包含默认的按钮的事件定义.这些定义是基于官方的评估板进行设计的.通常用户在开发自己的 ...

  6. CAD二次开发加载自定义模块程序流程

    (1)启动CAD: acad.exe 脚本1 脚本1中通常包含命令内容和顺序 (1)使用CAD自身命令初始化: 初始化CAD的窗口内容和风格,如但文档试图:初始化缩放比例等等: (2)arxload ...

  7. kindle fire1代_如何在Kindle Fire(或任何Android设备)上使用自定义应用程序图标

    kindle fire1代 Unlike Google-supplied Android apps, the apps from the Amazon Apps for Android store h ...

  8. android高德地图自定义地图,(android地图开发) 高德地图自定义对话框

    截图效果: 布局文件: android:layout_width="fill_parent" android:layout_height="fill_parent&quo ...

  9. [Android Studio]开发APP应用出现软件程序打开闪退的排错

最新文章

  1. Linux零基础入学之1-1课程介绍了解RHEL7安装RHEL7
  2. vue在ie9中的兼容问题
  3. mysql查询数据库第一条记录_SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)...
  4. SpringBoot 整合 Redis 哨兵机制_02
  5. python云计算主要是干嘛的_国内python 云计算是干什么的
  6. 201403-1_相反数的个数
  7. Glide-源码分析(三)
  8. 蔚来测开提前批面试(一面)
  9. 【BZOJ2758】Blinker的噩梦,扫描线+splay+链剖
  10. 怎样写 OpenStack Neutron 的 Extension (三)
  11. idea license 20200104
  12. [ERROR CRI]: unable to check if the container runtime at “/var/run/dockershim.sock“
  13. Excel制作抽奖小程序
  14. 上海图书馆e卡通阅读器差强人意
  15. Openlayers GPS(度分秒)和经纬度坐标相互转换
  16. 12.接口测试报告包含哪些内容
  17. Linux下解压分包文件zip(zip/z01/z02)【转】
  18. 力扣 两数相加 C语言 题解
  19. 台式计算机睡眠状态耗电多吗,台式机的休眠状态下还耗电吗?
  20. 两个简单方法--shift()和unshift();

热门文章

  1. [计算机网络] - ping 是如何工作的
  2. 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手
  3. java resultset查询_java – 什么是“查询返回多个ResultSet”的解决方案
  4. 信访问题归并处理_最高法判例:行政机关以信访形式处理履行法定职责问题的起诉期限...
  5. 力扣868. 二进制间距
  6. 使用maven-war-plugin 打包时排除不需要的文件
  7. ubuntu 下pip3 与pipenv 安装使用错误
  8. smarty变量调节器
  9. 20140617 数组和链表的区别
  10. MSP430学习笔记2---两个LED同时亮灭和顺闪